1. #建表
  2. create table department(
  3. id int,
  4. name varchar(20)
  5. );
  6. create table staff(
  7. id int primary key auto_increment,
  8. name varchar(20),
  9. sex enum(\'male\',\'female\') not null default \'male\',
  10. age int,
  11. dep_id int
  12. );
  13. #插入数据
  14. insert into department values
  15. (200,\'挖矿小分队\'),
  16. (201,\'人力资源\'),
  17. (202,\'销售\'),
  18. (203,\'运营\');
  19. insert into staff(name,sex,age,dep_id) values
  20. (\'程咬金\',\'male\',38,200),
  21. (\'露娜\',\'female\',26,201),
  22. (\'李白\',\'male\',38,201),
  23. (\'王昭君\',\'female\',28,202),
  24. (\'典韦\',\'male\',118,200),
  25. (\'小乔\',\'female\',16,204)
  26. ;
  27. #查看表结构和数据
  28. mysql> desc department;
  29. +-------+-------------+------+-----+---------+-------+
  30. | Field | Type | Null | Key | Default | Extra |
  31. +-------+-------------+------+-----+---------+-------+
  32. | id | int(11) | YES | | NULL | |
  33. | name | varchar(20) | YES | | NULL | |
  34. +-------+-------------+------+-----+---------+-------+
  35. 2 rows in set (0.06 sec)
  36. mysql> desc staff;
  37. +--------+-----------------------+------+-----+---------+----------------+
  38. | Field | Type | Null | Key | Default | Extra |
  39. +--------+-----------------------+------+-----+---------+----------------+
  40. | id | int(11) | NO | PRI | NULL | auto_increment |
  41. | name | varchar(20) | YES | | NULL | |
  42. | sex | enum(\'male\',\'female\') | NO | | male | |
  43. | age | int(11) | YES | | NULL | |
  44. | dep_id | int(11) | YES | | NULL | |
  45. +--------+-----------------------+------+-----+---------+----------------+
  46. 5 rows in set (0.04 sec)
  47. #表department与staff
  48. mysql> select * from department;
  49. +------+-----------------+
  50. | id | name |
  51. +------+-----------------+
  52. | 200 | 挖矿小分队 |
  53. | 201 | 人力资源 |
  54. | 202 | 销售 |
  55. | 203 | 运营 |
  56. +------+-----------------+
  57. 4 rows in set (0.00 sec)
  58. mysql> select * from staff;
  59. +----+-----------+--------+------+--------+
  60. | id | name | sex | age | dep_id |
  61. +----+-----------+--------+------+--------+
  62. | 1 | 程咬金 | male | 38 | 200 |
  63. | 2 | 露娜 | female | 26 | 201 |
  64. | 3 | 李白 | male | 38 | 201 |
  65. | 4 | 王昭君 | female | 28 | 202 |
  66. | 5 | 典韦 | male | 118 | 200 |
  67. | 6 | 小乔 | female | 16 | 204 |
  68. +----+-----------+--------+------+--------+
  69. 6 rows in set (0.00 sec)

  • 小结: 找两张表共有的部分,利用条件从笛卡尔积结果中筛选出了正确的结果

  • 查询语句 (mysql没有full join,可以有左外连接+右外连接来实现全外连接)

  1. select * from 1 left join 2 on 条件((表1.字段=表2.字段))
  2. union
  3. select * from 1 right join 2 on 条件((表1.字段=表2.字段));

  1. #全外连接:在内连接的基础上增加左边有右边没有的和右边有左边没有的结果
  2. #注意:mysql不支持全外连接 full join
  3. #强调:mysql可以使用此种方式间接实现全外连接
  4. #注意 union与union all的区别:union会去掉相同的纪录
  1. 1.找挖矿小分队的所有员工的信息
  2. #答:
  3. mysql> select * from staff inner join department on department.id=staff.dep_id where department.name=\'挖矿小分队\';
  4. +----+-----------+------+------+--------+------+-----------------+
  5. | id | name | sex | age | dep_id | id | name |
  6. +----+-----------+------+------+--------+------+-----------------+
  7. | 1 | 程咬金 | male | 38 | 200 | 200 | 挖矿小分队 |
  8. | 5 | 典韦 | male | 118 | 200 | 200 | 挖矿小分队 |
  9. +----+-----------+------+------+--------+------+-----------------+
  10. 2 rows in set (0.00 sec)
  11. 2.查找人力资源所有的员工名字
  12. #答: (名字太长可以起别名)
  13. mysql> select staff.name from staff inner join department as dep on dep.id=staff.dep_id where dep.name=\'人力资源\';
  14. +--------+
  15. | name |
  16. +--------+
  17. | 露娜 |
  18. | 李白 |
  19. +--------+
  20. 2 rows in set (0.00 sec)
  21. 3.找出年龄大于38的员工的姓名,及其所在的部门名称
  22. #答:
  23. mysql> select staff.name,dep.name from staff inner join department as dep on dep.id=staff.dep_id where age>38;
  24. +--------+-----------------+
  25. | name | name |
  26. +--------+-----------------+
  27. | 典韦 | 挖矿小分队 |
  28. +--------+-----------------+
  29. 1 row in set (0.00 sec)
  30. 4.以内连接的方式查询 staff department表,并且以age字段的升序方式显示
  31. 答:
  32. mysql> select * from staff inner join department as dep on dep.id=staff.dep_id order by age;
  33. +----+-----------+--------+------+--------+------+-----------------+
  34. | id | name | sex | age | dep_id | id | name |
  35. +----+-----------+--------+------+--------+------+-----------------+
  36. | 2 | 露娜 | female | 26 | 201 | 201 | 人力资源 |
  37. | 4 | 王昭君 | female | 28 | 202 | 202 | 销售 |
  38. | 1 | 程咬金 | male | 38 | 200 | 200 | 挖矿小分队 |
  39. | 3 | 李白 | male | 38 | 201 | 201 | 人力资源 |
  40. | 5 | 典韦 | male | 118 | 200 | 200 | 挖矿小分队 |
  41. +----+-----------+--------+------+--------+------+-----------------+
  42. 5 rows in set (0.05 sec)
  43. 5.找到部门为 挖矿小分队 人力资源 的所有员工的名字
  44. #答:
  45. mysql> select staff.name from staff inner join department as dep on dep.id = staff.dep_id where dep.name in (\'挖矿小分队\',\'人力资源\');
  46. +-----------+
  47. | name |
  48. +-----------+
  49. | 程咬金 |
  50. | 露娜 |
  51. | 李白 |
  52. | 典韦 |
  53. +-----------+
  54. 4 rows in set (0.00 sec)
  1. #1:子查询是将一个查询语句嵌套在另一个查询语句中。
  2. #2:内层查询语句的查询结果,可以为外层查询语句提供查询条件。
  3. #3:子查询中可以包含:IN、NOT IN、ANY、ALL、EXISTS 和 NOT EXISTS等关键字
  4. #4:还可以包含比较运算符:= 、 !=、> 、<等
  5. #5: 多用连表查,因为连表查询比子查询效率高
  6. 1.用子查询 找到部门是销售的所有员工的姓名
  7. #解题思路
  8. ①先找department表部门为销售的部门的id
  9. mysql> select id from department where name = \'销售\';
  10. +------+
  11. | id |
  12. +------+
  13. | 202 |
  14. +------+
  15. 1 row in set (0.00 sec)
  16. ②再找staff表中部门dep_id = 202
  17. mysql> select name from staff where dep_id = 202;
  18. +-----------+
  19. | name |
  20. +-----------+
  21. | 王昭君 |
  22. +-----------+
  23. 1 row in set (0.00 sec)
  24. ③字表查
  25. mysql> select name from staff where dep_id =(select id from department where name = \'销售\');
  26. +-----------+
  27. | name |
  28. +-----------+
  29. | 王昭君 |
  30. +-----------+
  31. 1 row in set (0.00 sec)
  32. 2.用子查询 找到部门为 销售 人力资源 的所有员工的名字
  33. ①先找department表部门为销售和人力资源的部门的id
  34. mysql> select id from department where name = \'销售\' or name = \'人力资源\';
  35. +------+
  36. | id |
  37. +------+
  38. | 201 |
  39. | 202 |
  40. +------+
  41. 2 rows in set (0.00 sec)
  42. ②子查询
  43. mysql> select name from staff where dep_id in (select id from department where name = \'销售\' or name = \'人力资源\');
  44. +-----------+
  45. | name |
  46. +-----------+
  47. | 露娜 |
  48. | 李白 |
  49. | 王昭君 |
  50. +-----------+
  51. 3 rows in set (0.00 sec)

  1. 1. IN关键字的子查询
  2. ①查询平均年龄在28岁以上的部门名
  3. select id,name from department
  4. where id in
  5. (select dep_id from staff group by dep_id having avg(age) > 28);
  6. #结果
  7. +------+-----------------+
  8. | id | name |
  9. +------+-----------------+
  10. | 200 | 挖矿小分队 |
  11. | 201 | 人力资源 |
  12. +------+-----------------+
  13. 2 rows in set (0.00 sec)
  14. ②查看部门是挖矿小分队员工姓名
  15. select name from staff
  16. where dep_id in
  17. (select id from department where name=\'挖矿小分队\');
  18. #结果
  19. +-----------+
  20. | name |
  21. +-----------+
  22. | 程咬金 |
  23. | 典韦 |
  24. +-----------+
  25. 2 rows in set (0.00 sec)
  26. ③查看不足1人的部门名(子查询得到的是有人的部门id)
  27. select name from department where id not in (select distinct dep_id from staff);
  28. #结果
  29. +--------+
  30. | name |
  31. +--------+
  32. | 运营 |
  33. +--------+
  34. 1 row in set (0.02 sec)
  35. 2. 带比较运算符的子查询
  36. #比较运算符:=、!=、>、>=、<、<=、<>
  37. ①查询大于所有人平均年龄的员工名与年龄
  38. mysql> select name,age from staff where age > (select avg(age) from staff);
  39. +--------+------+
  40. | name | age |
  41. +--------+------+
  42. | 典韦 | 118 |
  43. +--------+------+
  44. 1 row in set (0.00 sec)
  45. ②查询大于部门内平均年龄的员工名、年龄
  46. select t1.name,t1.age from staff t1
  47. inner join
  48. (select dep_id,avg(age) avg_age from staff group by dep_id) t2
  49. on t1.dep_id = t2.dep_id
  50. where t1.age > t2.avg_age;
  51. #结果
  52. +--------+------+
  53. | name | age |
  54. +--------+------+
  55. | 李白 | 38 |
  56. | 典韦 | 118 |
  57. +--------+------+
  58. 2 rows in set (0.04 sec)
  59. 3. EXISTS关键字的子查询
  60. EXISTS关字键字表示存在。在使用EXISTS关键字时,内层查询语句不返回查询的记录。
  61. 而是返回一个真假值。TrueFalse
  62. 当返回True时,外层查询语句将进行查询;当返回值为False时,外层查询语句不进行查询
  63. #department表中存在dept_id=203,Ture
  64. select * from staff
  65. where exists
  66. (select id from department where id=200);
  67. #结果
  68. +----+-----------+--------+------+--------+
  69. | id | name | sex | age | dep_id |
  70. +----+-----------+--------+------+--------+
  71. | 1 | 程咬金 | male | 38 | 200 |
  72. | 2 | 露娜 | female | 26 | 201 |
  73. | 3 | 李白 | male | 38 | 201 |
  74. | 4 | 王昭君 | female | 28 | 202 |
  75. | 5 | 典韦 | male | 118 | 200 |
  76. | 6 | 小乔 | female | 16 | 204 |
  77. +----+-----------+--------+------+--------+
  78. 6 rows in set (0.00 sec)
  79. #department表中存在dept_id=205,False
  80. mysql> select * from staff
  81. where exists
  82. (select id from department where id=204);
  83. Empty set (0.00 sec)

版权声明:本文为guokaifeng原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/guokaifeng/p/11192266.html