MySQL学习记录

sql简介

英文: Structured Query Language,简称SQL
结构化查询语言,一门操作关系型数据库的编程语言
定义操作所有关系型数据库的统一标准
对于同一个需求,每一种数据库操作的方式可能会存在-一些不一样的地方, 我们称为“方言”

sql通用语法

1、SQL语句可以单行或多行书写,以分号结尾

2、MySQL数据库的SQL语句不区分大小写,关键字建议使用大写

3、注释

单行注释:-- 注释内容 或#注释内容(MySQL特有)

多行注释:/*注释内容*/

sql分类

DDL(Data Definition Language)数据定义语言,用来定义数据库对象:数据库,表,列等
DML(Data Manipulation Language)数据操作语言,用来对数据库中表的数据进行增删改
DQL(Data Query Language)数据查询语言,用来查询数据库中表的记录(数据)
DCL(Data Control Language)数据控制语言,用来定义数据库的访问权限和安全级别,及创建用户
 

简单的说就是

DDL:操作数据库,表等

DML:对表中的数据进行增删改

DQL:对表中的数据进行查询

DCL:对数据库进行权限控制

DDL

操作数据库

查询全部数据库名称

show databases;

创建数据库(一般使用第二种)

create database 数据库名称; -- 创建数据库,如果数据库存在,会报错
create database if not exists 数据库名称; -- 如果数据库存在会报错,一般先判断数据库是否存在,如果不存在就创建

删除数据库(一般使用第二种)

drop database 数据库名称;-- 直接删除数据库,如果数据库不存在,会报错
drop database if exists 数据库名称; -- 判断数据库是否存在,如果存在就删除,如果数据库不存在,不会报错

使用数据库

use 数据库名称;

查看当前使用的数据库

select database();

操作表

查询表

查询当前数据库中所有表名称

show tables;

查询当前表的整体结构

desc 表名称;

创建表

create table 表名(
    字段名称1  数据类型1,
    字段名称2  数据类型2,
    ……
    字段名称n  数据类型n

);  -- 最后一行数据后没有,

create table tb_user(
    id int;
    username varchar(20),
    password varchar(20)
);

 

数据类型一览表 

删除表

drop table 表名; -- 直接删除表,如果表不存在会报错
drop table if exists 表名;-- 删除表时判断表是否存在,如果存在就删除,不存在也不会报错

修改表

修改表名

alter table 表名 rename to 新表名;

添加一列

alter table 表名 add 列名 数据类型;

修改数据类型

alter table 表名 modify 列名 新数据类型;

修改列名和数据类型

alter table 表名 change 列名 新列名 新数据类型;

删除列

alter table 表名 drop 列名;

DML添加修改删除表数据

添加数据

给指定列添加数据

insert into 表名(列名1,列名2,...列名n) values (值1, 值2,...值n); -- 列名和值需要一一对应

给所有列添加数据

insert into 表名 values(值1,值2,...值n); -- 有多少列,就需要多少值

批量添加

insert into 
表名(列名1,列名2...)
values(值1,值2...),(值1,值2...),(值1,值2...)...;

修改数据

update 表名 set 列名1 = 值1,列名2 = 值2....[where 条件] -- 如果update语句没有加where条件,则会将表中所有数据都修改

删除数据

delete from 表名 [where 条件] -- 如果delete语句中没有加where条件,则会将表中的数据都删除

DQL

首先创建学生表,然后再进行下一步操作

-- 新建数据库
create database if not exists db;

-- 使用数据库
use db;


-- 删除stu表
drop table if exists stu;


-- 创建stu表
CREATE TABLE stu (
 id int, -- 编号
 name varchar(20), -- 姓名
 age int, -- 年龄
 sex varchar(5), -- 性别
 address varchar(100), -- 地址
 math double(5,2), -- 数学成绩
 english double(5,2), -- 英语成绩
 hire_date date -- 入学时间
);

-- 添加数据
INSERT INTO stu(id,NAME,age,sex,address,math,english,hire_date) 
VALUES 
(1,'马运',55,'男','杭州',66,78,'1995-09-01'),
(2,'马花疼',45,'女','深圳',98,87,'1998-09-01'),
(3,'马斯克',55,'男','香港',56,77,'1999-09-02'),
(4,'柳白',20,'女','湖南',76,65,'1997-09-05'),
(5,'柳青',20,'男','湖南',86,NULL,'1998-09-01'),
(6,'刘德花',57,'男','香港',99,99,'1998-09-01'),
(7,'张学右',22,'女','香港',99,99,'1998-09-01'),
(8,'德玛西亚',18,'男','南京',56,65,'1994-09-02');

Select
	字段列表
From
	表名列表
Where
	条件列表
Group by
	分组列表
Having
	分组后条件
Order by
	排序字段
Limit
	分页限定

基础查询

查询全部

select * from stu; 
-- 查询全部 *代表了全部关键字,但是真正使用时会将*更换为各个字段名称,效率更高


select distinct 字段名 from 表名; 
-- 去除重复数据,关键字distinct


select 字段名称1 as 别名1, 字段名称2 as 别名2  from 表名; 
-- 起别名使用as关键字,或者用一个空格隔开

条件查询

使用一个一个的例子来熟悉这一用法

基础语法:select 字段列表 from 表名称 where 条件;

-- 查询年龄大于20岁的信息
Select * from stu where age > 20;


-- 查询年龄大于等于20岁的信息
select * from stu where age >= 20;


-- 查询年龄大于等于20岁并且年龄小于等于30岁的学员信息的信息
-- 并且一般不使用&& 而使用and,同理,或者一般使用or;
-- between and 包含边界
select * from stu where age >= 20 && age<=30;
select * from stu where age >= 20 and age<=30;
select * from stu where age between 20 and 30;


-- 查询入学日期在1998-09-01到1999-09-01之间的学员
select * from stu where hire_date between 1998-09-01 and 1999-09-01;


-- 查询年龄等于18岁的学员
select * from stu where age = 18;


-- 查询年龄不等于18岁的学员
-- 不等于可以使用!= 也可使用<>来表示
select * from stu where age != 18;
select * from stu where age  <> 18;


-- 查询年龄等于18或者20或者22岁
select * from stu where age =18 or age = 20 or age = 22;
select * from stu where age in (18,20,22);


-- 查询英语成绩为null的学员信息
-- Null值的比较不能使用  = null 或者 != null,需要使用is null或者is not null
select *from stu where English is not null; 


-- 模胡查询;通配符:	_单个任意字符 	%代表任意字符
-- 查询姓马的学员
Select * from stu where name like ‘马%’;


-- 查询第二个字是花的学员
Select * from stu where name like ‘_花%’;


-- 查询包含德的学员信息
Select * from stu where name like ‘%德%’;

排序查询

语法

select

        字段名称

from 表名 [where 条件]

        order by

排序字段1[排序规则1],排序字段2[排序规则2]....

排序规则:

        ASC:升序排序(默认!!!

        DESC:降序规则

如果有多个排序条件,当前面的条件值一样时,才会根据第二条件进行排序

按照年龄的升序排序

select * from stu order by age asc;

 按照数学成绩降序排序

select * from stu order by math desc;

 按照数学成绩降序排列,如果数学成绩一样,再按照英语成绩升序排列

select * from stu order by math asc, english desc;

 聚合函数

聚合函数:将一列作为一个整体,进行纵向计算,null值不参与聚合函数的运算

count(列名),返回的结果集中的行数,统计的列名不能为空,一般取主键或者*

-- 统计班级一共有多少学生
select count(id) from stu;

  

Max(列名),返回当前列的最大值

-- 查询数学成绩的最高分
select max(math) from stu;

有关min 最小值 sum 总数 avg 平均就不一一介绍了

练习题可以参考一下

-- Min
-- 查询数学成绩的最低分
Select min(math) from stu;


-- Sum
-- 查询数学成绩的总分
Select sum(math) from stu;


-- Avg
-- 查询数学成绩的平均分
Select avg(math) from stu;

分组查询

基础语法

select

        字段列表

from

        表名 [where 分组之前的条件限定]

group by

        分组字段名称 [having 分组之后的条件过滤];

注意:分组之后,查询的字段为聚合函数和分组字段,查询其他字段无意义

执行顺序:where > 聚合函数 > having

Where 和having的区别

 (1) 执行时机不一样:where是分组之前限定,不满足where条件,则不参与分组,而having是分组之后对结果进行过滤

 (2)可判断的条件不一样;where 不能对聚合函数进行判断,having可以

-- 查询男女同学各自数学平均分
Select sex, avg(math) from stu  group by sex;


-- 查询男女同学各自数学平均分,以及各自人数
Select sex, avg(math), count(*) from stu  group by sex;


-- 查询男女同学各自数学平均分,以及各自人数:要求低于70分的不参与分组
Select sex, avg(math), count(*) from stu where math>=70  group by sex;


-- 查询男女同学各自数学平均分,以及各自人数:要求低于70分的不参与分组,分组之后的人数大于2
Select sex, avg(math), count(*) from stu where math>=70  group by sex having count(*)>2;

分页查询

基础语法:

select 字段列表 

from 表名

limit 起始索引,每页显示的条目;

起始索引从0开始

起始索引 =(当前页码-1)*每页显示的条数

-- 从0开始查询,查询3条数据
Select * from stu limit 0, 3;



-- 每页显示3条数据,查询第1页数据
Select * from stu limit 0, 3;



-- 每页显示3条数据,查询第2页数据
Select * from stu limit 3, 3;



-- 每页显示3条数据,查询第3页数据
Select * from stu limit 6, 3;

注意:

分页查询limit是MySQL数据库的方言

Oracle分页查询使用rownumber

SQL Server分页查询使用top

推荐:

学完了单表的查询,来试着做几个题练一练?(来源于力扣

176. 第二高的薪水 - 力扣(LeetCode)

595. 大的国家 - 力扣(LeetCode)

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值