SQL常用语句、关键字,子查询,多表查询,连接查询等。
常用语句、关键字
1. select … from … where ;
2. AND / OR
3. IN / NOT IN
4. YEAR()函数
获取日期格式数据的年份
1 | SELECT birthday FROM student WHERE no IN (101, 108); |
5. UNION 合并两个表
将两次查询的结果合并在一个表中显示。
查询 计算机系 与 电子工程系 中的不同职称的教师。
1 | -- NOT: 代表逻辑非 |
6. ANY / ALL
ANY 表示集合中任意一个,ALL表示集合中所有的。
degree > ANY (76, 46, 95) 表示degree > 46 即成立。
7. ORDER BY … DESC 降序排序
在查询语句后加上order by 某字段,会将查询的结果按这个字段的大小排序。
DESC 降序;ASC 升序;
可以同时按多个列排序:
1 | SELECT c_no, degree FROM score order by c_no,degree desc; |
8. AVG() 计算某列的平均值,常与GROUP BY 搭配使用
1 | SELECT c_no, AVG(degree) FROM score GROUP BY c_no; |
group by
直接用group by,会取出第一条数据,
如 SELECt * from salaries group by emp_no;
, 当同一个emp_no有多条数据时,会得到第一条数据。
然后可以加条件在分组中选某条数据,比如同一个emp_no的数据(同一组)中选工资最低的。
比如下面这个经典的例子:
1 | SELECT |
9. COUNT()
10. HAVING
HAVING: 表示持有,与where用法类似。
1 | SELECT * FROM student where sex='男'; |
HAVING COUNT(c_no) >= 2。
11. SELECT … FROM … GROUP BY … HAVING COUNT(..)>=n;
12. NOT 取反
13. LIKE 模糊查询
查询 student 表中不姓 “王” 的同学记录。
1 | -- NOT: 取反 |
14. MAX、MIN
1 | SELECT MAX(birthday), MIN(birthday) FROM student; |
15. LIMIT、OFFSET
用来在排好序的结果中选取前几个,或第几个。
1 | select * from employees order by hire_date desc limit 0,1; |
上面语句是排好序后,从第0个开始,选取1个。
以下的两种方式均表示取2
,3
,4
三条条数据。
1.select* from test LIMIT 1,3;
当limit后面跟两个参数的时候,第一个数表示要跳过的数量,后一位表示要取的数量。
- select * from test LIMIT 3 OFFSET 1;(在mysql 5以后支持这种写法)
当 limit和offset组合使用的时候,limit后面只能有一个参数,表示要取的的数量,offset表示要跳过的数量 。
16. ON、WHERE
on是按再条件连接,where是先连接再按条件筛选。
详细介绍:https://www.cnblogs.com/guanshan/articles/guan062.html
一些概念
1. 别名
as
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16-- 使用函数 YEAR(NOW()) 计算出当前年份,减去出生年份后得出年龄。
SELECT name, YEAR(NOW()) - YEAR(birthday) as age FROM student;
+-----------+------+
| name | age |
+-----------+------+
| 曾华 | 42 |
| 匡明 | 44 |
| 王丽 | 43 |
| 李军 | 43 |
| 王芳 | 44 |
| 陆军 | 45 |
| 王尼玛 | 43 |
| 张全蛋 | 44 |
| 赵铁柱 | 45 |
| 张飞 | 45 |
+-----------+------+同一张表联合查询时
1
2SELECT * FROM score a WHERE degree < (
SELECT AVG(degree) FROM score b WHERE a.c_no = b.c_no);
子查询
子查询是比较复杂的查询,通常有多个条件,需要先查询一次,然后在第一次的查询结果中再次查询。
1. 查询 “男” 教师及其所上的课程。
1 | SELECT * FROM course WHERE t_no in (SELECT no FROM teacher WHERE sex = '男'); |
2. 查询最高分同学的 score 表。
1 | -- 找出最高成绩(该查询只能有一个结果) |
3. 查询和 “李军” 同性别且同班的同学 name 。
1 | SELECT name, sex, class FROM student WHERE sex = ( |
多表查询
from两个表时,会先将这两个表全连接。
连接查询
连接查询是将两个表连接起来,join后面需要跟on,表示连接的条件,不能直接跟where。
准备用于测试连接查询的数据:
1 | CREATE DATABASE testJoin; |
分析两张表发现,person
表并没有为 cardId
字段设置一个在 card
表中对应的 id
外键。如果设置了的话,person
中 cardId
字段值为 6
的行就插不进去,因为该 cardId
值在 card
表中并没有。
内连接
要查询这两张表中有关系的数据,可以使用 INNER JOIN
( 内连接 ) 将它们连接在一起。
1 | -- INNER JOIN: 表示为内连接,将两张表拼接在一起。 |
注意:
card
的整张表被连接到了右边。
左外连接
完整显示左边的表 ( person
) ,右边的表如果符合条件就显示,不符合则补 NULL
。
1 | -- LEFT JOIN 也叫做 LEFT OUTER JOIN,用这两种方式的查询结果是一样的。 |
右外链接
完整显示右边的表 ( card
) ,左边的表如果符合条件就显示,不符合则补 NULL
。
1 | SELECT * FROM person RIGHT JOIN card on person.cardId = card.id; |
全外链接
完整显示两张表的全部数据。
1 | -- MySQL 不支持这种语法的全外连接 |
复杂查询例子
1.查询某课程成绩比该课程平均成绩低的 score 表。
1 | -- 将表 b 作用于表 a 中查询数据 |
2. 查询所有任课 ( 在 course 表里有课程 ) 教师的 name 和 department 。
1 | SELECT name, department FROM teacher WHERE no IN (SELECT t_no FROM course); |
3. 查询 score 表中至少有 2 名学生选修,并以 3 开头的课程的平均分数。
1 | SELECT c_no, AVG(degree), COUNT(*) FROM score GROUP BY c_no |
4. 查询 student 表中至少有 2 名男生的 class 。
1 | -- 查看学生表信息 |
5. 查询所有选修 “计算机导论” 课程的 “男” 同学成绩表。
需要的 “计算机导论” 和性别为 “男” 的编号可以在 course
和 student
表中找到。
1 | SELECT * FROM score WHERE c_no = ( |