SQL--多表查詢(mysql)


SQL--多表查詢(mysql)

博客說明

文章所涉及的資料來自互聯網整理和個人總結,意在於個人學習和經驗匯總,如有什么地方侵權,請聯系本人刪除,謝謝!

笛卡爾積

  • 有兩個集合A,B .取這兩個集合的所有組成情況。
  • 要完成多表查詢,需要消除無用的數據

分類

內連接查詢

1. 從哪些表中查詢數據
2. 條件是什么
3. 查詢哪些字段
  1. 隱式內連接:

    使用where條件消除無用數據

    • 例子:

      * -- 查詢所有員工信息和對應的部門信息
      SELECT * FROM emp,dept WHERE emp.`dept_id` = dept.`id`;
      
      -- 查詢員工表的名稱,性別。部門表的名稱
      SELECT emp.name,emp.gender,dept.name FROM emp,dept WHERE emp.`dept_id` = dept.`id`;
      
      SELECT 
      	t1.name, -- 員工表的姓名
      	t1.gender,-- 員工表的性別
      	t2.name -- 部門表的名稱
      FROM
      	emp t1,
      	dept t2
      WHERE 
      	t1.`dept_id` = t2.`id`;
      
  2. 顯式內連接:

    • 語法: select 字段列表 from 表名1 [inner] join 表名2 on 條件

      SELECT * FROM emp INNER JOIN dept ON emp.`dept_id` = dept.`id`;
      
      SELECT * FROM emp JOIN dept ON emp.`dept_id` = dept.`id`;	
      

外鏈接查詢

  1. 左外連接:

    語法:select 字段列表 from 表1 left [outer] join 表2 on 條件;

    查詢的是左表所有數據以及其交集部分。

    -- 查詢所有員工信息,如果員工有部門,則查詢部門名稱,沒有部門,則不顯示部門名稱
    SELECT 	t1.*,t2.`name` FROM emp t1 LEFT JOIN dept t2 ON t1.`dept_id` = t2.`id`;
    
  2. 右外連接:

    語法:select 字段列表 from 表1 right [outer] join 表2 on 條件;

    查詢的是右表所有數據以及其交集部分。

    SELECT 	* FROM dept t2 RIGHT JOIN emp t1 ON t1.`dept_id` = t2.`id`;
    

子查詢

  • 概念:

    查詢中嵌套查詢,稱嵌套查詢為子查詢

    -- 查詢工資最高的員工信息
    -- 1 查詢最高的工資是多少 9000
    SELECT MAX(salary) FROM emp;
    
    -- 2 查詢員工信息,並且工資等於9000的
    SELECT * FROM emp WHERE emp.`salary` = 9000;
    
    -- 一條sql就完成這個操作。子查詢
    SELECT * FROM emp WHERE emp.`salary` = (SELECT MAX(salary) FROM emp);
    
  • 子查詢不同情況

    1. 子查詢的結果是單行單列的:

      • 子查詢可以作為條件,使用運算符去判斷。 運算符: > >= < <= =

        -- 查詢員工工資小於平均工資的人
        SELECT * FROM emp WHERE emp.salary < (SELECT AVG(salary) FROM emp);
        
    2. 子查詢的結果是多行單列的:

      • 子查詢可以作為條件,使用運算符in來判斷

        -- 查詢'財務部'和'市場部'所有的員工信息
        SELECT id FROM dept WHERE NAME = '財務部' OR NAME = '市場部';
        SELECT * FROM emp WHERE dept_id = 3 OR dept_id = 2;
        -- 子查詢
        SELECT * FROM emp WHERE dept_id IN (SELECT id FROM dept WHERE NAME = '財務部' OR NAME = '市場部');
        
    3. 子查詢的結果是多行多列的:

      • 子查詢可以作為一張虛擬表參與查詢

        -- 查詢員工入職日期是2011-11-11日之后的員工信息和部門信息
        -- 子查詢
        SELECT * FROM dept t1 ,(SELECT * FROM emp WHERE emp.`join_date` > '2011-11-11') t2
        WHERE t1.id = t2.dept_id;
        
        -- 普通內連接
        SELECT * FROM emp t1,dept t2 WHERE t1.`dept_id` = t2.`id` AND t1.`join_date` >  '2011-11-11'
        

感謝

黑馬程序員

以及勤勞的自己
關注公眾號: 歸子莫,獲取更多的資料,還有更長的學習計划


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM