Data Query Language(DQL):数据查询语言
建立三张表用于查询,表中数据如下。
stu表如下:
![在这里插入图片描述](https://img-blog.csdnimg.cn/65e01521ef9341f19a7febc9bf92af29.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5YWt5Y-26I2Jfg==,size_20,color_FFFFFF,t_70,g_se,x_16)
emp表如下:
dept表如下:
基础查询
查询所有列
语法:SELECT * FROM 表名;
,*
通配符,表示所有列
如查询stu表中所有记录:SELECT * FROM stu;
结果如下:
查询指定列
语法: SELECT 列名1, 列名2, …列名n FROM 表名;
查询stu表中所以记录的编号,姓名,年龄:SELECT sid, sname, age FROM stu;
结果如下:
条件查询
条件查询介绍
条件查询就是在查询时给出WHERE子句,在WHERE子句中可以使用如下运算符及关键字:
=、!=、<>、<、<=、>、>=;
BETWEEN…AND;
IN(set);
IS NULL;
AND;
OR;
NOT;
查询示例如下
1、查询性别为女,并且年龄小于50的记录
查询如下:
SELECT * FROM stu
WHERE gender='female' AND age<50;
结果如下:
2、查询学号为S_1001,或者姓名为liSi的记录
查询如下:
SELECT * FROM stu
WHERE sid ='S_1001' OR sname='liSi';
结果如下:
3、查询学号为S_1001,S_1002,S_1003的记录
查询如下:
SELECT * FROM stu
WHERE sid IN ('S_1001','S_1002','S_1003');
结果如下:
4、查询学号不是S_1001,S_1002,S_1003的记录
查询如下:
SELECT * FROM stu
WHERE sid NOT IN ('S_1001','S_1002','S_1003');
结果如下:
5、查询年龄为null的记录
查询如下:
SELECT * FROM stu
WHERE age IS NULL;
结果如下:
6、查询年龄在20到40之间的学生记录
查询如下:
SELECT * FROM stu
WHERE age>=20 AND age<=40;
结果如下:
或者
SELECT * FROM stu
WHERE age BETWEEN 20 AND 40;
结果如下:
7、查询性别非男的学生记录
查询如下:
SELECT * FROM stu
WHERE gender != 'male';
--或者
SELECT * FROM stu
WHERE gender <> 'male';
--或者
SELECT * FROM stu
WHERE NOT gender='male';
结果如下:
8、查询姓名不为null的学生记录
查询如下:
SELECT * FROM stu
WHERE NOT sname IS NULL;
SELECT * FROM stu
WHERE sname IS NOT NULL;
结果如下:
模糊查询
模糊查询介绍
语法: SELECT 字段 FROM 表 WHERE 某字段 Like 条件
SQL 提供了两种匹配模式:
(1)% :表示任意 0 个或多个字符。可匹配任意类型和长度的字符,有些情况下若是中文,请使用两个百分号(%%)表示。
(2) _ : 表示任意单个字符。匹配单个任意字符,它常用来限制表达式的字符长度语句。
查询示例如下
1、查询姓名由5个字母构成的学生记录
查询如下:
SELECT * FROM stu
WHERE sname LIKE '_____';
结果如下:
2、查询姓名由5个字母构成,并且第5个字母为“i”的学生记录
查询如下:
SELECT * FROM stu
WHERE sname LIKE '____i';
3、查询姓名以“z”开头的学生记录
查询如下:
SELECT * FROM stu
WHERE sname LIKE 'z%';
结果如下:
4、查询姓名中第2个字母为“i”的学生记录
查询如下:
SELECT * FROM stu
WHERE sname LIKE '_i%';
结果如下:
5、查询姓名中包含“a”字母的学生记录
查询如下:
SELECT * FROM stu
WHERE sname LIKE '%a%';
结果如下:
字段控制查询
1、去掉重复记录
去除重复记录,需要使用DISTINCT。
语法:SELECT DISTINCT 属性 FROM 表名;
如去除emp表中sal属性重复的记录:SELECT DISTINCT sal FROM emp;
2、查看雇员的月薪与佣金之和
语法:SELECT *, 属性1+属性2 FROM 表名;
因为sal和comm两列的类型都是数值类型,所以可以做加运算。
如果sal或comm中有一个字段不是数值类型,那么会出错:SELECT *, sal+comm FROM emp;
那么就会发现sal+comm属性结果会出现错误。comm列有很多记录的值为NULL,因为任何东西与NULL相加结果还是NULL,所以结算结果可能会出现NULL。下面使用了把NULL转换成数值0的函数IFNULL:
SELECT *, sal+IFNULL(comm,0) FROM emp;
3、给列名添加别名
语法:SELECT *, 列名 AS 列名 FROM emp;
现在我们给sal+comm这一列给出一个别名,为total:SELECT *, sal+IFNULL(comm,0) AS total FROM emp;
关键字AS可以省略:SELECT *, sal+IFNULL(comm,0) total FROM emp;
排序
ASC:升序。
DESC:降序。
1、查询所有学生记录,按年龄升序排序
查询如下:
SELECT * FROM stu
ORDER BY age ASC;
结果如下:
2、查询所有学生记录,按年龄降序排序
查询如下:
SELECT * FROM stu
ORDER BY age DESC;
结果如下:
3、查询所有雇员,按月薪降序排序,如果月薪相同时,按编号升序排序
查询如下:
SELECT * FROM emp
ORDER BY sal DESC ,empno ASC;
结果如下:
聚合函数
聚合函数是用来做纵向运算的函数:
COUNT():统计指定列不为NULL的记录行数;
MAX():计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算;
MIN():计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算;
SUM():计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0;
AVG():计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0;
1、COUNT:当需要纵向统计时可以使用COUNT()。
如:统计月薪与佣金之和大于2500元的人数
count()函数只统计列中非NULL
的行数。
2、SUM和AVG:当需要纵向求和时使用sum()函数,求平均值用svg()函数。
如:查询所有雇员月薪+佣金和:
统计所有员工平均工资:
3、MAX和MIN
查询最高工资和最低工资:
分组查询
1、当需要分组查询时需要使用GROUP BY
子句,例如查询每个部门的工资和,这说明要使用部分来分组。
语法:select 字段1,字段2… from 表名 group by 分组字段
查询每个部门的部门编号以及每个部门的人数:
2、HAVING子句:select 字段1,字段2… from 表名 group by 分组字段 having 分组条件;
WHERE是对分组前记录的条件,如果某行记录没有满足WHERE子句的条件,那么这行记录不会参加分组;而HAVING是对分组后数据的约束。
如:查询工资总和大于9000的部门编号以及工资和:
分页查询
LIMIT:用来限定查询结果的起始行,以及总行数。
语法:SELECT * FROM 表名 LIMIT 起始位置, 查询数;
1、查询5行记录,起始行从0开始,起始行从0开始,即第一行开始!
2、查询10行记录,起始行从3开始。