SQL非零基礎總結 - 02 集合運算、子查詢、表連接

2021-02-25 小崔CUI

本文是個人學習的一些總結,非零基礎教程;

適用於Oracle中的SQL語法,其他資料庫可能稍有差異。

二、集合運算

1. 併集

併集:將兩個數據集合整合到一起,將其展現出來,列名以第一個集合為準

UNION      UNION ALL  
SELECT * FROM ...UNION [ALL]SELECT * FROM ...;

2. 交集

交集:將兩個數據集合中重複的數據整合到一起,將其展現出來

SELECT * FROM ...INTERSECTSELECT * FROM ...;

3. 差集

差集:從當前集合中去掉後面集合中存在的數據,將其展現出來

SELECT * FROM ...MINUSSELECT * FROM ...;

集合操作,兩個集合的列名個數及數據類型需得一致,名稱可以不一樣

同列名的集合做運算時,列名永遠與第一個集合的列名相等

三、子查詢

1. 基本語法結構

-- 概念:在一個查詢語句中的某些位置,嵌套多個查詢語句
SELECT  (<單行單列> 子查詢)FROM (<單行單列><多行單列><單行多列><多行多列> 子查詢)WHERE (<單行單列><多行單列><單行多列><多行多列> 子查詢) --注意條件的使用、列的匹配程度、數據類型GROUP BY (/) --此處不可嵌套子查詢HAVING (<單行單列><多行單列><單行多列><多行多列> 子查詢)ORDER BY (<單行單列> 子查詢)

子查詢一般是一個完整的查詢語句

子查詢可以多層嵌套

可以在多個子句中加子查詢

經典面試題:

SELECT COUNT(1) FROM <table> GROUP BY <col> HAVING COUNT(col)>1;SELECT * FROM emp WHERE hiredate in (SELECT hiredate FROM emp                    GROUP BY hiredate HAVING COUNT(empno)>1);SELECT * FROM emp e1WHERE EXISTS (SELECT * FROM emp e2 WHERE e1.hiredate=e2.hiredate);

2. 相關子查詢與非相關子查詢

(1)相關子查詢

        相關子查詢就是把主查詢的值作為參數傳遞給子查詢

(2)不相關子查詢

  子句與主句互不幹涉,子句能夠單獨運行。

  非相關子查詢執行順序是先執行子查詢,再執行主查詢

3. IN/EXISTS

(1)IN + 子查詢

        當子查詢中表的數據量不大時,用IN 比較合適  

(2)EXISTS + 子查詢

        當子查詢中表的數據量過大時,用EXISTS 比較合適


SELECT empno,ename,jobFROM emp eWHERE EXISTS (SELECT loc FROM dept d WHERE loc = 'NEW YORK' AND e.deptno = d.deptno);SELECT empno,ename,jobFROM empWHERE deptno IN (SELECT deptno FROM dept WHERE loc = 'NEW YORK');

六、表連接

1. 笛卡爾積:

兩個表做笛卡爾積,得到的結果集的行數是兩個表的行數的乘積

SELECT Col_list FROM Table1, Table2;SELECT Col_list FROM Table1 CROSS JOIN Table2;

兩表中含有相同的列名

2. 外連接

(1)左外連接

        返回左表中的所有行,如果左表中的行在右表中沒有匹配行,則在右邊中相關欄位返回null值

SELECT Col_listFROM Table1 T1 LEFT [OUTER] JOIN Table2 T2 ON T1.Column = T2.ColumnFROM Table1,Table2 WHERE Table1.Column = Table2.Column(+)

(2)右外連接

        返回右表中所有的行,如果右表中的行在左表中沒有匹配行,則在左表中相關欄位返回null值

SELECT Col_listFROM Table1 T1 RIGHT [OUTER] JOIN Table2 T2 ON T1.Column = T2.ColumnFROM Table1,Table2 WHERE Table1.Column(+) = Table2.Column

(3)全外連接

        返回兩個表中所有的記錄數據,沒有匹配行的均顯示null值,是左外連接和右外連接的併集

SELECT Col_listFROM Table1 T1 FULL [OUTER] JOIN Table2 T2 ON T1.Column = T2.Column

3. 內連接

SELECT Col_listFROM Table1 T1 [INNER] JOIN Table2 T2 ON T1.Column = T2.Column

4. 自然連接

自動尋找相同的列做連接,去掉重複的列,形成的連接,並把比較列放在在前面

SELECT Col_listFROM Table1 T1 NATURAL JOIN Table2 T2

5. 自連接

如果在一個連接查詢中,涉及到的兩個表都是同一個表,這種查詢稱為自連接查詢

SELECT Col_listFROM Table1 T1 JOIN Table1 T2ON T1.Column = T2.Column
代替" ON + 條件 "按照括號內的列名進行關聯,並且把列名顯示在最前面SELECT Col_listFROM Table1 T1 JOIN Table2 T2 USING (Col_1, Col_2);

6. 不等連接

    連接條件是不等式

以上內容,均為個人學習總結,如有錯誤,歡迎留言指正!

相關焦點

  • 女朋友都能看懂的,SQL優化乾貨
    是從1開始計算,如果沒有找到就直接返回0 ,所以可以使用如下sql:select * from teacher where INSTR(name,'老師')>02、使用了in和not in,會全表掃描普通查詢:
  • 第02篇:SQL資料庫的四種基本操作「增刪改查」
    操作資料庫使用的是SQL語言,其全稱:結構化查詢語言(Structured Query Language)。這是一門標準的計算機語言,用來訪問和操作資料庫系統。其中,查詢的使用頻率最高且語法規則較多,是本章學習的重點和難點。二、SQL腳本其實通過工具也可以實現增刪改查,但通過SQL語句來實現相關操作效率更高。
  • Presto 分布式SQL查詢引擎及原理分析
    每個數據源連接都有一個名字,一個Catalog可以包含多個Schema,大家可以通過show catalogs 命令看到Presto已連接的所有數據源。2.Schema:相當於一個資料庫實例,一個Schema包含多張數據表。
  • MySQL怎麼刪除#sql開頭的臨時表
    注意: 此類表空間文件不能直接rm -f的方式物理刪除,因為該信息記錄在ibdata的共享表空間裡,直接刪除後,後續實例重啟時會出現錯誤。3. 處理方法3.1   同時存在.frm 和.ibd名稱相同的文件如果 #sql-*.ibd 和 #sql-*.frm兩個文件都存在數據目錄裡的話,可以直接drop table。
  • Python連接MySQL資料庫方法介紹(超詳細!手把手項目案例操作)
    連接MySQL查詢所有的數據,並輸出前2條數據的功能。2]: # 列印輸出前2條數據print (i)cur.close() # 關閉遊標conn.close() # 關閉連接上述代碼中,實現了通過Python連接MySQL查詢所有的數據,並輸出前2條數據的功能。
  • MySQL 的 in 查詢不走索引?我拿什麼拯救你!
    我想證明我是錯的,於是我到網上搜索了非常多的文章,什麼 MySQL 優化實戰,MySQL 軍規 36 條,30條SQL優化軍規,SQL語句優化原則,mysql語句優化建議,資料庫查詢優化方法總結等等有非常多的文章在描述,MySQL 中 in 查詢不走索引。 這些文章當中有些是 2018 年才發出來的,完全屬於誤導讀者。今天我們一起來看看 MySQL 的 in 查詢到底走不走索引?
  • 不懂就問:SQL 語句中 where 條件後 寫上1=1 是什麼意思
    SQL注入初次看到這種寫法的同學肯定很納悶,加不加where 1=1,查詢不都一樣嗎?例如:select *from customers;與select *from customerswhere 1=1;查詢出來的結果完全沒有區別呀。是的,上面的查詢結果是沒有區別,但是這並不是我們要添加它的目的。
  • 經典SQL面試題及答案分析
    id,c_name:課程名稱,t_id:教師id):4、成績表 score(s_id:學生id,c_id:課程id,score:分數)初始化數據的sql附在文章末尾挑戰1、查詢各科成績前三名的記錄>b.score思路:通過SELECT s_id,score,c_id FROM score WHERE c_id='01』和SELECT s_id,score,c_id FROM score WHERE c_id='02』的兩個臨時表聯查,得到每個學員的01、02課程成績情況:接下來,a.score
  • FreeSql 正式發布 1.10.1 版本
    ;十一、增加 BeginEdit/EndEdit 批量編輯數據的功能;十二、增加 父子表(樹表)遞歸查詢、刪除功能;增加 Firebird 資料庫實現它的體積比前輩、子查詢,只需要設置一次:public static AsyncLocal<Guid> TenantId { get; set; } = new AsyncLocal<Guid>();fsql.GlobalFilter .Apply<ISoftDelete>("name1"
  • 關於SQL注入教程
    開始教程: 什麼是SQL注入 sql注入:利用現有應用程式,將(惡意)的SQL命令注入到後臺資料庫執行一些惡意的操作
  • pandas常用操作總結!
    學習Python, 當然少不了pandas,pandas是python數據科學中的必備工具,熟練使用pandas是從sql boy/girl 跨越到一名優秀的數據分析師傅的必備技能。這篇pandas常用操作總結幫大家回顧下pandas的常用語法,尤其是我們分析數據時常用的方法。
  • 查詢 | 十二星座上升星座對照表
    - 09.22 )天秤座 ( 09.23 - 10.22 )天蠍座 ( 10.23 - 11.21 )射手座 ( 11.22 - 12.21 )摩羯座 ( 12.22 - 01.19 )水瓶座 ( 01.20 - 02.18 )雙魚座 ( 02.19 - 03.20 )而上升星座是你出生時,東方地平線與黃道交界處升起的第一個星座
  • Presto查詢執行過程和索引條件下推分析
    :獲取 Query 語句每一項值,構造 ValuesNode;TableSubQuery:處理可能存在的子查詢,並生成子查詢的執行計劃;邏輯計劃生成(JOIN)Left QueryPlan:處理 JOIN 左側的 QueryPlan
  • 月亮星座的查詢表
    如何使用月亮星座查詢表:  月亮星座查詢表日期以農曆來計算。  舉個例子來說明:如果一個人的太陽星座為金牛座,農曆生日為4月8日中午12:00,找07日15時30分-10日02時30分那一欄,對照的為獅子座,可知他的月亮星座為獅子,大家會算了嗎?  其實這只是個粗略的估計,它等於是把每個月當作29天來算。
  • LoaRunner性能測試系統學習教程:SQL Profiler監控查詢
    上期我們講到LoadRunner性能測如何跟蹤等待,這期我們講LoadRunner性能測試SQL profiler監控查詢。SQL Profiler監控查詢SQL Server Profiler是一個功能豐富的界面,用於創建和管理跟蹤並分析和重播跟蹤結果。對SQL Server Profiler的使用取決於您出於何種目的監視SQL Server資料庫引擎實例。