20000 字干货笔记,一天搞定 MySQL( 六 )

  • YEAR 与 NOW 函数
查询 student 表中每个学生的姓名和年龄 。
select name, year(now)-year(birthday) as agefrom student;+-----------+------+| name | age |+-----------+------+| 曾华 | 42 || 匡明 | 44 || 王丽 | 43 || 李军 | 43 || 王芳 | 44 || 陆军 | 45 || 王尼玛 | 43 || 张全蛋 | 44 || 赵铁柱 | 45 || 张飞 | 45 |+-----------+------+
  • MAX 与 MIN 函数
查询 student 表中最大和最小的 birthday 值 。
SELECT MAX(birthday), MIN(birthday) FROM student;+---------------+---------------+| MAX(birthday) | MIN(birthday) |+---------------+---------------+| 1977-09-01 | 1974-06-03 |+---------------+---------------+
  • 多段排序
以 class 和 birthday 从大到小的顺序查询 student 表 。
SELECT * FROM student ORDER BY class DESC, birthday DESC;+-----+--------+-----+------------+-------+| no | name | sex | birthday | class |+-----+--------+-----+------------+-------+| 110 | 张飞 | 男 | 1974-06-03 | 95038 || 101 | 曾华 | 男 | 1977-09-01 | 95033 || 104 | 李军 | 男 | 1976-02-20 | 95033 || 107 | 王尼玛 | 男 | 1976-02-20 | 95033 || 103 | 王丽 | 女 | 1976-01-23 | 95033 || 102 | 匡明 | 男 | 1975-10-02 | 95031 || 105 | 王芳 | 女 | 1975-02-10 | 95031 || 108 | 张全蛋 | 男 | 1975-02-10 | 95031 || 106 | 陆军 | 男 | 1974-06-03 | 95031 || 109 | 赵铁柱 | 男 | 1974-06-03 | 95031 |+-----+--------+-----+------------+-------+
  • 子查询 - 5
查询 "男" 教师及其所上的课程 。
SELECT * FROM course WHERE t_no in (SELECT no FROM teacher WHERE sex = '男');+-------+--------------+------+| no | name | t_no |+-------+--------------+------+| 3-245 | 操作系统 | 804 || 6-166 | 数字电路 | 856 |+-------+--------------+------+
  • MAX 函数与子查询
查询最高分同学的 score 表 。
-- 找出最高成绩(该查询只能有一个结果)SELECT MAX(degree) FROM score;-- 根据上面的条件筛选出所有最高成绩表,-- 该查询可能有多个结果,假设 degree 值多次符合条件 。SELECT * FROM score WHERE degree = (SELECT MAX(degree) FROM score);+------+-------+--------+| s_no | c_no | degree |+------+-------+--------+| 103 | 3-105 | 92 |+------+-------+--------+
  • 子查询 - 6
查询和 "李军" 同性别的所有同学 name。
select name from student where sex = (SELECT sex FROM student where name='李军');+--------+| name |+--------+| 曾华 || 匡明 || 李军 || 陆军 || 王尼玛 || 张全蛋 || 赵铁柱 || 张飞 |+--------+
  • 子查询 - 7
查询和 "李军" 同性别且同班的同学 name。
SELECT name, sex, class FROM student WHERE sex = (SELECT sex FROM student WHERE name = '李军') AND class = (SELECT class FROM student WHERE name = '李军');+-----------+-----+-------+| name | sex | class |+-----------+-----+-------+| 曾华 | 男 | 95033 || 李军 | 男 | 95033 || 王尼玛 | 男 | 95033 |+-----------+-----+-------+
  • 子查询 - 8
查询所有选修 "计算机导论" 课程的 "男" 同学成绩表 。
需要的 "计算机导论" 和性别为 "男" 的编号可以在 course 和 student 表中找到 。
SELECT * FROM score WHERE c_no = (SELECT no FROM course WHERE name = '计算机导论') AND s_no IN (SELECT no FROM student WHERE sex = '男');+------+-------+--------+| s_no | c_no | degree |+------+-------+--------+| 101 | 3-105 | 90 || 102 | 3-105 | 91 || 104 | 3-105 | 89 || 109 | 3-105 | 76 |+------+-------+--------+
  • 按等级查询
建立一个 grade 表代表学生的成绩等级,并插入数据:
CREATE TABLE grade (low INT(3),upp INT(3),grade char(1));INSERT INTO grade VALUES (90, 100, 'A');INSERT INTO grade VALUES (80, 89, 'B');INSERT INTO grade VALUES (70, 79, 'C');INSERT INTO grade VALUES (60, 69, 'D');INSERT INTO grade VALUES (0, 59, 'E');SELECT * FROM grade;+------+------+-------+| low | upp | grade |+------+------+-------+| 90 | 100 | A || 80 | 89 | B || 70 | 79 | C || 60 | 69 | D || 0 | 59 | E |+------+------+-------+
  • 查询所有学生的 s_no 、c_no 和 grade 列 。
思路是,使用区间 ( BETWEEN ) 查询,判断学生的成绩 ( degree ) 在 grade 表的 low和 upp 之间 。
SELECT s_no, c_no, grade FROM score, gradeWHERE degree BETWEEN low AND upp;+------+-------+-------+| s_no | c_no | grade |+------+-------+-------+| 101 | 3-105 | A || 102 | 3-105 | A || 103 | 3-105 | A || 103 | 3-245 | B || 103 | 6-166 | B || 104 | 3-105 | B || 105 | 3-105 | B || 105 | 3-245 | C || 105 | 6-166 | C || 109 | 3-105 | C || 109 | 3-245 | D || 109 | 6-166 | B |+------+-------+-------+
  • 连接查询
准备用于测试连接查询的数据:


推荐阅读