一、DQL
DQL(Data Query Language) 数据查询语言,用来查询数据库中表的记录(数据)。
1.1、去除重复记录(DISTINCT)
SELECT DISTINCT 字段列表 FROM 表名;
查询xxl_job_group表中app_name和title字段的值并去重,
select distinct app_name,title
from xxl_job_group;
注意:这个查询出来的结果,只有当app_name、title完全一样才会去重。下面的结果就不会去重。
1.2 、起别名(AS)
AS 也可以省略
查询姓名、数学成绩、英语成绩。并通过as给math和english起别名(as关键字可以省略)
select name,math 数学成绩,english 英文成绩 from stu;
1.3、条件列表中的运算符
注意:null值的比较不能使用 = 或者 !=,需要使用 is 或者 is not
1.4、模糊查询(注意:%要在单引号里面)
(1)_ : 代表单个任意字符
(2)% : 代表任意个数字符
1.4.1、查询姓'马'的学员信息(名字由马开头的)
select * from stu where name like '马%';
1.4.2、查询姓名中包含'马',且不是第一个字开头的
select * from stu where name like '%马';
1.4.3、查询姓名中包含 '马' 的学员信息
select * from stu where name like '%马%';
1.4.4、查询第二个字是'花'的学员信息
select * from stu where name like '_花%';
1.5、排序查询
SELECT 字段列表 FROM 表名 ORDER BY 排序字段名1 [排序方式1],排序字段名2 [排序方式2] …;
ASC : 升序排列 (默认值)
DESC : 降序排列
查询学生信息,按照数学成绩降序排列,如果数学成绩一样,再按照英语成绩升序排列
select * from stu order by math desc , english asc ;
1.6、聚合函数
注意:null 值不参与所有聚合函数运算
统计班级一共有多少个学生
select count(id) from stu;
上面语句根据某个字段进行统计,如果该字段某一行的值为null的话,将不会被统计。所以可以在count(*) 来实现。* 表示所有字段数据,一行中也不可能所有的数据都为null,所以建议使用 count(*)
1.7、分组查询
SELECT 字段列表 FROM 表名 [WHERE 分组前条件限定] GROUP BY 分组字段名 [HAVING 分组后条件过滤];
注意:分组之后,查询的字段为聚合函数和分组字段,查询其他字段无任何意义
表中的数据为
下面的sql语句中查询name就毫无意义:
select name, sex, avg(math) from stu group by sex;
得到查询出结果:
我们发现查询出来的name为好伟大和卢本伟,这个对应的是sex为女和男时的第一个数据。
也就是说查询的字段不是聚合函数也不是分组字段,那么查询出来的结果就是这个字段对应的第一笔数据,没有任何意义。
查询男同学和女同学各自的数学平均分,以及各自人数,要求:分数低于70分的不参与分组,分组之后人数大于2个的
select sex, avg(math),count(*) from stu where math > 70 group by sex having count(*) > 2;
where 和 having 区别:
执行时机不一样:where 是分组之前进行限定,不满足where条件,则不参与分组,而having是分组之后对结果进行过滤。
可判断的条件不一样:where 不能对聚合函数进行判断,having 可以。
1.8、limit的用法
select * from t_user limit 5;
从第一条开始取5条数据
Limit还有分页查询等用法,这里不做详细介绍。
分页查询 limit 是MySQL数据库的方言
Oracle 分页查询使用 rownum
SQL Server分页查询使用 top
总结:
查询SQL的书写顺序:
select-> from->where->group by->having->order by->limit