文章目录
- 查询数据
- [1 查询指定列](#1 查询指定列)
- [2 条件查询](#2 条件查询)
- [3 合并查询](#3 合并查询)
- [4 模糊查询](#4 模糊查询)
- [5 聚合函数查询](#5 聚合函数查询)
- [6 对值进行排序](#6 对值进行排序)
- [7 分组查询](#7 分组查询)
- [8 分页查询](#8 分页查询)
- [9 数据库关联查询](#9 数据库关联查询)
-
-
- [1 内连接 INNER JOIN](#1 内连接 INNER JOIN)
- [2 LEFT JOIN](#2 LEFT JOIN)
- [3 右连接](#3 右连接)
-
- [10 数据库子查询](#10 数据库子查询)
- 参考
查询数据
数据库最常用的操作就是查询,也是数据操作的基础,进行重点学习介绍
参考数据表
1 查询指定列
查询所有列
sql
SELECT * FROM users;
查询指定的列
sql
SELECT username FROM users;
查询指定列,并制定别名
sql
SELECT username AS name FROM users;
查询列中的不同的值
sql
SELECT DISTINCT username AS name FROM users;
2 条件查询
使用WHERE
进行条件查询
sql
SELECT * FROM users WHERE id = 1;
逻辑 与
或
sql
SELECT * FROM users WHERE id = 1 OR id = 3;
sql
SELECT * FROM users WHERE username = 'zhangsan' AND password = '123456';
查询不为NULL
的情况
sql
SELECT * FROM users WHERE birthday is NOT NULL;
【注意】数据库中不等于不是!=
而是<>
查询数值范围
sql
SELECT * FROM users WHERE id BETWEEN 1 AND 5;
3 合并查询
合并字符串
sql
SELECT CONCAT(username, ' ', password) as userpasswd FROM users WHERE id BETWEEN 1 AND 5;
同样可以不同的运算符
对不同列的结果进行操作
4 模糊查询
%
代表任意数量的字符_
代表单个任意字符
如果要对_
进行查询,需要进行转义\_
查询姓zhang的人
sql
SELECT * FROM users WHERE username LIKE 'zhang%';
5 聚合函数查询
查询所有数据的调试
sql
SELECT COUNT(*) FROM users;
查询某一列有值的函数
sql
SELECT COUNT(birthday) FROM users;
求平均值,最大值,最小值,求和,都是对查询的列的值进行运算
sql
SELECT AVG(value_1) FROM users;
sql
SELECT MAX(value_1) FROM users;
sql
SELECT MIN(value_1) FROM users;
sql
SELECT SUM(value_1) FROM users;
6 对值进行排序
升序
sql
SELECT * FROM users ORDER BY id ASC;
降序
sql
SELECT * FROM users ORDER BY id DESC;
多个排序标准,使用,
进行分割
sql
SELECT * FROM users ORDER BY id ASC, phone_number DESC;
7 分组查询
按照列进行分组,使用聚合函数
统计每个组中元素的个数
sql
SELECT username, count(*), AVG(value_1) FROM users GROUP BY username;
分组查询一般是对列进行聚合
如果需要对多列进行聚合,此时需要使用合并查询
,对不同列的数采取运算操作
sql
SELECT username, AVG(value_1 + value_2)/2 FROM users GROUP BY id;
运行的逻辑,在行上进行相加,然后在列上进行求平均,聚合函数还是聚合的列,聚合函数和分组常常在一起使用
面试题:
数据表为
student
id name chinese math english
1 zhangsan 80 70 65
2 lisi 90 80 72
3 wangwu 98 72 12
请使用SQL查询平均成绩大于60的学生
【注意】对每个学生进行分组查询,使用HAVING
进行过滤
sql
SELECT name FROM student GROUP BY id HAVING AVG(chinese + math + english)/3 > 60;
8 分页查询
使用LIMIT指定开始的位置
和数据的条数
sql
SELECT * FROM users LIMIT 1, 5;
9 数据库关联查询
根据两个表和多个表之间的关系进行查询和展示数据,使用JOIN语句实现
数据库ER图(摆脱了传递函数依赖)
1 内连接 INNER JOIN
展示仓库和工人的关系,使用了工作关系联结
使用INNER JOIN
sql
SELECT * FROM worker INNER JOIN work ON worker.worker_id = work.worker_id INNER JOIN repository ON repository.repo_id = work.repo_id ;
内连接:也使用等于 =
进行连接
sql
SELECT * FROM worker, work, repository WHERE worker.worker_id = work.work_id AND repository.repo_id = work.repo_id ;
2 LEFT JOIN
左连接允许连接的过程中右表
没有匹配的情况
sql
SELECT * FROM worker LEFT JOIN work ON worker.worker_id = work.worker_id LEFT JOIN repository ON worl.repo_id = repository.repo_id;
3 右连接
类似左连接,右连接允许左边的数据为NULL
10 数据库子查询
子查询将一个查询的结果用作数据库语句的条件
将id为1-3的user名字都修改为zhangsan1
sql
UPDATE users SET username='zhangsan1' WHERE id IN (SELECT id FROM users WHERE id BETWEEN 1 AND 3);
报错:SQL Error [1093] [HY000]: You can't specify target table 'users' for update in FROM clause
踩坑:不能先SELECT一个表然后再更新
参考:https://blog.csdn.net/qq_40036754/article/details/115174800
删除呢?
sql
DELETE FROM users WHERE id IN (SELECT id FROM users WHERE id BETWEEN 1 AND 3);
同样报这个错误
【问题】查询已经管理仓库的工人id;需要注意查询的结果是一行还是多行
sql
SELECT worker_name FROM worker WHERE worker.worker_id IN (SELECT worker_id FROM work);