数据库执行DQL语句不会对数据进行改变,而是让数据库发送结果集给客户端。
通过查询语句查询出来的数据以表的形式展示我们称这个表为虚拟结果集。
查询返回的结果集是一张虚拟表,而不是真实存在的物理表。
1、查询所有列
SELECT * FROM student;
2、查询某一列
SELECT stu_name from student;
3、查询多个列
SELECT stu_name, stu_age FROM student;
4、SQL条件查询
使用where关键字来控制查询结果的行,select后面的列来控制查询哪些列。
查询student表中张三同学的所有信息。
SELECT * FROM student WHERE stu_name='张三';
除等于号之外,还有以下这些逻辑符号。
查询stu_id在1001-1005的学生信息
SELECT * FROM student WHERE stu_id BETWEEN 1001 AND 1005;
如果不是连续范围可以使用in,查询stu_id在(1001,1003,1005)的学生信息
SELECT * FROM student WHERE stu_id IN (1001, 1003, 1005);
查询stu_age为空的数据
SELECT * FROM student WHERE stu_age IS NULL;
查询stu_age不为空的数据
SELECT * FROM student WHERE stu_age IS NOT NULL;
查询性别为男且年龄20的学生信息
SELECT * FROM student WHERE stu_gender='男' AND stu_age=20;
查询性别为男或年龄20的学生信息
SELECT * FROM student WHERE stu_gender='男' OR stu_age=20;
4、SQL模糊查询
查询姓名由5个字符组成的学生记录
SELECT * FROM student WHERE stu_name LIKE '_____';
查询 姓名由5个字符组成的学生,且第五个字母为S的学生记录
SELECT * FROM student WHERE stu_name LIKE '____S';
查询以w开头的学生姓名
SELECT * FROM student WHERE stu_name like 'w%';
查询姓名以b为第二个字母的学生姓名
SELECT * FROM student WHERE stu_name LIKE '_b%';
查询姓名中包含‘s'字母的学生记录
SELECT * FROM student WHERE stu_name LIKE '%s%';
5、字段控制查询
查询去重后的学生姓名
SELECT DISTINCT stu_name FROM student;
查询成绩和年龄之和
SELECT *, stu_age + stu_score FROM student;
查询成绩和年龄之和(把null替换成0)
SELECT *, ISNULL(stu_age,0) + ISNULL(stu_score,0) FROM student;
将查询后的某一列取一个别名
SELECT *, ISNULL(stu_age,0) + ISNULL(stu_score,0) AS total FROM student;
6、排序
使用ORDER BY关键字进行排序
升序ASC 降序DESC
按薪水对员工升序排名
SELECT * FROM employee ORDER BY salary;
SELECT * FROM employee ORDER BY salary ASC;
按薪水对员工降序排名
SELECT * FROM employee ORDER BY salary DESC;
7、常用聚合函数
函数名 | 含义 |
COUNT() | 统计指定列不为null的记录行数 |
MAX() | 计算统计列的最大值,如果指定列是字符串类型,那么使用字符串排序 |
MIN() | 计算统计列的最小值,如果指定列是字符串类型,那么使用字符串排序 |
SUM() | 计算指定列的数值和,如果指定列不是数值类型,那么计算结果为0 |
AVG | 计算指定列的平均值,如果指定列不是数值类型,那么计算结果为0 |
7.1、聚合函数之COUNT()
查询employee表中记录数
SELECT COUNT(*) AS total_record FROM employee;
查询employee表中有绩效的员工数
SELECT COUNT(performance) FROM employee;
查询employee表中月薪大于2500的人
SELECT COUNT(*) FROM employee WHERE salary > 2500;
统计员工表中月薪和绩效之和大于5000的人
SELECT COUNT(*) FROM employee WHERE salary+ISNULL(performance,0) > 5000;
查询有绩效的人数和有管理费的人数
SELECT COUNT(performance), COUNT(manage) FROM employee;
7.2、聚合函数之SUM()
查询所有员工月薪之和
SELECT SUM(salary) FROM employee;
查询所有员工月薪和、绩效和
SELECT SUM(salary),SUM(performance) FROM employee;
查询所有员工月薪+绩效和
SELECT SUM(salary+ ISNULL(performance)) FROM employee;
7.3、聚合函数之AVG()、MAX()、MIN()
查询平均工资
SELECT AVG(salary) FROM employee;
查询最高工资
SELECT MAX(salary) FROM employee;
查询最低工资
SELECT MIN(salary) FROM employee;
8、分组查询
分组查询:将查询结果按照1个或者多个字段进行分组,字段值相同的为一组,如下例:
SELECT gender FROM employee GROUP BY gender;
根据gender字段来分组,gender字段的全部值只有(男、女),所以分为了两组。
当GroupBy单独使用时,只显示每组的第一条数据
SELECT gender FROM employee GROUP BY gender;
查询每个部门有哪些员工
SELECT department, GROUP_CONCAT('name') FROM employee GROUP BY department;
分组注意事项:SELECT后面跟的字段一般也会在GroupBy后面出现
SELECT name,gender FROM employee GROUP BY name,gender;
分组与聚合函数结合
SELECT department, COUNT(salary) ,AVG(salary), MAX(salary), MIN(salary), SUM(salary) , FROM employee GROUP BY department;
查询每个部门的部门名称和各个部门的工资和
SELECT department, SUM(salary) FROM employee GROUP BY department;
查询每个部门的部门名称以及每个部门的人数
SELECT department, COUNT(*) FROM employee GROUP BY department;
查询每个部门的部门名称以及每个部门工资大于1500的人数
SELECT department, COUNT(*) FROM employee WHERE salary>1500 GROUP BY department;
HAVING用于分组查询后指定一些条件来输出查询结果
HAVING和WHERE一样,但HAVING只能用于group by
查询工资总和大于9000的部门名称以及工资总和
SELECT department, SUM(salary) FROM employee GROUP BY department HAVING SUM(salary)>9000;
HAVING与WHERE的区别
having是在分组之后对数据进行过滤
where是在分组之前对数据进行过滤
having后面可以使用分组函数(统计函数)
where后面不可以使用聚合函数
where是对分组前记录的条件,如果某行记录没有满足where子句的条件,那么这行记录不会参加分组
而having是对分组后数据的约束
查询工资大于2000的,工资总和大于9000的部门名称以及工资和
SELECT department, GROUP_CONCAT(salary), SUM(salary) FROM employee
WHERE salary > 2000
GROUP BY department
HAVING SUM(salary) > 9000;
9、书写顺序与执行顺序
书写顺序: SELECT 、FROM、WHERE、GROUP BY、HAVING、ORDER BY、LIMIT
执行顺序:FROM、WHERE、GROUP BY、HAVING、SELECT、ORDER BY、LIMIT
10、LIMIT分页查询
LIMIT 参数1(从哪一行开始),参数2(总共要查几行)
角标是从0开始
比如查询员工表中前三行的值
SELECT * FROM employee LIMIT 0, 3;
分页查询思路:
int curPage = 1; --当前页
int pageSize = 100; --每一页的数量
--当前页为1 第一页从0开始 (1-1)*100=0
--当前页为2 第一页从0开始 (2-1)*100=100
--当前页为3 第一页从0开始 (3-1)*100=200
--当前页为n 第一页从0开始 (n-1)*100=300
SELECT * FROM employee LIMIT (curPage-1)*pageSize, pageSize;