数据查询语法(DQL)
DQL就是数据查询语言,数据库执行DQL语句不会对数据进行改变,而是让数据库发送结果集给客户端。
语法: SELECTselection_list /*要查询的列名称*/ FROM table_list /*要查询的表名称*/ WHERE condition /*行条件*/ GROUP BY grouping_columns /*对结果分组*/ HAVING condition /*分组后的行条件*/ ORDER BY sorting_columns /*对结果分组*/ LIMIT offset_start, row_count /*结果限定*/ 1 基础查询1.1 查询所有列 SELECT* FROM stu; 1.2 查询指定列 SELECTsid, sname, age FROM stu; 2 条件查询2.1 条件查询介绍 条件查询就是在查询时给出WHERE子句,在WHERE子句中可以使用如下运算符及关键字: l =、!=、<>、<、<=、>、>=; l BETWEEN…AND; l IN(set); l IS NULL; l AND; l OR; l NOT;
2.2 查询性别为女,并且年龄50的记录 SELECT * FROM stu WHEREgender='female' AND ge<50;
2.3 查询学号为S_1001,或者姓名为liSi的记录 SELECT * FROM stu WHERE sid ='S_1001' ORsname='liSi'; 2.4查询学号为S_1001,S_1002,S_1003的记录 SELECT * FROM stu WHERE sid IN('S_1001','S_1002','S_1003'); 2.5 查询学号不是S_1001,S_1002,S_1003的记录 SELECT * FROM tab_student WHERE s_number NOT IN ('S_1001','S_1002','S_1003'); 2.6 查询年龄为null的记录 SELECT * FROM stu WHERE age IS NULL; 2.7 查询年龄在20到40之间的学生记录 SELECT * FROM stu WHERE age>=20 AND age<=40; 2.8 查询性别非男的学生记录 SELECT * FROM stu WHERE gender!='male'; WHERE NOT gender='male'; 2.9 查询姓名不为null的学生记录 SELECT * FROM stu WHERE NOT sname IS NULL; 3 模糊查询3.1 查询姓名由5个字母构成的学生记录 SELECT * FROM stu WHERE sname LIKE '_____'; 模糊查询必须使用LIKE关键字。其中 “_”匹配任意一个字母,5个“_”表示5个任意字母。
3.2 查询姓名由5个字母构成,并且第5个字母为“i”的学生记录 SELECT * FROM stu WHERE sname LIKE '____i'; 3.3 查询姓名以“z”开头的学生记录 SELECT * FROM stu WHERE sname LIKE 'z%'; 其中“%”匹配0~n个任何字母。 3.4 查询姓名中第2个字母为“i”的学生记录 SELECT * FROM stu WHERE sname LIKE '_i%'; 3.5 查询姓名中包含“a”字母的学生记录 SELECT * FROM stu WHERE sname LIKE '%a%'; 4 字段控制查询4.1 去除重复记录 去除重复记录(两行或两行以上记录中系列的上的数据都相同),例如emp表中sal字段就存在相同的记录。当只查询emp表的sal字段时,那么会出现重复记录,那么想去除重复记录,需要使用DISTINCT: SELECT DISTINCT sal FROM emp; 5 排序5.1 查询所有学生记录,按年龄升序排序 SELECT * FROM stu ORDER BY sage ASC; 5.2 查询所有学生记录,按年龄降序排序 SELECT * FROM stu ORDER BY age DESC; 5.3 查询所有雇员,按月薪降序排序,如果月薪相同时,按编号升序排序 SELECT * FROM emp ORDER BY sal DESC,empno ASC; 6 聚合函数6.1 COUNT 当需要纵向统计时可以使用COUNT()。 l 查询emp表中记录数: SELECT COUNT(*) AS cnt FROM emp;
6.2 SUM和AVG 当需要纵向求和时使用sum()函数。 l 查询所有雇员月薪和: SELECT SUM(sal) FROM emp;
或者 SELECT AVG(sal) FROM emp;
6.3 MAX和MIN l 查询最高工资和最低工资: SELECT MAX(sal), MIN(sal) FROMemp;
7 分组查询
当需要分组查询时需要使用GROUP BY子句,例如查询每个部门的工资和,这说明要使用部分来分组。
7.1 分组查询 l 查询每个部门的部门编号和每个部门的工资和: SELECT deptno, SUM(sal) FROM emp GROUP BY deptno;
l 查询每个部门的部门编号以及每个部门的人数: SELECT deptno,COUNT(*) FROM emp GROUP BY deptno;
l 查询每个部门的部门编号以及每个部门工资大于1500的人数: SELECT deptno,COUNT(*) FROM emp WHERE sal>1500 GROUP BY deptno;
7.2 HAVING子句 l 查询工资总和大于9000的部门编号以及工资和: SELECT deptno, SUM(sal) FROM emp GROUP BY deptno HAVING SUM(sal) > 9000;
注意,WHERE是对分组前记录的条件,如果某行记录没有满足WHERE子句的条件,那么这行记录不会参加分组;而HAVING是对分组后数据的约束。
8 LIMITLIMIT用来限定查询结果的起始行,以及总行数。
8.1 查询5行记录,起始行从0开始 SELECT * FROM emp LIMIT 0, 5;
注意,起始行从0开始,即第一行开始!
8.2 查询10行记录,起始行从3开始 SELECT* FROM emp LIMIT 3, 10;
8.3 分页查询 如果一页记录为10条,希望查看第3页记录应该怎么查呢? l 第一页记录起始行为0,一共查询10行; l 第二页记录起始行为10,一共查询10行; l 第三页记录起始行为20,一共查询10行;
多表查询多表查询有如下几种: l 合并结果集; l 连接查询 Ø 内连接 Ø 外连接 ² 左外连接 ² 右外连接 ² 全外连接(MySQL不支持) Ø 自然连接 l 子查询
1 合并结果集1. 作用:合并结果集就是把两个select语句的查询结果合并到一起! 2. 合并结果集有两种方式: l UNION:去除重复记录,例如:SELECT * FROM t1 UNION SELECT * FROM t2; l UNION ALL:不去除重复记录,例如:SELECT * FROM t1 UNION ALL SELECT * FROM t2。
3. 要求:被合并的两个结果:列数、列类型必须相同。 2.1 内连接 上面的连接语句就是内连接,但它不是SQL标准中的查询方式,可以理解为方言!SQL标准的内连接为:
内连接的特点:查询结果必须满足条件。例如我们向emp表中插入一条记录: 其中deptno为50,而在dept表中只有10、20、30、40部门,那么上面的查询结果中就不会出现“张三”这条记录,因为它不能满足e.deptno=d.deptno这个条件。
2.2 外连接(左连接、右连接) 外连接的特点:查询出的结果存在不满足条件的可能。 左连接:
左连接是先查询出左表(即以左表为主),然后查询右表,右表中满足条件的显示出来,不满足条件的显示NULL。 这么说你可能不太明白,我们还是用上面的例子来说明。其中emp表中“张三”这条记录中,部门编号为50,而dept表中不存在部门编号为50的记录,所以“张三”这条记录,不能满足e.deptno=d.deptno这条件。但在左连接中,因为emp表是左表,所以左表中的记录都会查询出来,即“张三”这条记录也会查出,但相应的右表部分显示NULL。 2.3 右连接 右连接就是先把右表中所有记录都查询出来,然后左表满足条件的显示,不满足显示NULL。例如在dept表中的40部门并不存在员工,但在右连接中,如果dept表为右表,那么还是会查出40部门,但相应的员工信息为NULL。
4 子查询l 子查询出现的位置: Ø where后,作为条件的一部分; Ø from后,作为被查询的一条表; l 当子查询出现在where后作为条件时,还可以使用如下关键字 第一步:查询甘宁的工资
第二步:查询高于甘宁工资的员工
结果:
l 子查询作为条件 l 子查询形式为单行单列 |