MySQL數據庫基礎(多表關聯查詢、內外全連接、複合條件查詢、子查詢)


本篇文章主要介紹MySQL裏的多表關聯查詢,其中包括了笛卡爾積查詢、內連接查詢、外連接查詢、全連接查詢,另外還會介紹複合條件查詢和子查詢。

一、笛卡爾積查詢

1、首先創建表並插入數據
1)doctor表

--創建一個doctor表
create table doctor(
    doc_id int auto_increment primary key not null,
    doc_name varchar(50),
    age int,
    dept_id int
);

--給doctor插入數據
insert into doctor(doc_name,age,dept_id) values
        ('A',19,200),
        ('B',26,201),
        ('C',30,201),
        ('D',24,202),
        ('E',20,200),
        ('F',38,204);

2)department表

create table department(
    dept_id int,
    dept_name varchar(100)
);

--給department插入數據
insert into department values
      (200,'Lin'),
      (201,'Cure'),
      (202,'Check'),
      (203,'Found');

3)參考結果
1

2、笛卡爾積表
簡單來說就是將兩張表合在一起顯示出來,該表成爲笛卡爾積表(用處不大);
也就是說,如果A表裏有m條記錄,B表裏有n條記錄,那這樣取出來的表將有m✖n條記錄

SELECT * from doctor, department;

2

二、內、外、全連接查詢

1、內外全連接查詢關鍵字

  • 內連接:inner join
  • 外連接:left join, right join
  • 全連接:full join

2、內連接查詢(inner join):
通過對笛卡爾積表篩選後得到的表

--篩選doctor裏的dept_id與department裏的dept_id相對應的部分
SELECT * from doctor, department where doctor.dept_id=department.dept_id;

--如上例子,使用內連接查詢
--格式爲:(A inner join B on A.C=B.D)
SELECT * from doctor inner join department on doctor.dept_id=department.dept_id;

3
3、外連接查詢(left join, right join):

  • 通過對笛卡爾積表篩選後得到的表
  • left以左表爲主(不管右表是否有對應的值,都會顯示左表),right以右表爲主(同理)
  • 能匹配的就匹配上,不能匹配的置爲null
SELECT * from doctor left join department on doctor.dept_id=department.dept_id;

SELECT * from doctor right join department on doctor.dept_id=department.dept_id;

--篩選兩表dept_id相等的doctor的doc_name和department的dept_name
SELECT doctor.doc_name, department.dept_name from doctor right join department on doctor.dept_id=department.dept_id;

4

4、全連接查詢(full join):
但是在MySQL裏不支持這種寫法;
最主要的是,全連接基本用不上。不過可以用左右連接的拼接(UNION)來模擬全連接的效果

-- 模擬全連接
select * from doctor RIGHT JOIN department on doctor.dept_id = department.dept_id
   UNION
   select * from doctor LEFT JOIN department on doctor.dept_id = department.dept_id;

5

三、複合條件查詢

簡單來說就是多條件複合成一條複雜的select查詢語句

--查找所有Cure部(編號201)的doctor名字
SELECT doctor.doc_name, department.dept_name FROM doctor, department
WHERE doctor.dept_id=department.dept_id AND department.dept_name="Cure";

--找出大於25的doctor的名字和所在的部門
SELECT doctor.doc_name,department.dept_name FROM doctor, department
WHERE doctor.dept_id=department.dept_id AND doctor.age>25;

6

四、子查詢

1、查詢內容在A表,查詢條件在B表

--查詢doctor的dep_id在department的dep_id中出現過的doctor
SELECT * from doctor WHERE dept_id in (201,202,203,204);

但是以上把(201,202,203,204)給寫死了,不靈活,因此可以再查詢一遍得到department中所有的dep_id,也就是用到子查詢

2、子查詢
其實就是嵌套查詢,查詢裏面嵌套查詢(select裏套着select)

SELECT * from doctor WHERE dept_id in (SELECT dept_id from department);

兩種查詢結果當然也是一樣的:
7
這裏還有另外一些練習:

--創建表也可以用嵌套:得到doctor的字段信息和數據信息
CREATE table AA (SELECT * from doctor);

--嵌套查詢:大於25的doctor的所在的部門
SELECT dept_name from department
           WHERE department.dept_id IN
          (SELECT doctor.dept_id from doctor where doctor.age>=25);

五、EXIST判斷

  • EXISTS關字鍵字表示存在。在使用EXISTS關鍵字時,內層查詢語句不返回查詢的記錄
  • 而是返回一個真假值。True或False
  • 當返回True時,外層查詢語句將進行查詢;當返回值爲False時,外層查詢語句不進行查詢
--查詢doctor裏面是否存在dep_id=203的全部信息(如果存在就打印doctor的全部信息,這個案例裏是存在的)
select * from doctor
            WHERE EXISTS
            (SELECT dept_name from department where dept_id=203);
            
-- 查詢doctor裏面是否存在dep_id=205的全部信息(本案例中不存在)
select * from doctor
            WHERE EXISTS
            (SELECT dept_name from department where dept_id=205);

8

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章