一.连接查询
继续使用Day_02的数据。
例如,查询部门和部门对应的员工信息。下面的这种查询中存在大量错误的数据,一般情况下不会直接使用这种查询。
笛卡尔积查询:查询两张表,其中一张表有m条记录,另一张表有n条记录,查询结果是m*n条。虽然笛卡尔积查询中包含大量的错误数据,但我们可以通过where子句将错误删除,保留下来的就是正确的数据。
也可以用以下查询语句代替。
二.左外连接查询
如果要查询其中一张表的所有记录,那么另一张表只显示对应的记录,没有则显示null。可以将左边表中的所有记录都查询出来,右边的表只显示和左边对应的数据,如果左边表中的某些记录在右边没有对应的数据,那么右边显示为null即可。
三.右外连接查询
可以将右边表中的所有记录都查询出来,左边表只显示和右边相对应的数据,如果右边表中的某些记录在左边没有对应的数据,那么显示为null。
四.全外连接
如果想将两张表中的所有数据都查询出来,即同时实现左外连接和右外连接的功能,可以使用全外连接查询,但是MySQL并不支持全外连接查询。因此我们可以使用union关键字将左外连接的结果和右外连接的结果合并在一起,并且union关键字会默认将两个查询中重复的记录去除,即可实现效果。但是有两个前提:
<1>两条SQL语句的查询结果的列数必须一致。
<2>两条SQL语句的查询结果的列名和顺序也必须一致。
五.子查询练习
准备新的数据库db40。
例1,列出薪资比王海涛的薪资还要高的所有员工,显示姓名与薪资。
<1>我们需要先求出员工王海涛的工资。
<2>将上述条件作为子条件,进行下一步查询。子查询并不需要加分号。
例2,列出和"刘沛霞"从事相同职位的所有员工,显示姓名和职位。
<1>先得知刘沛霞的职位。
<2>将上述条件作为子条件,进行下一步查询。
六.多表查询练习
例1,列出在"培优部"任职的员工,假定不知道"培优部"的部门编号,显示部门名称,员工姓名。我们需要将两张表连接起来。
例2,列出所有员工以及其上级,显示员工姓名,上级编号和上级姓名。
可以发现员工姓名和上级姓名有重叠的部分,在已知的emp表中仅仅显示了员工的姓名和上级的编号,同时员工也有可能是其余员工的上级。我们需要将表格进行重命名,用于区分员工表和上级表。将同样的一张emp表格,命名两次,分别为e1,e2。表的内容都相同。
例2,列出最低薪资大于1500的各种职位,显示职位和该职位的最低薪资。
需要用到筛选关键词having。这里提到where 和 having的区别:
<1>where是在分组之前对数据进行筛选过滤,而having是在分组之后。
<2>where子句中不能使用多行数据,也不能使用列别名,但是可以使用表别名。而having中可以试试用多行函数,也可以使用列别名和表别名。
例3,列出在每个部门就职的员工数量,平均工资。显示部门编号,员工数量和平均薪资。
例4,列出受雇日期遭遇直接上级的所有员工,显示员工编号,员工姓名和部门名称。
例5,查询员工表中薪资最高的员工信息。
相关文章
- 11-10练习
- 11-10编程练习
- 11-10c 语言练习__去掉多余的空白字符_修正
- 11-10针对JCC指令练习的堆栈图
- 11-10SQL练习题22:查找所有员工自入职以来的薪水涨幅情况,给出员工编号emp_no以及其对应的薪水涨幅growth,并按照growth进行升序
- 11-10python核心编程第六章练习6-13
- 11-10json相关的代码练习小结
- 11-10浙江大学计算机与软件学院2019年保研上机模拟练习
- 11-10递推与递归专题练习
- 11-10SQL练习