多表查询-----练习一
Posted lymhx
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多表查询-----练习一相关的知识,希望对你有一定的参考价值。
分类1:等值连接 vs 非等值连接
分类2:自连接 vs 非自连接
分类3:内连接 vs 外连接
【题目】 # 1.显示所有员工的姓名,部门号和部门名称。 # 2.查询90号部门员工的job_id和90号部门的location_id # 3.选择所有有奖金的员工的 last_name , department_name , location_id , city # 4.选择city在Toronto工作的员工的 last_name , job_id , department_id , department_name # 5.查询员工所在的部门名称、部门地址、姓名、工作、工资,其中员工所在部门的部门名称为’Executive’ # 6.选择指定员工的姓名,员工号,以及他的管理者的姓名和员工号,结果类似于下面的格式 employees Emp# manager Mgr# kochhar 101 king 100 # 7.查询哪些部门没有员工 # 8. 查询哪个城市没有部门 # 9. 查询部门名为 Sales 或 IT 的员工信息
# 1.显示所有员工的姓名,部门号和部门名称。 SELECT last_name,e.department_id,department_name FROM employees e LEFT JOIN departments d ON e.department_id=d.department_id; # 2.查询90号部门员工的job_id和90号部门的location_id SELECT job_id,location_id FROM employees e JOIN departments d ON e.department_id=d.department_id WHERE e.department_id=90; # 3.选择所有有奖金的员工的 last_name , department_name , location_id , city SELECT e.last_name,d.department_name,d.location_id,l.city FROM employees e LEFT JOIN departments d ON e.department_id=d.department_id LEFT JOIN locations l ON d.location_id=l.location_id WHERE commission_pct IS NOT NULL; # 4.选择city在Toronto工作的员工的 last_name , job_id , department_id , department_name SELECT e.last_name , e.job_id , d.department_id , d.department_name FROM employees e JOIN departments d ON e.department_id=d.department_id JOIN locations l ON d.location_id=l.location_id WHERE l.city=\'Toronto\'; # 5.查询员工所在的部门名称、部门地址、姓名、工作、工资,其中员工所在部门的部门名称为’Executive’ SELECT d.department_name,l.street_address,e.last_name,e.job_id,e.salary FROM employees e JOIN departments d ON e.department_id=d.department_id JOIN locations l ON d.location_id=l.location_id WHERE department_name=\'Executive\'; # 6.选择指定员工的姓名,员工号,以及他的管理者的姓名和员工号,结果类似于下面的格式 #employees Emp# manager Mgr# #kochhar 101 king 100 SELECT emp.last_name employees, emp.employee_id "Emp#", mgr.last_name manager, mgr.employee_id "Mgr#" FROM employees emp LEFT JOIN employees mgr ON emp.manager_id = mgr.employee_id; # 7.查询哪些部门没有员工 SELECT d.department_id FROM departments d LEFT JOIN employees e ON e.department_id = d.`department_id` WHERE e.department_id IS NULL; # 8. 查询哪个城市没有部门 SELECT l.location_id,l.city FROM locations l LEFT JOIN departments d ON l.`location_id` = d.`location_id` WHERE d.`location_id` IS NULL; # 9. 查询部门名为 Sales 或 IT 的员工信息 SELECT employee_id,last_name,department_name FROM employees e,departments d WHERE e.department_id = d.`department_id` AND d.`department_name` IN (\'Sales\',\'IT\');
ORACLE----多表查询语句练习
一.建表
1.建立两张表CLASSINFO,STUDENTINFO.
--建表CLASSINFO;
CREATE TABLE CLASSINFO ( CLASSID NUMBER(2) PRIMARY KEY, CLASSNAME VARCHAR(10) NOT NULL);
--建表STUDENTINFO;
CREATE TABLE STUDENTINFO ( STUDENTID NUMBER(2) PRIMARY KEY , STUDENTNAME CHAR(10) NOT NULL, STUDENTSEX CHAR(2) CHECK(STUDENTSEX=‘男‘ OR STUDENTSEX=‘女‘), STUDENTAGE NUMBER(2) NOT NULL, STUDENTTEL NUMBER(11) UNIQUE, STUDENTADDRESS VARCHAR(20) DEFAULT ‘上海‘, classid number(2) REFERENCES classinfo(classid));
2.在两张表中插入数据。
--表CLASSINFO;
INSERT INTO CLASSINFO (CLASSID,CLASSNAME) VALUES( 1,‘六班‘); INSERT INTO CLASSINFO (CLASSID,CLASSNAME) VALUES( 2,‘七班‘);
INSERT INTO STUDENTINFO VALUES (1,‘Timmy‘,‘男‘,20,‘13285601693‘,‘suzhou‘,1 ); ALTER TABLE STUDENTINFO MODIFY (STUDENTNAME CHAR(10) );--这里是来修改STUDETNAME字段的数据类型的长度。 INSERT INTO STUDENTINFO VALUES (2,‘Lizmer‘,‘男‘,25,‘18056947153‘,‘anhui‘,1 ); INSERT INTO STUDENTINFO VALUES (3,‘Gray‘,‘男‘,30,‘18056996153‘,‘hubei‘,2 ); INSERT INTO STUDENTINFO VALUES (4,‘Roger‘,‘男‘,31,‘18056886153‘,‘henan‘,2 );
3.在两张表中添加字段。
ALTER TABLE CLASSINFO ADD (Teacher char(20)); ALTER TABLE CLASSINFO ADD (Leader char(20)); ALTER TABLE STUDENTINFO ADD (SCORE NUMBER(20)); ALTER TABLE STUDENTINFO ADD (Teacher char(20));
4.在新添加的字段中添加数据。
UPDATE CLASSINFO SET Teacher=‘刘A‘ where CLASSID=‘2‘; UPDATE CLASSINFO SET Leader=‘陈B‘ where CLASSID=‘2‘; UPDATE STUDENTINFO SET Teacher=‘张I‘ where STUDENTID=‘4‘; UPDATE STUDENTINFO SET Leader=‘汤J‘ where STUDENTID=‘4‘; UPDATE STUDENTINFO SET SCORE=‘100‘ where STUDENTID=‘5‘;
5.表CLASSINFO和STUDENTINFO如下所示。
ps:score字段的添加和插入数据参考上例。
二.高级多表数据查询。
2.1 RANK() OVERORDER BY/ DENSE_RANK() OVERORDER BY/ RANK() OVER PARTITION BY ORDER BY;
##我们通常将group by叫做分组,而partition by称作分区,分组返回通常是一行,partition by返回的是多行。 SELECT STUDENTINFO.*,DENSE_RANK() OVER(ORDER BY STUDENTINFO.SCORE DESC ) AS RANKS FROM STUDENTINFO; SELECT STUDENTINFO.*,RANK() OVER(ORDER BY STUDENTINFO.SCORE DESC ) AS RANKS FROM STUDENTINFO; SELECT RANK() OVER(PARTITION BY STUDENTNAME ORDER BY STUDENTINFO.SCORE DESC ) AS RANKS FROM STUDENTINFO;--这里解释一下,假如Timmy有两次得分记录,那么上述语句就是对Timmy的得分排序。
以上是关于多表查询-----练习一的主要内容,如果未能解决你的问题,请参考以下文章