千家信息网

SQL基础之使用集合运算符进行多表查询(十二)

发表于:2024-12-05 作者:千家信息网编辑
千家信息网最后更新 2024年12月05日,集合操作:类型和注意事项集合操作注意事项在 SELECT 列表中的列名和表达式在数量上必须匹配第二个查询中的每一列的数据类型必须与第一个查询其对应的列的数据类型相匹配可以用括号来改变的执行顺序。ORD
千家信息网最后更新 2024年12月05日SQL基础之使用集合运算符进行多表查询(十二)

集合操作:类型和注意事项




集合操作注意事项

  • 在 SELECT 列表中的列名和表达式在数量上必须匹配

  • 第二个查询中的每一列的数据类型必须与第一个查询其对应的列的数据类型相匹配

  • 可以用括号来改变的执行顺序。

  • ORDER BY 子句:

- 只能在语句的最后出现

- 可以使用第一个查询中的列名,别名或相对位置


Oracle 服务器和集合操作符

  • 除 UNION ALL之外,系统会自动删除重复的记录

  • 列名为第一个查询返回的结果

  • 除 UNION ALL之外,系统自动按照第一个查询中的第一个列的升序排列


使用 UNION 操作符

1、显示当前和以前的工作的所有员工的详细信息。每个雇员只显示一次。

select employee_id, job_id

from employees

union

select employee_id, job_id

from job_history;


使用 UNION ALL 操作符

1、显示当前和以前的员工的所有部门。

select employee_id, job_id, department_id

from employees

union all

select employee_id, job_id, department_id

from job_history

order by employee_id;


使用 INTERSECT 操作符


显示员工ID和工作ID,当前的职称相同(也就是说,他们换工作但是现在已经回到以前同样的工作)。

select employee_id, job_id

from employees

intersect

select employee_id, job_id

from job_history;



使用 MINUS 操作符

1、显示员工表中一次都没有改变过工作的的员工ID

select employee_id

from employees

minus

select employee_id

from job_history;


相匹配的 SELECT 语句

  • 使用 UNION 操作符显示location_id,department_name,state_province

  • 当字段在一个或另一个表中不存在,必须匹配上数据类型(使用TO_CHAR函数或其他转换函数)


select location_id, department_name "Department",

to_char(null) "warehouse location"

from departments

union

select location_id, to_char(null) "Department",

state_province

from locations;


使用UNION操作符,显示雇员的ID,工作ID,和所有员工的工资

select employee_id, job_id,salary

from employees

union

select employee_id, job_id,0

from job_history;


集合操作中使用 ORDER BY 子句的注意事项

  • 复合查询中 ORDER BY 子句只能在结束时出现一次

  • 集合操作中每个查询不能有单独的 ORDER BY 子句

  • ORDER BY 子句中 只能识别第一个 SELECT 查询的列。

  • 默认情况下,第一列的第一个 SELECT 查询使用升序对输出进行排序。


请查询出所有的部门下没有 ST_CLERK 工种的 department_id,要求使用集合操作符

select department_id

from departments

minus

select department_id

from employees

where job_id not like 'ST_CLERK';


2、请使用集合操作符写一条 SQL,查出所有的没有部门坐落的国家的 country_id,country_name

select country_id,country_name

from countries

minus

select l.country_id,c.country_name

from locations l join countries c

on (l.country_id=c.country_id)

join departments d

on d.location_id=l.location_id;


3、请使用集合操作符写一条 SQL,查出部门号在 10,50,20 中的所有的 job_id,department_id,

并以 10,50,20 的排列顺序显示。

select distinct job_id,department_id

from employees

where department_id = 10

union all

select distinct job_id,department_id

from employees

where department_id= 50

union all

select distinct job_id,department_id

from employees

where department_id= 20;


4、请查出所有工作发生过变动,但是多次变动后现在的工作是做的以前做过的工作的员工的employee_id 和 job_id


select employee_id,job_id

from employees

intersect

select employee_id,job_id

from job_history;


5、HR 部门的同事希望你能够帮助他们生成一个报告,要求满足以下 2 点:

a)从 EMPLOYEES 表中获得所有员工的 last_name 和 department_id(不管是否属于同一个部门)

b)从 DEPARTMENTS 表中获得所有的 department_id 和 department_name(不管是否该部门有员工)

select last_name,department_id,to_char(null) dept_name

from employees

union

select to_char(null),department_id,department_name

from departments;


LAST_NAME DEPARTMENT_ID DEPT_NAME

------------------------- ------------- ------------------------------

Abel 80

Ande 80

Atkinson 50

Austin 60

Baer 70

Baida 30

Banda 80

Bates 80

Bell 50

Bernstein 80

Bissot 50

Bloom 80

Bull 50

Cabrio 50

Cambrault 80

Chen 100

Chung 50

Colmenares 30

Davies 50

De Haan 90

Dellinger 50

Dilly 50

Doran 80

Ernst 60

Errazuriz 80

Everett 50

Faviet 100

Fay 20

Feeney 50

Fleaur 50

Fox 80

Fripp 50

Gates 50

Gee 50

Geoni 50

Gietz 110

Grant 50

Grant

Greenberg 100

Greene 80

Hall 80

Hartstein 20

Higgins 110

Himuro 30

Hunold 60

Hutton 80

Johnson 80

Jones 50

Kaufling 50

Khoo 30

King 80

King 90

Kochhar 90

Kumar 80

Ladwig 50

Landry 50

Lee 80

Livingston 80

Lorentz 60

Mallin 50

Markle 50

Marlow 50

Marvins 80

Matos 50

Mavris 40

McCain 50

McEwen 80

Mikkilineni 50

Mourgos 50

Nayer 50

OConnell 50

Olsen 80

Olson 50

Ozer 80

Partners 80

Pataballa 60

Patel 50

Perkins 50

Philtanker 50

Popp 100

Rajs 50

Raphaely 30

Rogers 50

Russell 80

Sarchand 50

Sciarra 100

Seo 50

Sewall 80

Smith 80

Stiles 50

Sullivan 50

Sully 80

Taylor 50

Taylor 80

Tobias 30

Tucker 80

Tuvault 80


LAST_NAME DEPARTMENT_ID DEPT_NAME

------------------------- ------------- ------------------------------

Urman 100

Vargas 50

Vishney 80

Vollman 50

Walsh 50

Weiss 50

Whalen 10

Zlotkey 80

10 Administration

20 Marketing

30 Purchasing

40 Human Resources

50 Shipping

60 IT

70 Public Relations

80 Sales

90 Executive

100 Finance

110 Accounting

120 Treasury

130 Corporate Tax

140 Control And Credit

150 Shareholder Services

160 Benefits

170 Manufacturing

180 Construction

190 Contracting

200 Operations

210 IT Support

220 NOC

230 IT Helpdesk

240 Government Sales

250 Retail Sales

260 Recruiting

270 Payroll

0