1. 程式人生 > >數據庫學習之多表操作(三)

數據庫學習之多表操作(三)

同步 eat con varchar 字段 har 外連接 分享 技術

數據庫學習之多表操作

目錄

外鍵

  ——什麽是外鍵

  ——增加與刪除外鍵

INNODB支持的ON語句

多表查詢之連接查詢

  ——內連接:inner join

  ——外連接:left join與rihgt join

  ——全連接:full join

多表查詢之復合條件連接查詢

多表查詢之子查詢

以下內容為擴展和演示:http://www.cnblogs.com/yuanchenqi/articles/6357507.html

外鍵

什麽是外鍵

外鍵是用來關聯兩張表的。
切記:作為外鍵一定要和關聯主鍵的數據類型保持一致。
關聯外鍵的格式:[ADD CONSTRAINT charger_fk_stu]FOREIGN KEY (charger_id) REFERENCES ClassCharger(id)
--外鍵約束對子表的含義:   如果在父表中找不到候選鍵,則不允許在子表上進行insert/update

--外鍵約束對父表的含義:    在父表上進行update/delete以更新或刪除在子表中有一條或多條對
                    -- 應匹配行的候選鍵時,父表的行為取決於:在定義子表的外鍵時指定的
                    -- on update/on delete子句

  

每一個班主任會對應多個學生 , 而每個學生只能對應一個班主任
先準備兩張表:

父表:
CREATE TABLE ClassCharger(

       id TINYINT PRIMARY KEY auto_increment,
       name VARCHAR (20),
       age INT ,
       is_marriged boolean 
);

INSERT INTO ClassCharger (name,age,is_marriged) VALUES ("冰冰",29,0),
                                                       ("丹丹",30,0),
                                                       ("歪歪",27,0),
                                                       ("姍姍",20,0),
                                                       ("小雨",21,0);



子表:
CREATE TABLE Student(

       id INT PRIMARY KEY auto_increment,
       name VARCHAR (20),
       charger_id TINYINT,     --切記:作為外鍵一定要和關聯主鍵的數據類型保持一致
       FOREIGN KEY (charger_id) REFERENCES ClassCharger(id)

) ENGINE=INNODB;

INSERT INTO Student(name,charger_id) VALUES ("alvin1",2),
                                            ("alvin2",4),
                                            ("alvin3",1),
                                            ("alvin4",3),
                                            ("alvin5",1),
                                            ("alvin6",3),
                                            ("alvin7",2);

  

技術分享圖片

技術分享圖片

現在我們有5位老師,7位同學。

如果我們現在對老師的表進行操作,比如刪除某位老師,按道理來說,如果這位老師有管理的學生,就不能直接刪除,除非將他的學生刪除或者劃到其他老師管理下。

如果你沒有關聯的話,就沒有約束的對老師表做任何操作。

但是現在我們把老師表的id和學生表的charger_id關聯起來,你的操作就會受到限制。

技術分享圖片

增加外鍵和刪除外鍵

ALTER TABLE student  ADD CONSTRAINT abc
                     FOREIGN KEY(charger_id)
                     REFERENCES  classcharger(id);


ALTER TABLE student DROP FOREIGN KEY abc;

  

INNODB支持的ON語句

-----------------innodb支持的四種方式---------------------------------------

-----cascade方式 在父表上update/delete記錄時,同步update/delete掉子表的匹配記錄
-----外鍵的級聯刪除:如果父表中的記錄被刪除,則子表中對應的記錄自動被刪除--------

     FOREIGN KEY (charger_id) REFERENCES ClassCharger(id)
                              ON DELETE CASCADE


------set null方式 在父表上update/delete記錄時,將子表上匹配記錄的列設為null
   -- 要註意子表的外鍵列不能為not null

     FOREIGN KEY (charger_id) REFERENCES ClassCharger(id)
                              ON DELETE SET NULL


------Restrict方式 :拒絕對父表進行刪除更新操作(了解)

------No action方式 在mysql中同Restrict,如果子表中有匹配的記錄,則不允許對父表對應候選鍵
   -- 進行update/delete操作(了解)

  

多表查詢之連接查詢

-- 準備兩張表
-- company.employee
-- company.department

      create table employee(
      emp_id int auto_increment primary key not null,
      emp_name varchar(50),
      age int,
      dept_id int
      );

      insert into employee(emp_name,age,dept_id) values
        (‘A‘,19,200),
        (‘B‘,26,201),
        (‘C‘,30,201),
        (‘D‘,24,202),
        (‘E‘,20,200),
        (‘F‘,38,204);


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

    insert into department values
      (200,‘人事部‘),
      (201,‘技術部‘),
      (202,‘銷售部‘),
      (203,‘財政部‘);

  

技術分享圖片

內連接:inner join

查詢兩張表中都有的關聯數據,相當於利用條件從笛卡爾積結果中篩選出了正確的結果。

技術分享圖片

外連接:left join與rihgt join

(1)左外連接:在內連接的基礎上增加左邊有右邊沒有的結果

 select * from employee left join department on employee.dept_id = department.dept_id;

(2)右外連接:在內連接的基礎上增加右邊有左邊沒有的結果

 select * from employee RIGHT JOIN department on employee.dept_id = department.dept_id;

(3)全外連接:在內連接的基礎上增加左邊有右邊沒有的和右邊有左邊沒有的結果

    -- mysql不支持全外連接 full JOIN
    -- mysql可以使用此種方式間接實現全外連接
    
   select * from employee RIGHT JOIN department on employee.dept_id = department.dept_id
   UNION
   select * from employee LEFT JOIN department on employee.dept_id = department.dept_id;

  

技術分享圖片

技術分享圖片

技術分享圖片

全連接:full join(笛卡爾積查詢)

技術分享圖片

多表查詢之復合條件連接查詢

查詢員工年齡大於等於25歲的部門

    SELECT DISTINCT department.dept_name
    FROM employee,department
    WHERE employee.dept_id = department.dept_id
    AND age>25;


以內連接的方式查詢employee和department表,並且以age字段的升序方式顯示

    select employee.emp_id,employee.emp_name,employee.age,department.dept_name
    from employee,department
    where employee.dept_id = department.dept_id
    order by age asc;

  

多表查詢之子查詢

子查詢是將一個查詢語句嵌套在另一個查詢語句中。
內層查詢語句的查詢結果,可以為外層查詢語句提供查詢條件。
子查詢中可以包含:IN、NOT IN、ANY、ALL、EXISTS 和 NOT EXISTS等關鍵字
還可以包含比較運算符:= 、 !=、> 、<等

  

1. 帶IN關鍵字的子查詢
查詢employee表,但dept_id必須在department表中出現過

   select * from employee
            where dept_id IN
            (select dept_id from department);

  

2. 帶比較運算符的子查詢
=、!=、>、>=、<、<=、<>
查詢員工年齡大於等於25歲的部門
     select dept_id,dept_name from department
           where dept_id IN
          (select DISTINCT dept_id from employee where age>=25);

  

3. 帶EXISTS關鍵字的子查詢

EXISTS關字鍵字表示存在。在使用EXISTS關鍵字時,內層查詢語句不返回查詢的記錄。
而是返回一個真假值。Ture或False
當返回Ture時,外層查詢語句將進行查詢;當返回值為False時,外層查詢語句不進行查詢

     select * from employee
              WHERE EXISTS
              (SELECT dept_name from department where dept_id=203);

department表中存在dept_id=203,Ture


     select * from employee
                WHERE EXISTS
              (SELECT dept_name from department where dept_id=205);

     -- Empty set (0.00 sec)
    ps:  create table t1(select * from t2);

  

數據庫學習之多表操作(三)