数据查询语言DQL
SQL虚拟结果集
查表
SELECT * from 表名;
查询的结果是虚拟表,并不会被储存。
在这里遇到了无法解决的问题
[SQL]SELECT * from students;#查询students表
[Err] 1146 - Table ‘my_test.students;’ doesn’t exist
最后发现是因为搜索没有保存的缘故,保存以后再点运行才可以。
果然,遇到问题一时无法解决不要紧,放两天再想没准可以一下就解决。
查列
SELECT 列名1,列名2…… from 表名;
SQL条件查询
跟之前讲的一样,加一些 WHERE关键字就可以
关键字 | 应用 |
---|---|
= != <>(不等于) < > | 基本运算符 |
BETWEEN…AND; | 值的范围 |
IN(set); | 查询固定范围的值 |
IS NULL; IS NOT NULL; | 空 非空 |
AND | 与 |
OR | 或 |
NOT | 非 |
SQL条件查询练习
添加列
Navicat操作
做如下修改:
查询
SELECT * from students WHERE gender='男' AND age=20;
-- 查询学号记录
# select * from students where id=1001 or id=1002 or id=1003;
select * from students where id in(1001,1002,1003);
其余同理,不再赘述。
SQL模糊查询
- 根据指定的关键字进行查询
- 使用LIKE关键字后跟通配符
- 通配符:“_”–任意一个字母;“%”–任意0~n个字母。
-- 查询姓名由三个字符构成的学生记录
select * from students where name like '___'; # 三个"_"
-- 查询姓名由三个字符构成且最后一个字母是s
select * from students where name like '___s';
-- 查询姓名以m开头
select * from students where name like 'm%';# '%'表示不限字符个数
-- 查询姓名包含s
select * from students where name like '%s%';
字段控制查询
去除重复记录
SELECT DISTINCT name FROM students;
DISTINCT命令可以对表的相应列去重
把查询字段的结果进行运算
要求相应字段必须是数据型。
SELECT *, age+score FROM sutdents; # *表示新生成的一列
处理NULL
SELECT *,IFNULL(age,0) + IFNULL(score,0) FROM students;
IFNULL(name,number)如果’name’列为空,则赋值为0
对查询结果起别名
SELECT *,IFNULL(age,0) + IFNULL(score,0) AS total FROM students;
AS后边加新名称即可
SELECT name AS mingzi FROM sutdents;
SQL数据的导入及排序 ORDER BY
数据的导入导出
可直接用Navicat实现
也可以用查询语句,先创建表再插入语句
数据排序
升序 | ASC | 从小到大,默认 |
---|---|---|
降序 | DESC | 从大到小 |
SELECT * FROM employee ORDER BY salary;# 升序
SELECT * FROM employee ORDER BY salary ASC;# 升序
SELECT * FROM employee ORDER BY salary DESC;# 降序
-- 多个条件
SELECT * FROM employee ORDER BY salary DESC,id DESC;# 降序
SQL聚合函数
函数 | 功能 |
---|---|
COUNT | 统计指定列不为NULL的记录行数 |
MAX | 计算指定列的最大值,如果指定列是字符串类型,则使用字符串排序运算 |
MIN | 计算指定列的最小值,如果指定列是字符串类型,则使用字符串排序运算 |
SUM | 计算指定列的数值和,如果指定列类型不是数值类型,则计算结果为0 |
AVG | 计算指定列的平均值,如果指定列类型不是数值类型,则计算结果为0 |
COUNT
SELECT * FROM employee; # 查询所有字段
SELECT COUNT(*) FROM employee; # 查询非NULL记录总数
-- 加点条件
SELECT COUNT(*) FROM employee WHERE IFNULL(salary,0)+IFNULL(performance,0)>5000;
SUM AVG
SELECT SUM(salary) FROM employee;
SELECT AVG(salary) FROM employee;
MIN MAX
SELECT MIN(salary) FROM employee;
SELECT MAX(salary) FROM employee;
SQL分组查询
- 分组查询:将查询结果按照1个或多个字段进行分组,字段相同的为一组。
比如根据gender分组
SELECT gender FROM employee GROUP BY gender;
GROUP BY 单独使用时只显示每组第一条数据,故单独使用价值不大。
SELECT department,GROUP_CONCAT(name) FROM employee GROUP BY department;
SQL分组_group_concat()
- group_concat(字段名)可以作为一个输出字段来使用
- 表示分组之后,根据分组结果,使用group_concat()来放置每一组的某字段的值的集合
- 注意,使用分组时,select 后面直接跟的字段一般都出现在 group by 之后
SELECT gender,GROUP_CONCAT(name) FROM employee GROUP BY gender;
SQL分组_聚合函数
我们既然可以用group_concat统计出每个分组某字段的值的集合,则我们也可以通过集合函数来对这个“值的集合”做一些操作。
-- 先分组,再查询部门名称,然后计算每一组的薪资总和
SELECT department,GROUP_CONCAT(salary),SUM(salary) FROM employee GROUP BY department;
SELECT name,salary FROM employee WHERE salary>1500 GROUP BY department;
SQL分组_having
-- 查询工资总和大于9000的所有部门
SELECT department,GROUP_CONCAT(salary),SUM(SALARY) FROM employee # 查询数据、计算数据
GROUP BY department # 分组
HAVING SUM(SALARY)>=9000; # 筛选
where和having的区别
where | having | |
---|---|---|
数据过滤 | 在分组前对数据进行过滤 | 在分组后对数据进行过滤 |
分组函数 | 后面不可以使用分组函数 | 后面可以使用分组函数(过滤函数) |
若某行记录不满足WHERE子句的条件,则该行记录不参加分组 | 对分组后数据进行约束 |
SELECT department,GROUP_CONCAT(salary),SUM(salary) FROM employee
WHERE salary>2000
GROUP BY department
HAVING SUM(salary)>9000
ORDER BY SUM(salary) DESC;
SQL查询语句书写顺序(了解)
书写顺序
select -> from -> where -> group by -> having -> order by -> limit
执行顺序
from -> where -> group by -> having -> select -> order by -> limit
SQL分页查询思路Limit使用
- 目的:从哪一行查,要查几行
- 使用:Limit a,b a-从哪一行开始,b-一共查几行
- 角标:从0开始
- 格式:SELECT * FROM 表名 LIMIT 0,5;
- 分页思路:
int curPage=1;-- 当前页
int pageSize=3;-- 每页多少条数据
SELECT * FROM employee LIMIT (curPage-1)*pageSize,pageSize;