1. 程式人生 > >15、集合查詢

15、集合查詢

學習目標

1、熟練掌握交集、並集、差集等結合查詢的使用

學習過程:

一、建立今天課程所需要的資料庫

1、建表

我們先設計今天要操作的表的結構,使用powerDesigner設計的E-R圖如下:

attcontent/a0e1482b-1e5f-4306-8447-c0a969de9834.png

2、生成sql語言如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

create table department 

(

   dep_id             INT                  not null,

   dep_name           VARCHAR(

200),

   constraint PK_DEPARTMENT primary key (dep_id)

);

 

create table employee 

(

   employee_id        int                  not 

null,

   dep_id             INT,

   employee_num       CHAR(10),

   employee_name      VARCHAR(50),

   salary             NUMBER(9,2),

   job_id             VARCHAR(200)         not null,

   constraint PK_EMPLOYEE primary key (employee_id)

);

 

create table job_history 

(

   his_id             INT                  not null,

   employee_id        int,

   job_id             VARCHAR(200),

   job_date           DATE,

   constraint PK_JOB_HISTORY primary key (his_id)

);

 

create table emp_result 

(

   emp_result_id          int                  not null,

   employee_id        int,

   emp_source_id          int,

   point              NUMBER(5,2),

   constraint PK_emp_result primary key (emp_result_id)

);

 

create table emp_source 

(

   emp_source_id          int                  not null,

   emp_source_name        VARCHAR2(100),

   constraint PK_emp_source primary key (emp_source_id)

);

 

alter table employee

   add constraint FK_EMPLOYEE_DEPARTME foreign key (dep_id)

      references department (dep_id);

 

alter table job_history

   add constraint FK_HIST_REFERENCE_EMPLOYEE foreign key (employee_id)

      references employee (employee_id);

 

alter table emp_result

   add constraint FK_Result_REFERENCE_EMPLOYEE foreign key (employee_id)

      references employee (employee_id);

 

alter table emp_result

   add constraint FK_Result_REFERENCE_Source foreign key (emp_source_id)

      references emp_source (emp_source_id);

3、初始化資料如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

insert into department(dep_id,DEP_NAME) values(1,'軟體開發部');

insert into department(dep_id,DEP_NAME) values(2,'銷售部門');

 

insert into employee(employee_id,DEP_ID,EMPLOYEE_NAME,SALARY,JOB_ID)  values(1,1,'劉德華',2500,'java程式設計師');

insert into employee(employee_id,DEP_ID,EMPLOYEE_NAME,SALARY,JOB_ID)  values(2,1,'張學友',6000,'DBA');

insert into employee(employee_id,DEP_ID,EMPLOYEE_NAME,SALARY,JOB_ID)  values(3,1,'謝霆鋒',2000,'網頁美工');

insert into employee(employee_id,DEP_ID,EMPLOYEE_NAME,SALARY,JOB_ID)  values(4,1,'奧巴馬',2000,'專案經理');

insert into employee(employee_id,DEP_ID,EMPLOYEE_NAME,SALARY,JOB_ID)  values(5,2,'劉備',6000,'銷售經理');

insert into employee(employee_id,DEP_ID,EMPLOYEE_NAME,SALARY,JOB_ID)  values(6,2,'張飛',1200,'業務員');

 

insert into JOB_HISTORY(HIS_ID,EMPLOYEE_ID,JOB_ID,JOB_DATE) values(1,1,'java程式設計師',to_date('2002-1-1','yyyy-mm-dd'));

insert into JOB_HISTORY(HIS_ID,EMPLOYEE_ID,JOB_ID,JOB_DATE) values(2,2,'DBA',to_date('2002-1-1','yyyy-mm-dd'));

insert into JOB_HISTORY(HIS_ID,EMPLOYEE_ID,JOB_ID,JOB_DATE) values(3,1,'java程式設計師',to_date('2012-1-1','yyyy-mm-dd'));

insert into JOB_HISTORY(HIS_ID,EMPLOYEE_ID,JOB_ID,JOB_DATE) values(4,1,'java程式設計師',to_date('2010-1-1','yyyy-mm-dd'));

insert into JOB_HISTORY(HIS_ID,EMPLOYEE_ID,JOB_ID,JOB_DATE) values(5,2,'DBA',to_date('2002-1-1','yyyy-mm-dd'));

 

insert into emp_source(EMP_SOURCE_ID,EMP_SOURCE_NAME) values(1,'語文');

insert into emp_source(EMP_SOURCE_ID,EMP_SOURCE_NAME) values(2,'數學');

 

insert into emp_result(EMP_RESULT_ID,EMPLOYEE_ID,EMP_SOURCE_ID,POINT) values(1,1,1,90);

insert into emp_result(EMP_RESULT_ID,EMPLOYEE_ID,EMP_SOURCE_ID,POINT) values(2,1,2,70);

insert into emp_result(EMP_RESULT_ID,EMPLOYEE_ID,EMP_SOURCE_ID,POINT) values(3,2,1,50);

insert into emp_result(EMP_RESULT_ID,EMPLOYEE_ID,EMP_SOURCE_ID,POINT) values(4,2,1,40);

大家可以先把表建好,插入初始化資料後再做進行學習。

二、集合查詢

我們先學習第一個比較簡單的內容就是資料庫的集合查詢,這裡集合和我們數學的集合論是一樣的。這裡主要學習的就是並、交、差幾個集合運算。如下圖:

attcontent/cbf5b50c-cc5b-4c78-83fe-530f8aab788a.png

如下面兩個查詢語句,第一個查詢員工表的員工id和工作id。

1

select employee_id ,job_id from employee

輸入為:

attcontent/c7cbbb00-ee49-45eb-b3e2-ce8a65b8d7eb.png

第二個查詢員工的工作記錄表的員工id和工作id。

 

select employee_id ,job_id from job_history 

attcontent/040ad201-5b7a-4dfc-aaa6-51586e60d992.png

 

 

下面分別對其進行集合運算

1、UNION並集運算子

UNION運算子從兩個查詢中返回消除重複之後的結果,注意union和union all的區別。

1

2

3

4

5

--union 去重複資料

--union all 不會去重複資料

select employee_id ,job_id from employee

union 

select employee_id ,job_id from job_history

輸入結果如下:

attcontent/4bb0e9f1-df34-425e-9ee7-e969eb96e240.png

2、INTERSECT交集運算子

交集就是顯示兩個集合都有資料,如下面的程式碼:

1

2

3

select employee_id ,job_id from employee

INTERSECT

select employee_id ,job_id from job_history

運算結果如下:

attcontent/bd90ec34-1a75-459b-9dc6-038c44f6f233.png

3、MINUS差集運算子

差集和上面介紹的兩個運算不同,它不滿足交換律,也就是說兩天查詢語句先後順序不同,得到的結果是不一樣的。如下面程式碼:

1

2

3

select employee_id ,job_id from employee

MINUS

select employee_id ,job_id from job_history

運算結果如下:

attcontent/5bc20110-47e2-42dc-9c86-ec0a8d0e8f8e.png