1、DQL(数据查询语言)主要用于进行数据表中数据的查询
基本语法:SELECT 属性1,属性2,…. FROM 表名
SELECT识别要查询的列 FROM识别要查询的表 例:SELECT empno,ename,jobno,hiredate FROM hzdl_emp;
通配符*,代表所有,可以使用*代表查询表中所有列;例子:SELECT * FROM hzdl_emp;
使用SELECT语句进行数据查询时,还可以进行算术运算、限定查询、排序、分组等控制
2、算术运算
能够在SELECT语句查询的结果基础上进行相应的数学运算例子:SELECT sal+100 FROM hzdl_job;
限定查询:在使用SELECT语句进行查询时,使用WHERE子句,就能查询出满足条件的记录,而不是表中的所有记录
例子:SELECT * FROM hzdl_emp WHERE empno=20161001;
WHERE子句也可以使用多个限定条件(在WHERE子句中设置的限定条件,一般由各种运算符组成)
例子:SELECT * FROM hzdl_emp WHERE empno=20161001 AND ename='董事长';
3、MySQL中常用的运算符:数学运算符、比较运算符、逻辑运算符
通配符%代表若干个字符,通配符_代表一个字符
逻辑运算符!在使用的时候一定要注意不能省略后面括号 运算符优先级:数学运算符>比较运算符>逻辑运算符
注意:在WHERE子句中(字符串和日期要用引号括起来、对字符串不区分大小写、日期值是格式敏感的)
4、去除重复
使用DISTINCT关键字能够将查询到的结果集中重复的记录去除;例:SELECT DISTINCT(hiredate) FROM hzdl_emp;
设置别名(使用AS关键字可以在查询时设置属性(列)的别名,不过AS可以省略)例子:
SELECT empno AS '员工号',ename AS '员工姓名' FROM hzdl_emp;
SELECT empno '员工号',ename '员工姓名' FROM hzdl_emp;
5、排序
使用ORDER BY子句可以将SELECT查询到的结果集按照指定属性排序;默认采用升序(ASC)排序方式,也可以使用降序(DESC)例子:
SELECT * FROM hzdl_emp ORDER BY deptno; SELECT * FROM hzdl_emp ORDER BY deptno ASC;
SELECT * FROM hzdl_emp ORDER BY deptno DESC;
同样,排序时也可以指定多个属性排序。当多属性排序方式有冲突时,按照指定先后顺序排序
例子:SELECT * FROM hzdl_emp ORDER BY deptno,jobno;
6、分组
使用GROUP BY子句可以对查询结果按指定属性进行分组统计。数据库中的分组并不是将查询结果分组排序,而是分组后对每个分组按照特定属性进行统计,因此查询到的是每个分组的统计后结果
例如:查询公司内各个部门员工人数。一般分组GROUP BY子句和聚合函数一起使用,常用的聚合函数有:
-COUNT -AVG -SUM -MAX -MIN -GROUP_CONCAT
7、计数函数COUNT
统计表中某个属性对应的记录数;例子:SELECT COUNT(empno) FROM hzdl_emp;
(1)求平均值函数AVG
统计表中某个属性对应的平均值;例子:SELECT AVG(sal) FROM hzdl_job;
(2)求和函数SUM
统计表中某个属性的汇总值(和);例子:SELECT SUM(sal) FROM hzdl_job;
(3)最大值函数MAX
统计表中某个属性的最大值;例子:SELECT MAX(sal) FROM hzdl_job;
(4)最小值函数MIN
统计表中某个属性的最小值;例子:SELECT MIN(sal) FROM hzdl_job;
(5)列值拼接函数GROUP_CONCAT
将表中某个属性的所有值拼接到同一个结果中,默认值与值之间用逗号分隔。也可使用SEPARATOR关键字指定分隔符
例子:SELECT GROUP_CONCAT(jobname) FROM hzdl_job;
8、数据库中的分组就是依赖这些聚合函数,完成对查询结果中的每个分组进行统计
(1)例子:查询公司内各个部门员工人数
使用的SQL语句:SELECT deptno,COUNT(empno) FROM hzdl_emp GROUP BY deptno;
(2)在MySQL数据库中使用分组时,SELECT语句后查询的属性可以不出现在GROUP BY子句中
但是在其他类型的数据库中,SELECT语句后只能使用聚合函数和GROUP BY子句后出现的属性;和分组GROUP BY子句经常一起使用的还有HAVING子句;HAVING子句为分组统计进一步设置统计条件,效果和WHERE子句类似。它们的区别是:WHERE子句在查询前限定查询条件 HAVING子句在分组后进行进一步限定
例如:查询公司内各个部门员工人数,并返回部门员工人数大于2人的部门编号
SELECT deptno,COUNT(empno) FROM hzdl_emp GROUP BY deptno HAVING COUNT(ename)>2;
(3)分组同样可以基于多个属性;例:查询公司内各个部门不同职位的员工人数
SQL语句:SELECT deptno,jobno,COUNT(empno) FROM hzdl_emp GROUP BY deptno,jobno;
9、限定结果
使用LIMIT子句可以限定查询返回的记录数。例如:查询数据表中前两条记录
SQL语句:SELECT * FROM hzdl_emp LIMIT 2;
LIMIT子句后面可以有一个参数,也可以有两个参数。如果有一个参数,该参数表示从表开始位置查询对应的记录数量
如果有两个参数,那么第一个参数表示起始位置与第一行的偏移量,第二个参数表示查询的数量
例子:SELECT * FROM hzdl_emp LIMIT 2,3;
10、单行函数
数据库中的函数作用也非常大,一般多用于SELECT语句和WHERE语句;函数按照类型又可分为:单行函数和多行函数
单行函数:就是将数据表中的每条数据进行独立的计算并返回结果
多行函数:就是计算数据表中的多条数据并返回结果,前面接触的聚合函数就是多行函数,一般用于数据的统计汇总
常用的单行函数可以分为几类:
-字符串函数 -日期时间函数 -数学函数 -类型转换函数 -流程控制函数
需要注意的是可以转换的数据类型是有限制的:-整型(signed)、无符号整型(unsigned)、浮点型(decimal)、字符型(char)、日期(date)、时间(time)、日期时间型(datetime)
11、多表查询
使用一个SELECT语句查询多张表,即多表查询;多表查询分为两类:
(1)内连接:进行多表查询时,按照匹配条件,在结果集中只保留各个表中满足匹配条件的记录
内连接又分为:等值连接、不等值连接、自然连接、自连接
等值连接:就是在进行内连接查询时,使用比较运算符‘=’作为匹配条件
例子:SELECT hzdl_emp.ename,hzdl_job.jobname FROM hzdl_emp,hzdl_job WHERE hzdl_emp.jobno=hzdl_job.jobno;
非等值连接:就是在进行内连接查询时,使用非‘=’的其他比较运算符作为匹配条件
例子:SELECT hzdl_emp.ename,hzdl_job.jobname FROM hzdl_emp,hzdl_job WHERE hzdl_emp.jobno>hzdl_job.jobno;
自然连接:和等值连接类似,但是连接时不需要额外指定连接条件,因为会自动按照相同属性进行等值连接,且会删除结果集中的重复属性。因此进行自然连接的两张表中需要有相同的属性存在
例子:SELECT * FROM hzdl_emp NATURAL JOIN hzdl_dept;
自连接:就是表与它自己进行的连接查询,即自连接
在自连接查询过程中,一定要设置表的别名;例:SELECT e1.ename AS '员工姓名',e2.ename AS '上级主管' FROM hzdl_emp e1,hzdl_emp e2 WHERE e1.mgr=e2.empno;
注意:使用了表的别名后,就不能再使用表名作为属性的标识
(2)外链接:进行多表查询时,分为主、从表,在结果集中保留主表中的所有记录以及从表中满足匹配条件的记录
内连接又分为:左外连接、右外连接
左外连接:在连接查询过程中,以左表为主表,在结果集中保留左表中的全部记录及右表中满足匹配条件的记录
例子:SELECT hzdl_emp.ename,hzdl_job.jobname FROM hzdl_emp LEFT OUTER JOIN hzdl_job ON hzdl_emp.jobno=hzdl_job.jobno;
右外连接:在连接查询过程中,以右表为主表,在结果集中保留右表中的全部记录及左表中满足匹配条件的记录
例子:SELECT hzdl_emp.ename,hzdl_job.jobname FROM hzdl_emp RIGHT OUTER JOIN hzdl_job ON hzdl_emp.jobno=hzdl_job.jobno;
12、子查询
将一个SELECT语句A使用于另外一个SELECT语句B中,则A即为B中的子查询
子查询分为:单行子查询、多行子查询、多列子查询
使用子查询注意事项:子查询一定要使用括号括起来、子查询放在比较运算符的右边、子查询中不要加ORDER BY子句、对单行子查询使用单行运算符、对多行子查询使用多行运算符
单行子查询:即子查询语句只返回一行一列
例子:SELECT ename FROM hzdl_emp WHERE mgr = (SELECT empno FROM hzdl_emp WHERE ename='董事长');
多行子查询:即子查询语句返回多行一列
多列子查询:即子查询语句返回多行多列 多行比较运算符:IN
13、合并结果集
在MySQL中使用UNION语句可以将多个SELECT语句的结果集合并消除表中任何重复行;使用UNION进行合并时要求:
1、多个SELECT语句中的列名可以不一样, UNION结果集中的列名是等于第一个SELECT语句中的列名
2、多个SELECT语句必须拥有相同数量的列 3、多个SELECT语句列必须拥有相似的数据类型
4、多个SELECT语句列的顺序必须相同
例子:SELECT empno FROM hzdl_emp WHERE deptno=3 UNION SELECT empno FROM hzdl_emp WHERE deptno=4;
UNION操作符默认选取不同的值,即默认会消除重复的行
如果不消除重复行,要使用UNION ALL例子:
SELECT jobno FROM hzdl_emp WHERE deptno=3 UNION ALL SELECT jobno FROM hzdl_emp WHERE deptno=4;
使用UNION进行合并时,如果SELECT语句中使用ORDER BY、LIMIT子句,需要使用括号将SELECT语句括起来
例子:(SELECT empno FROM hzdl_emp WHERE deptno=3 ORDER BY empno LIMIT 1) UNION (SELECT empno FROM hzdl_emp WHERE deptno=4 ORDER BY empno LIMIT 1);