日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

读书:SQL必知必会

發(fā)布時間:2023/12/20 数据库 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 读书:SQL必知必会 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

第 1 課 了解 SQL

知識點:
1.數(shù)據(jù)庫(database):保存有組織的數(shù)據(jù)的容器(通常是一個文件或一組文件)

2.注意:人們通常用數(shù)據(jù)庫這個術(shù)語來代表他們使用的數(shù)據(jù)庫軟件,這是不正
確的,也因此產(chǎn)生了許多混淆。
確切地說,數(shù)據(jù)庫軟件應(yīng)稱為數(shù)據(jù)庫管理系統(tǒng)(DBMS)。數(shù)據(jù)庫是通過 DBMS 創(chuàng)建和操縱的容器,而具體它究竟是什么,形式如何,各種數(shù)據(jù)庫都不一樣。

3.表(table):某種特定類型數(shù)據(jù)的結(jié)構(gòu)化清單

4.表名:使表名成為唯一的,實際上是數(shù)據(jù)庫名和表名等的組合。
有的數(shù)據(jù)庫還使用數(shù)據(jù)庫擁有者的名字作為唯一名的一部分。
也就是說,雖然在相同數(shù)據(jù)庫中不能兩次使用相同的表名,但在不同的數(shù)據(jù)庫中完全可以使用相同的表名

5.模式:描述表的這組信息就是所謂的模式(schema),模式可以用來描述數(shù)據(jù)庫中特定的表,也可以用來描述整個數(shù)據(jù)庫(和其中表的關(guān)系)。

6.列(column):表中的一個字段。所有表都是由一個或多個列組成的。

7.數(shù)據(jù)類型:數(shù)據(jù)庫中每個列都有相應(yīng)的數(shù)據(jù)類型。
數(shù)據(jù)類型(datatype)定義了列可以存儲哪些數(shù)據(jù)種類。
例如,如果列中存儲的是數(shù)字(或許是訂單中的物品數(shù)),則相應(yīng)的數(shù)據(jù)類型應(yīng)該為數(shù)值類型。如果列中存儲的是日期、文本、注釋、金額等,則應(yīng)該規(guī)定好恰當?shù)臄?shù)據(jù)類型。

8.行(row):表中的一個記錄(也可以說是數(shù)據(jù)庫記錄(record))

9.主鍵(primary key):一列(或一組列),其值能夠唯一標識表中每一行

10.什么是 SQL——SQL(發(fā)音為字母 S-Q-L 或 sequel)是 Structured Query Language(結(jié)構(gòu)化查詢語言)的縮寫。SQL 是一種專門用來與數(shù)據(jù)庫溝通的語言。
目的:提供一種從數(shù)據(jù)庫中讀寫數(shù)據(jù)的簡單有效的方法

第 2 課 檢索數(shù)據(jù)

2.1 SELECT 語句

1.檢索單個列

SELECT prod_name FROM Products;

注意:多條 SQL 語句必須以分號(;)分隔,
SQL 語句不區(qū)分大小寫,因此 SELECT 與 select 是相同的
在處理 SQL 語句時,其中所有空格都被忽略。

三種寫法相同 SELECT prod_name FROM Products;SELECT prod_name FROM Products;SELECT prod_name FROM Products;

2.檢索多個列

SELECT prod_id, prod_name, prod_price FROM Products;

3.檢索所有列

SELECT * FROM Products;

使用通配符
一般而言,除非你確實需要表中的每一列,否則最好別使用*通配符。
雖然使用通配符能讓你自己省事,不用明確列出所需列,但檢索不需
要的列通常會降低檢索和應(yīng)用程序的性能

檢索未知列
使用通配符有一個大優(yōu)點。由于不明確指定列名(因為星號檢索每一
列),所以能檢索出名字未知的列

4.檢索不同的值:DISTINCT 關(guān)鍵字,它指示數(shù)據(jù)庫只返回不同的值

不能部分使用 DISTINCT
DISTINCT 關(guān)鍵字作用于所有的列,不僅僅是跟在其后的那一列。例
如,你指定 SELECT DISTINCT vend_id, prod_price,除非指定的
兩列完全相同,否則所有的行都會被檢索出來。

5.限制結(jié)果:TOP 關(guān)鍵字來限制最多返回多少行

SELECT TOP 5 prod_name FROM Products; 前五條數(shù)據(jù)

每種數(shù)據(jù)庫的限制有所不同,我這里在學(xué)習(xí)mysql
限制;使用 MySQL、MariaDB、PostgreSQL 或者 SQLite,需要使用 LIMIT子句

SELECT prod_name FROM Products LIMIT 5 OFFSET 5;

以我的為例,我的數(shù)據(jù):

SELECT * FROM task_tasks ORDER BY taskid LIMIT 5,1 limit X,Y 中X表示跳過X個數(shù)據(jù),讀取Y個數(shù)據(jù)


SELECT * FROM task_tasks ORDER BY taskid LIMIT 5 OFFSET 3 offset X是跳過X個數(shù)據(jù),limit Y是選取Y個數(shù)據(jù)


6.使用注釋:注釋使用-- (兩個連字符)嵌在行內(nèi)。-- 之后的文本就是注釋 SELECT prod_name -- 這是一條注釋 FROM Products;

第 3 課 排序檢索數(shù)據(jù)

1.子句(clause)
SQL 語句由子句構(gòu)成,有些子句是必需的,有些則是可選的。一個子
句通常由一個關(guān)鍵字加上所提供的數(shù)據(jù)組成。子句的例子有我們在前
一課看到的 SELECT 語句的 FROM 子句。

2.ORDER BY 子句取一個或多個列的名字,據(jù)此對輸出進行排序。
3.排序數(shù)據(jù)

SELECT prod_name FROM Products ORDER BY prod_name;

ORDER BY 子句的位置
在指定一條 ORDER BY 子句時,應(yīng)該保證它是 SELECT 語句中最后一條子句。
如果它不是最后的子句,將會出現(xiàn)錯誤消息。

4.按多個列排序

SELECT prod_id, prod_price, prod_name FROM Products ORDER BY prod_price, prod_name; 檢索 3 個列,并按其中兩個列對結(jié)果進行排序——首先按價 格,然后按名稱排序 多個列排序應(yīng)用在:姓名排序—首先按姓排序,然后在每個姓中再按名排序

5.按列位置排序—不懂

按列位置排序 SELECT prod_id, prod_price, prod_name FROM Products ORDER BY 2, 3; SELECT 清單中指定的是選擇列的相對位置而不是列名。ORDER BY 2 表示按 SELECT 清單中的第二個列 prod_name 進行排序。ORDER BY 2, 3 表示先按 prod_price,再按 prod_name 進行排序



6.指定排序方向
升序—默認的排序順序(ASC為升序,也可以指定)
降序—DESC
DESC關(guān)鍵字只應(yīng)用到直接位于其前面的列名

SELECT prod_id, prod_price, prod_name FROM Products ORDER BY prod_price DESC; SELECT prod_id, prod_price, prod_name FROM Products ORDER BY prod_price DESC, prod_name; DESC關(guān)鍵字只應(yīng)用到直接位于其前面的列名。 在上例中,只對prod_price列指定 DESC,對 prod_name 列不指定。 因此,prod_price 列以降序排序, 而 prod_name 列(在每個價格內(nèi))仍然按標準的升序排序

在多個列上降序排序如果想在多個列上進行降序排序,必須對每一列指定 DESC 關(guān)鍵字

第 4 課 過濾數(shù)據(jù)

  • 使用 WHERE 子句

  • 只檢索所需數(shù)據(jù)需要指定搜索條件(search criteria),搜索條件也稱為過濾條件

  • 在 SELECT 語句中,數(shù)據(jù)根據(jù) WHERE 子句中指定的搜索條件進行過濾。WHERE 子句在表名(FROM 子句)之后給出

  • SELECT prod_name, prod_price FROM Products WHERE prod_price = 3.49;
  • WHERE 子句的位置:在同時使用 ORDER BY 和 WHERE 子句時,應(yīng)該讓 ORDER BY 位于WHERE 之后,否則將會產(chǎn)生錯誤
  • WHERE 子句操作符
  • 檢查單個值
  • SELECT prod_name, prod_price FROM Products WHERE prod_price < 10; 列出所有價格小于 10 美元的產(chǎn)品。
  • 不匹配檢查
  • SELECT vend_id, prod_name FROM Products WHERE vend_id <> 'DLL01'; 列出所有不是供應(yīng)商 DLL01 制造的產(chǎn)品 兩個效果相同 SELECT vend_id, prod_name FROM Products WHERE vend_id != 'DLL01';
  • 何時使用引號
    如果仔細觀察上述 WHERE 子句中的條件,會看到有的值括在單引號內(nèi),
    而有的值未括起來。單引號用來限定字符串。如果將值與字符串類型的
    列進行比較,就需要限定引號。用來與數(shù)值列進行比較的值不用引號
  • 范圍值檢查:BETWEEN 操作符(需要兩個值,即范圍的開始值和結(jié)束值)
  • SELECT prod_name, prod_price FROM Products WHERE prod_price BETWEEN 5 AND 10; 檢索價格在 5 美元和 10美元之間的所有產(chǎn)品
  • 空值檢查
    在創(chuàng)建表時,表設(shè)計人員可以指定其中的列能否不包含值。
    在一個列不包含值時,稱其包含空值 NULL
    NULL:無值(no value),它與字段包含 0、空字符串或僅僅包含空格不同
  • SELECT prod_name FROM Products WHERE prod_price IS NULL; 返回所有沒有價格(空 prod_price 字段,不是價格為 0)的產(chǎn)品
  • NULL 和非匹配
    通過過濾選擇不包含指定值的所有行時,你可能希望返回含 NULL 值
    的行。但是這做不到。因為未知(unknown)有特殊的含義,數(shù)據(jù)庫
    不知道它們是否匹配,所以在進行匹配過濾或非匹配過濾時,不會返
    回這些結(jié)果。
    過濾數(shù)據(jù)時,一定要驗證被過濾列中含 NULL 的行確實出現(xiàn)在返回的
    數(shù)據(jù)中。
  • 第 5 課 高級數(shù)據(jù)過濾

  • 組合 WHERE 子句
    SQL 允許給出多個 WHERE 子句。這些子句有兩種使用方式,
    即以 AND 子句或 OR 子句的方式使用
  • 操作符(operator):用來聯(lián)結(jié)或改變 WHERE 子句中的子句的關(guān)鍵字,也稱為邏輯操作符(logical operator)
  • AND操作符:要通過不止一個列進行過濾,可以使用 AND 操作符給 WHERE 子句附加條件(and后的條件要連著where都滿足才能篩選出結(jié)果)
  • SELECT prod_id, prod_price, prod_name FROM Products WHERE vend_id = 'DLL01' AND prod_price <= 4;
  • AND:用在 WHERE 子句中的關(guān)鍵字,用來指示檢索滿足所有給定條件的行(子句只包含一個 AND 子句,因此最多有兩個過濾條件)
  • SELECT * FROM task_tasks WHERE `status`=1 AND userid=1 ORDER BY builddate

  • OR操作符:OR 操作符與 AND 操作符正好相反,它指示 DBMS 檢索匹配任一條件的行【事實上,許多 DBMS 在 OR WHERE 子句的第一個條件得到滿足的情況下,就不再計算第二個條件了(在第一個條件滿足時,不管第二個條件是否滿足,相應(yīng)的行都將被檢索出來)。】
  • SELECT prod_name, prod_price FROM Products WHERE vend_id = 'DLL01' OR vend_id = ‘BRS01’;

  • 求值順序
  • SELECT prod_name, prod_price FROM Products WHERE vend_id = 'DLL01' OR vend_id = 'BRS01' AND prod_price >= 10; 需要列出價格為10美元及以上,且由DLL01或BRS01 制造的所有產(chǎn)品 SELECT * FROM task_tasks WHERE taskname='旅游' OR taskname='哈哈哈1' AND builddate ='2007-03-06'

  • 在 WHERE 子句中使用圓括號
    任何時候使用具有 AND 和 OR 操作符的 WHERE 子句,都應(yīng)該使用圓括號明確地分組操作符。
    不要過分依賴默認求值順序,即使它確實如你希望的那樣。
    使用圓括號沒有什么壞處,它能消除歧義

  • IN 操作符:IN 操作符用來指定條件范圍,范圍中的每個條件都可以進行匹配。IN 取一組由逗號分隔、括在圓括號中的合法值
  • SELECT prod_name, prod_price FROM Products WHERE vend_id IN ( 'DLL01', 'BRS01' ) ORDER BY prod_name; 此 SELECT 語句檢索由供應(yīng)商 DLL01 和 BRS01 制造的所有產(chǎn)品。 IN 操作符后跟由逗號分隔的合法值,這些值必須括在圓括號中。你可能會猜測 IN 操作符完成了與 OR 相同的功能,恭喜你猜對了!下面 的 SQL 語句完成與上面的例子相同的工作 SELECT prod_name, prod_price FROM Products WHERE vend_id = 'DLL01' OR vend_id = 'BRS01' ORDER BY prod_name;
  • IN操作符:WHERE 子句中用來指定要匹配值的清單的關(guān)鍵字,功能與 OR 相當。
  • NOT 操作符
    WHERE 子句中的 NOT 操作符有且只有一個功能,那就是否定其后所跟的任何條件。因為 NOT 從不單獨使用(它總是與其他操作符一起使用),所以它的語法與其他操作符有所不同。NOT 關(guān)鍵字可以用在要過濾的列前,而不僅是在其后
  • NOT操作符:WHERE 子句中用來否定其后條件的關(guān)鍵字
  • SELECT prod_name FROM Products WHERE NOT vend_id = 'DLL01' ORDER BY prod_name; 列出除 DLL01 之外的所有供應(yīng)商制造的產(chǎn)品上面的例子也可以使用<>操作符來完成 SELECT prod_name FROM Products WHERE vend_id <> 'DLL01' ORDER BY prod_name; SELECT * FROM task_tasks WHERE NOT `status`=1 ORDER BY builddate

  • NOT優(yōu)勢:在與 IN 操作符聯(lián)合使用時,NOT 可以非常簡單地找出與條件列表不匹配的行。
  • 第 6 課 用通配符進行過濾

    通配符:百分號(%)、下劃線(_)、方括號([ ])、(+)或(||)、

  • LIKE 操作符
    通配符(wildcard)
    用來匹配值的一部分的特殊字符
    搜索模式(search pattern)
    由字面值、通配符或兩者組合構(gòu)成的搜索條件。
  • 通配符本身實際上是 SQL 的 WHERE 子句中有特殊含義的字符,SQL 支持
    幾種通配符。
    為在搜索子句中使用通配符,必須使用 LIKE 操作符。LIKE指示 DBMS,后跟的搜索模式利用通配符匹配而不是簡單的相等匹配進行比較
    注意:通配符搜索只能用于文本字段(字符串),非文本數(shù)據(jù)類型字段不能使用通配符搜索。
  • 百分號(%)通配符:最常使用的通配符是百分號(%)。在搜索串中,%表示任何字符出現(xiàn)任意次數(shù)
  • SELECT prod_id, prod_name FROM Products WHERE prod_name LIKE 'Fish%'; 找出所有以詞 Fish 起頭的產(chǎn)品 SELECT * FROM task_tasks WHERE taskname LIKE '%放假%'

  • Access 通配符:如果使用的是 Microsoft Access,需要使用*而不是%
  • 區(qū)分大小寫
    根據(jù) DBMS 的不同及其配置,搜索可以是區(qū)分大小寫的。如果區(qū)分大小寫,則’fish%'與 Fish bean bag toy 就不匹配
  • 通配符可在搜索模式中的任意位置使用,并且可以使用個通配符
  • 搜索模式'%bean bag%'表示匹配任何位置上包含文本 bean bag 的值,
    不論它之前或之后出現(xiàn)什么字符
    注意:需要特別注意,除了能匹配一個或多個字符外,%還能匹配 0 個字符。%代表搜索模式中給定位置的 0 個、1 個或多個字符
    請注意 NULL
    通配符%看起來像是可以匹配任何東西,但有個例外,這就是 NULL。
    子句 WHERE prod_name LIKE '%'不會匹配產(chǎn)品名稱為 NULL 的行
  • 下劃線(_)通配符:下劃線的用途與%一樣,但它只匹配單個字符,而不是多個字符
  • SELECT prod_id, prod_name FROM Products WHERE prod_name LIKE '__ inch teddy bear';

    SELECT * FROM task_tasks WHERE taskname LIKE '放_'

    一個下劃線占一位 SELECT * FROM task_tasks WHERE taskname LIKE '放假__'


    與%能匹配 0 個字符不同,_總是剛好匹配一個字符,不能多也不能少

  • 方括號([ ])通配符:用來指定一個字符集,它必須匹配指定位置(通配符的位置)的一個字符
  • 并不總是支持集合
    與前面描述的通配符不一樣,并不是所有 DBMS 都支持用來創(chuàng)建集合的[]。只有微軟的 Access 和 SQL Server 支持集合。為確定你使用的DBMS 是否支持集合,請參閱相應(yīng)的文檔。
  • FROM Customers WHERE cust_contact LIKE '[JM]%' ORDER BY cust_contact;


    第 7 課 創(chuàng)建計算字段

  • 計算字段并不實際存在于數(shù)據(jù)庫表中。計算字段是運行時在 SELECT 語句內(nèi)
    創(chuàng)建的
  • 字段(field)
    基本上與列(column)的意思相同,經(jīng)常互換使用,不過數(shù)據(jù)庫列一般稱為列,而術(shù)語字段通常與計算字段一起使用
    需要特別注意,只有數(shù)據(jù)庫知道 SELECT 語句中哪些列是實際的表列,哪些列是計算字段。從客戶端(如應(yīng)用程序)來看,計算字段的數(shù)據(jù)與其他列的數(shù)據(jù)的返回方式相同
  • 拼接字段—解決辦法是把兩個列拼接起來:加號(+)或兩個豎杠(||)表示
    拼接(concatenate):將值聯(lián)結(jié)到一起(將一個值附加到另一個值)構(gòu)成單個值
  • SELECT vend_name + ' (' + vend_country + ')' FROM Vendors ORDER BY vend_name; ----------------------- SELECT vend_name || ' (' || vend_country || ')' FROM Vendors ORDER BY vend_name; ----------------- 許多數(shù)據(jù)庫(不是所有)保存填充為列寬的文本值,而實際上你要的結(jié)果不需要這些空格。 為正確返回格式化的數(shù)據(jù),必須去掉這些空格。這可以使用 SQL 的 RTRIM()函數(shù)來完成 SELECT RTRIM(vend_name) + ' (' + RTRIM(vend_country) + ')' FROM Vendors ORDER BY vend_name; RTRIM()函數(shù)去掉值右邊的所有空格。


    去除空格之后的輸出

  • TRIM 函數(shù)
    大多數(shù) DBMS 都支持 RTRIM()(正如剛才所見,它去掉字符串右邊的空格)、LTRIM()(去掉字符串左邊的空格)以及 TRIM()(去掉字符串左右兩邊的空格)。
  • 別名(alias)是一個字段或值的替換名。別名用 AS 關(guān)鍵字賦予
  • SELECT taskid AS '任務(wù)id' , taskname AS '任務(wù)名稱' , `status` AS'完成情況', userid AS '用戶id', builddate as '創(chuàng)建任務(wù)日期'FROM task_tasks

  • 執(zhí)行算術(shù)計算
    計算字段的另一常見用途是對檢索出的數(shù)據(jù)進行算術(shù)計算
  • SELECT prod_id, quantity, item_price FROM OrderItems WHERE order_num = 20008; Orders 表包含收到的所有訂單,OrderItems 表包含每個訂單中的各項物品 檢索訂單號 20008 中的所有物品

    第 8 課 使用函數(shù)處理數(shù)據(jù)

    • 函數(shù):與大多數(shù)其他計算機語言一樣,SQL 也可以用函數(shù)來處理數(shù)據(jù)
    • 可移植(portable):所編寫的代碼可以在多個系統(tǒng)上運行
    • 使用函數(shù)
      使用函數(shù)的一些情況:
      ? 用于處理文本字符串(如刪除或填充值,轉(zhuǎn)換值為大寫或小寫)的文本函數(shù)。
      ? 用于在數(shù)值數(shù)據(jù)上進行算術(shù)操作(如返回絕對值,進行代數(shù)運算)的數(shù)值函數(shù)。
      ? 用于處理日期和時間值并從這些值中提取特定成分(如返回兩個日期之差,檢查日期有效性)的日期和時間函數(shù)。
      ? 返回 DBMS 正使用的特殊信息(如返回用戶登錄信息)的系統(tǒng)函數(shù)

    4-1.文本處理函數(shù)

    • 使用 RTRIM()函數(shù)來去除列值右邊的空格
    • 使用的是 UPPER()函數(shù)-UPPER()將文本轉(zhuǎn)換為大寫

      4-2.日期和時間處理函數(shù)
    SELECT order_num FROM Orders WHERE DATEPART(yy, order_date) = 2012;

    這個例子(SQL Server和Sybase版本以及Access版本)使用了DATEPART()函數(shù),顧名思義,此函數(shù)返回日期的某一部分。
    DATEPART()函數(shù)有兩個參數(shù),它們分別是返回的成分和從中返回成分的日期。
    在此例子中,DATEPART()只從 order_date 列中返回年份。通過與 2012 比較,WHERE子句只過濾出此年份的訂單

    使用名為 DATE_PART()的類似函數(shù)的 PostgreSQL 版本 SELECT order_num FROM Orders WHERE DATE_PART('year', order_date) = 2012;

    4-3.數(shù)值處理函數(shù)

    第 9 課 匯總數(shù)據(jù)

  • 聚集函數(shù)(aggregate function):對某些行運行的函數(shù),計算并返回一個值
    都需要匯總表中的數(shù)據(jù),而不需要實際數(shù)據(jù)本身

  • AVG()函數(shù):過對表中行數(shù)計數(shù)并計算其列值之和,求得該列的平均值
    AVG()可用來返回所有列的平均值,也可以用來返回特定列或行的平均值

  • SELECT AVG(`status`) FROM task_tasks

  • 只用于單個列
    AVG()只能用來確定特定數(shù)值列的平均值,而且列名必須作為函數(shù)參數(shù)給出。
    為了獲得多個列的平均值,必須使用多個 AVG()函數(shù)。

  • NULL 值:AVG()函數(shù)忽略列值為 NULL 的行

  • COUNT()函數(shù):行計數(shù)。可利用 COUNT()確定表中行的數(shù)目或符合特定條件的行的數(shù)目

  • COUNT()函數(shù)有兩種使用方式:
    ? 使用 COUNT(*)對表中行的數(shù)目進行計數(shù),不管表列中包含的是空值(NULL)還是非空值
    ? 使用 COUNT(column)對特定列中具有值的行進行計數(shù),忽略 NULL 值。

  • SELECT COUNT(taskid) FROM task_tasks

    SELECT COUNT(*) FROM task_tasks

  • NULL 值
    如果指定列名,則 COUNT()函數(shù)會忽略指定列的值為空的行,
    但如果COUNT()函數(shù)中用的是星號(*),則不忽略
  • MAX()函數(shù):返回指定列中的最大值
  • SELECT MAX(`status`) FROM task_tasks

  • 對非數(shù)值數(shù)據(jù)使用 MAX()
    雖然 MAX()一般用來找出最大的數(shù)值或日期值,但許多(并非所有)DBMS 允許將它用來返回任意列中的最大值,包括返回文本列中的最大值。
    在用于文本數(shù)據(jù)時,MAX()返回按該列排序后的最后一行
  • NULL 值:MAX()函數(shù)忽略列值為 NULL 的行
  • MIN()函數(shù):返回指定列的最小值
  • SELECT MIN(`status`) FROM task_tasks

  • 對非數(shù)值數(shù)據(jù)使用 MIN()
    雖然 MIN()一般用來找出最小的數(shù)值或日期值,但許多(并非所有)DBMS 允許將它用來返回任意列中的最小值,包括返回文本列中的最小值。
    在用于文本數(shù)據(jù)時,MIN()返回該列排序后最前面的行
  • NULL 值:MIN()函數(shù)忽略列值為 NULL 的行
  • SUM()函數(shù):返回指定列值的和(總計)。
  • SELECT SUM(`status`) FROM task_tasks

  • SUM()函數(shù)忽略列值為 NULL 的行

  • 第 10 課 分組數(shù)據(jù)

    SELECT 語句子句:GROUP BY 子句和 HAVING 子句

  • 數(shù)據(jù)分組
  • SELECT COUNT(*) AS num_prods FROM Products WHERE vend_id = 'DLL01';
  • 創(chuàng)建分組——groupby
  • SELECT vend_id, COUNT(*) AS num_prods FROM Products GROUP BY vend_id SELECT `status` FROM task_tasks GROUP BY `status`

  • GROUP BY 子句必須出現(xiàn)在 WHERE 子句之后ORDER BY 子句之前
  • 過濾分組:HAVING 子句
    目前為止所學(xué)過的所有類型的 WHERE 子句都可以用 HAVING 來替代。
    唯一的差別是,WHERE過濾行,而 HAVING 過濾分組(HAVING 支持所有 WHERE 操作符 )
  • SELECT cust_id, COUNT(*) AS orders FROM Orders GROUP BY cust_id HAVING COUNT(*) >= 2; 過濾 COUNT(*) >= 2(兩個以上訂單)的那些分組

  • HAVING 和 WHERE 的差別
    這里有另一種理解方法,WHERE 在數(shù)據(jù)分組前進行過濾,HAVING 在數(shù)據(jù)分組后進行過濾。這是一個重要的區(qū)別,WHERE 排除的行不包括在分組中。這可能會改變計算值,從而影響 HAVING 子句中基于這些值過濾掉的分組
  • SELECT vend_id, COUNT(*) AS num_prods FROM Products WHERE prod_price >= 4 GROUP BY vend_id HAVING COUNT(*) >= 2; 列出具有兩個以上產(chǎn)品且其價格大于等于 4 的供應(yīng)商

  • 使用 HAVING 和 WHERE
    HAVING 與 WHERE 非常類似,如果不指定 GROUP BY,則大多數(shù) DBMS會同等對待它們。不過,你自己要能區(qū)分這一點。
    使用 HAVING 時應(yīng)該結(jié)合 GROUP BY 子句,而 WHERE 子句用于標準的行級過濾
  • 分組和排序
    order by和group by差異
  • SELECT order_num, COUNT(*) AS items FROM OrderItems GROUP BY order_num HAVING COUNT(*) >= 3; 檢索包含三個或更多物品的訂單號和訂購物品的數(shù)目

    SELECT order_num, COUNT(*) AS items FROM OrderItems GROUP BY order_num HAVING COUNT(*) >= 3 ORDER BY items, order_num; 要按訂購物品的數(shù)目排序輸出,需要添加 ORDER BY 子句,


  • SELECT 子句順序
  • 第 11 課 使用子查詢

  • 子查詢
    SELECT 語句是 SQL 的查詢。我們迄今為止所看到的所有 SELECT 語句都
    是簡單查詢,即從單個數(shù)據(jù)庫表中檢索數(shù)據(jù)的單條語句
  • 查詢(query)
    任何 SQL 語句都是查詢。但此術(shù)語一般指 SELECT 語句。
  • 利用子查詢進行過濾(where)
    IN 操作符允許我們在 WHERE 子句中規(guī)定多個值
  • 語法 SELECT column_name(s) FROM table_name WHERE column_name IN (value1,value2,...) SELECT cust_id FROM Orders WHERE order_num IN (SELECT order_numFROM OrderItemsWHERE prod_id = 'RGAN01');

    在 SELECT 語句中,子查詢總是從內(nèi)向外處理

    SELECT cust_name, cust_contact FROM Customers WHERE cust_id IN (SELECT cust_id FROM Orders WHERE order_num IN (SELECT order_num FROM OrderItems WHERE prod_id = 'RGAN01')); 為了執(zhí)行上述 SELECT 語句,DBMS 實際上必須執(zhí)行三條 SELECT 語句。 最里邊的子查詢返回訂單號列表,此列表用于其外面的子查詢的 WHERE 子句。外面的子查詢返回顧客 ID 列表,此顧客 ID 列表用于最外層查詢 的 WHERE 子句。最外層查詢返回所需的數(shù)據(jù)

  • 作為計算字段使用子查詢
  • SELECT COUNT(*) AS orders FROM Orders WHERE cust_id = '1000000001'; 碼對顧客 1000000001 的訂單進行計數(shù) ------------------------- 要對每個顧客執(zhí)行 COUNT(*),應(yīng)該將它作為一個子查詢 SELECT cust_name,cust_state,(SELECT COUNT(*)FROM OrdersWHERE Orders.cust_id = Customers.cust_id) AS orders FROM Customers ORDER BY cust_name; 這條 SELECT 語句對 Customers 表中每個顧客返回三列: cust_name、cust_state 和 orders。orders 是一個計算字段, 它是由圓括號中的子查詢建立的。 該子查詢對檢索出的每個顧客執(zhí)行一次。 在此例中,該子查詢執(zhí)行了 5 次,因為檢索出了 5 個顧客。子查詢中的 WHERE 子句與前面使用的 WHERE 子句稍有不同, 因為它使用了完全限定列名,而不只是列名( cust_id)。 它指定表名和列名Orders.cust_id 和 Customers.cust_id)。 下面的 WHERE 子句告訴 SQL, 比較Orders表中的cust_id和當前正從Customers表中檢索的cust_id: WHERE Orders.cust_id = Customers.cust_id用一個句點分隔表名和列名, 在有可能混淆列名時必須使用這種語法。 在這個例子中,有兩個 cust_id 列:一個在 Customers 中,另一個在Orders 中。 如果不采用完全限定列名,DBMS 會認為要對 Orders 表中的 cust_id 自身進行比較。 因為SELECT COUNT(*) FROM Orders WHERE cust_id = cust_id 總是返回 Orders 表中訂單的總數(shù),而這個結(jié)果不是我們想要的:


  • 子查詢常用于 WHERE 子句的 IN 操作符中,以及用來填充計算列
  • 第 12 課 聯(lián)結(jié)表

  • SQL 最強大的功能之一就是能在數(shù)據(jù)查詢的執(zhí)行中聯(lián)結(jié)(join)表
  • 關(guān)系表
  • 為什么使用聯(lián)結(jié)?將數(shù)據(jù)分解為多個表能更有效地存儲,更方便地處理,并且
    可伸縮性更好
  • 如果數(shù)據(jù)存儲在多個表中,怎樣用一條 SELECT 語句就檢索出數(shù)據(jù)呢?
    答案是使用聯(lián)結(jié)。
    簡單說,聯(lián)結(jié)是一種機制,用來在一條 SELECT 語句中關(guān)聯(lián)表,因此稱為聯(lián)結(jié)。
    使用特殊的語法,可以聯(lián)結(jié)多個表返回一組輸出,聯(lián)結(jié)在運行時關(guān)聯(lián)表中正確的行

  • 創(chuàng)建聯(lián)結(jié):指定要聯(lián)結(jié)的所有表以及關(guān)聯(lián)它們的方式即可
  • SELECT vend_name, prod_name, prod_price FROM Vendors, Products WHERE Vendors.vend_id = Products.vend_id; 要匹配的兩列指定為 Vendors.vend_id 和 Products.vend_id。 這里需要這種完全限定列名, 內(nèi)聯(lián) 檢索所有顧客及其訂單 SELECT Customers.cust_id, Orders.order_num FROM Customers INNER JOIN OrdersON Customers.cust_id = Orders.cust_id;
  • WHERE子句的重要性
    在聯(lián)結(jié)兩個表時,實際要做的是將第一個表中的每一行與第二個表中的每一行配對。WHERE 子句作為過濾條件,只包含那些匹配給定條件(這里是聯(lián)結(jié)條件)的行。
    沒有 WHERE子句,第一個表中的每一行將與第二個表中的每一行配對,而不管它們邏輯上是否能配在一起
  • 笛卡兒積(cartesian product)
    由沒有聯(lián)結(jié)條件的表關(guān)系返回的結(jié)果為笛卡兒積。檢索出的行的數(shù)目將是第一個表中的行數(shù)乘以第二個表中的行數(shù)
  • 不要忘了 WHERE 子句
    要保證所有聯(lián)結(jié)都有 WHERE 子句,否則 DBMS 將返回比想要的數(shù)據(jù)多得多的數(shù)據(jù)。同理,要保證 WHERE 子句的正確性
  • 內(nèi)聯(lián)結(jié)inner join(等值聯(lián)結(jié))
  • SELECT vend_name, prod_name, prod_price FROM Vendors INNER JOIN Products ON Vendors.vend_id = Products.vend_id;
  • 聯(lián)結(jié)多個表
  • SELECT prod_name, vend_name, prod_price, quantity FROM OrderItems, Products, Vendors WHERE Products.vend_id = Vendors.vend_id AND OrderItems.prod_id = Products.prod_id AND order_num = 20007; 這個例子顯示訂單 20007 中的物品。訂單物品存儲在 OrderItems 表中。 每個產(chǎn)品按其產(chǎn)品 ID 存儲,它引用 Products 表中的產(chǎn)品。這些產(chǎn)品通 過供應(yīng)商 ID 聯(lián)結(jié)到 Vendors 表中相應(yīng)的供應(yīng)商,供應(yīng)商 ID 存儲在每個 產(chǎn)品的記錄中。這里的 FROM 子句列出三個表,WHERE 子句定義這兩個聯(lián) 結(jié)條件,而第三個聯(lián)結(jié)條件用來過濾出訂單 20007 中的物品

  • 性能考慮
    DBMS 在運行時關(guān)聯(lián)指定的每個表,以處理聯(lián)結(jié)。這種處理可能非常耗費資源,因此應(yīng)該注意,不要聯(lián)結(jié)不必要的表。
    聯(lián)結(jié)的表越多,性能下降越厲害
  • SELECT cust_name, cust_contact FROM Customers WHERE cust_id IN (SELECT cust_id FROM Orders WHERE order_num IN (SELECT order_num FROM OrderItems WHERE prod_id = 'RGAN01')); 以上等效為 SELECT cust_name, cust_contact FROM Customers, Orders, OrderItems WHERE Customers.cust_id = Orders.cust_id AND OrderItems.order_num = Orders.order_num AND prod_id = 'RGAN01';

    第 13 課 創(chuàng)建高級聯(lián)結(jié)

    如何使用表別名,如何對被聯(lián)結(jié)的表使用聚集函數(shù)

  • 使用表別名:主要原因是能在一條 SELECT 語句中不止一次引用相同的表
  • 給字段起別名 SELECT RTRIM(vend_name) + ' (' + RTRIM(vend_country) + ')' AS vend_title FROM Vendors ORDER BY vend_name; 給表起別名 SELECT cust_name, cust_contact FROM Customers AS C, Orders AS O, OrderItems AS OI WHERE C.cust_id = O.cust_id AND OI.order_num = O.order_num AND prod_id = 'RGAN01';
  • 使用不同類型的聯(lián)結(jié)
    內(nèi)聯(lián)結(jié)或等值聯(lián)結(jié)
    自聯(lián)結(jié)(self-join)
    自然聯(lián)結(jié)(natural join)
    外聯(lián)結(jié)(outer join)
  • 自聯(lián)結(jié):
  • 預(yù)期效果:給與 Jim Jones 同一公司的所有顧客發(fā)送一封信件。這個查詢要求 首先找出 Jim Jones 工作的公司,然后找出在該公司工作的顧客 寫法一: SELECT cust_id, cust_name, cust_contact FROM Customers WHERE cust_name = (SELECT cust_name FROM Customers WHERE cust_contact = 'Jim Jones'); 方法二:連表(此表是相同一張) SELECT c1.cust_id, c1.cust_name, c1.cust_contact FROM Customers AS c1, Customers AS c2 WHERE c1.cust_name = c2.cust_name AND c2.cust_contact = 'Jim Jones';
  • 用自聯(lián)結(jié)而不用子查詢
    自聯(lián)結(jié)通常作為外部語句,用來替代從相同表中檢索數(shù)據(jù)的使用子查詢語句。
    雖然最終的結(jié)果是相同的,但許多 DBMS 處理聯(lián)結(jié)遠比處理子查詢快得多
  • 自然聯(lián)結(jié):標準的聯(lián)結(jié)(前一課中介紹的內(nèi)聯(lián)結(jié))返回所有數(shù)據(jù),相同的列甚至多次出現(xiàn)。自然聯(lián)結(jié)排除多次出現(xiàn),使每一列只返回一次
  • SELECT C.*, O.order_num, O.order_date, OI.prod_id, OI.quantity, OI.item_price FROM Customers AS C, Orders AS O, OrderItems AS OI WHERE C.cust_id = O.cust_id AND OI.order_num = O.order_num AND prod_id = 'RGAN01'; 在這個例子中,通配符只對第一個表使用。所有其他列明確列出, 所以沒有重復(fù)的列被檢索出來

    事實上,我們迄今為止建立的每個內(nèi)聯(lián)結(jié)都是自然聯(lián)結(jié),很可能永遠都
    不會用到不是自然聯(lián)結(jié)的內(nèi)聯(lián)結(jié)

  • 外聯(lián)結(jié):許多聯(lián)結(jié)將一個表中的行與另一個表中的行相關(guān)聯(lián),但有時候需要包含
    沒有關(guān)聯(lián)行的那些行。
  • 外聯(lián)——左聯(lián) 檢索包括沒有訂單顧客在內(nèi)的所有顧客 SELECT Customers.cust_id, Orders.order_num FROM Customers LEFT OUTER JOIN Orders ON Customers.cust_id = Orders.cust_id; 外聯(lián)——右聯(lián) SELECT Customers.cust_id, Orders.order_num FROM Customers RIGHT OUTER JOIN Orders ON Orders.cust_id = Customers.cust_id;

  • 是全外聯(lián)結(jié)(full outer join):它檢索兩個表中的所有行并關(guān)聯(lián)那些可以關(guān)聯(lián)的行。與左外聯(lián)結(jié)或右外聯(lián)結(jié)包含一個表的不關(guān)聯(lián)的行不同,全外聯(lián)結(jié)包含兩個表的不關(guān)聯(lián)的行
  • SELECT Customers.cust_id, Orders.order_num FROM Orders FULL OUTER JOIN Customers ON Orders.cust_id = Customers.cust_id;
  • 使用帶聚集函數(shù)的聯(lián)結(jié)
  • 檢索所有顧客及每個顧客所下的訂單數(shù),使用 COUNT()函數(shù)完成 SELECT Customers.cust_id,COUNT(Orders.order_num) AS num_ord FROM Customers INNER JOIN OrdersON Customers.cust_id = Orders.cust_id GROUP BY Customers.cust_id;

  • 聚集函數(shù)也可以方便地與其他聯(lián)結(jié)一起使用
  • 外聯(lián)-左聯(lián) SELECT Customers.cust_id,COUNT(Orders.order_num) AS num_ord FROM Customers LEFT OUTER JOIN OrdersON Customers.cust_id = Orders.cust_id GROUP BY Customers.cust_id;
  • 使用聯(lián)結(jié)和聯(lián)結(jié)條件
    ? 注意所使用的聯(lián)結(jié)類型。一般我們使用內(nèi)聯(lián)結(jié),但使用外聯(lián)結(jié)也有效。
    ? 關(guān)于確切的聯(lián)結(jié)語法,應(yīng)該查看具體的文檔,看相應(yīng)的 DBMS 支持何
    種語法(大多數(shù) DBMS 使用這兩課中描述的某種語法)。
    ? 保證使用正確的聯(lián)結(jié)條件(不管采用哪種語法),否則會返回不正確
    的數(shù)據(jù)。
    ? 應(yīng)該總是提供聯(lián)結(jié)條件,否則會得出笛卡兒積。
    ? 在一個聯(lián)結(jié)中可以包含多個表,甚至可以對每個聯(lián)結(jié)采用不同的聯(lián)結(jié)
    類型。雖然這樣做是合法的,一般也很有用,但應(yīng)該在一起測試它們
    前分別測試每個聯(lián)結(jié)。這會使故障排除更為簡單。
  • 第 14 課 組合查詢

    復(fù)合查詢:
    SQL 也允許執(zhí)行多個查詢(多條 SELECT 語句),并將結(jié)果作為一
    個查詢結(jié)果集返回。這些組合查詢通常稱為并(union)或復(fù)合查詢

  • 主要有兩種情況需要使用組合查詢:
    ? 在一個查詢中從不同的表返回結(jié)構(gòu)數(shù)據(jù);
    ? 對一個表執(zhí)行多個查詢,按一個查詢返回數(shù)據(jù)
  • 創(chuàng)建組合查詢
    可用 UNION 操作符來組合數(shù)條 SQL 查詢。利用 UNION,可給出多條
    SELECT 語句,將它們的結(jié)果組合成一個結(jié)果集
  • 使用UNION
  • SELECT cust_name, cust_contact, cust_email FROM Customers WHERE cust_state IN ('IL','IN','MI') UNION SELECT cust_name, cust_contact, cust_email FROM Customers WHERE cust_name = 'Fun4All';等效于 SELECT cust_name, cust_contact, cust_email FROM Customers WHERE cust_state IN ('IL','IN','MI')OR cust_name = 'Fun4All
  • UNION規(guī)則
    ? UNION 必須由兩條或兩條以上的 SELECT 語句組成,語句之間用關(guān)鍵
    字UNION分隔(因此,如果組合四條SELECT語句,將要使用三個UNION
    關(guān)鍵字)。
    ? UNION 中的每個查詢必須包含相同的列、表達式或聚集函數(shù)(不過,
    各個列不需要以相同的次序列出)。
    ? 列數(shù)據(jù)類型必須兼容:類型不必完全相同,但必須是 DBMS 可以隱含
    轉(zhuǎn)換的類型(例如,不同的數(shù)值類型或不同的日期類型)。
  • 包含或取消重復(fù)的行:UNION 從查詢結(jié)果集中自動去除了重復(fù)的行;換句話說,它的行為與一條 SELECT 語句中使用多個 WHERE 子句條件一樣。
    這是 UNION 的默認行為,如果愿意也可以改變它。事實上,如果想返回
    所有的匹配行,可使用 UNION ALL 而不是 UNION。
  • SELECT cust_name, cust_contact, cust_email FROM Customers WHERE cust_state IN ('IL','IN','MI') UNION ALL SELECT cust_name, cust_contact, cust_email FROM Customers WHERE cust_name = 'Fun4All';
  • UNION 與 WHERE
    這一課一開始我們說過,UNION 幾乎總是完成與多個 WHERE 條件相同
    的工作。UNION ALL 為 UNION 的一種形式,它完成 WHERE 子句完成
    不了的工作。如果確實需要每個條件的匹配行全部出現(xiàn)(包括重復(fù)行),
    就必須使用 UNION ALL,而不是 WHERE
  • 對組合查詢結(jié)果排序
    SELECT 語句的輸出用 ORDER BY 子句排序。在用 UNION 組合查詢時,只能使用一條 ORDER BY 子句,它必須位于最后一條 SELECT 語句之后。
    對于結(jié)果集,不存在用一種方式排序一部分,
    而又用另一種方式排序另一部分的情況,因此不允許使用多條 ORDER BY 子句
  • SELECT cust_name, cust_contact, cust_email FROM Customers WHERE cust_state IN ('IL','IN','MI') UNION SELECT cust_name, cust_contact, cust_email FROM Customers WHERE cust_name = 'Fun4All' ORDER BY cust_name, cust_contact;

    第 15 課 插入數(shù)據(jù)

    利用 SQL 的 INSERT 語句將數(shù)據(jù)插入表中

  • INSERT 用來將行插入(或添加)到數(shù)據(jù)庫表。插入有幾種方式:
    ? 插入完整的行;
    ? 插入行的一部分;
    ? 插入某些查詢的結(jié)果
  • 插入完整的行
  • INSERT INTO Customers VALUES('1000000006','Toy Land','123 Any Street','New York','NY','11111','USA',NULL,NULL); 存儲到表中每一列的數(shù)據(jù)在 VALUES 子句中給出,必須給每一列提供一個值如果某列沒有值,如上面的 cust_contact 和 cust_email 列,則應(yīng)該使用 NULL 值(假定表允許對該列指定空值)
  • INTO 關(guān)鍵字
    在某些 SQL 實現(xiàn)中,跟在 INSERT 之后的 INTO 關(guān)鍵字是可選的。但
    是,即使不一定需要,最好還是提供這個關(guān)鍵字,這樣做將保證 SQL
    代碼在 DBMS 之間可移植。
  • INSERT INTO Customers(cust_id,cust_contact,cust_email,cust_name,cust_address,cust_city,cust_state,cust_zip) VALUES('1000000006',NULL,NULL,'Toy Land','123 Any Street','New York','NY','11111'); INSERT 語句填充所有列(與前面的一樣),但以一種不同的次序填充因為給出了列名,所以插入結(jié)果仍然正確
  • 插入部分行:使用這種語法,還可以省略列,這表示可以只給某些列提供值,給其他列不提供值。
  • INSERT INTO Customers(cust_id,cust_name,cust_address,cust_city,cust_state,cust_zip,cust_country) VALUES('1000000006','Toy Land','123 Any Street','New York','NY','11111','USA'); 沒有給 cust_contact 和 cust_email 這兩列提供值。 這表示沒必要在 INSERT 語句中包含它們。因此,這里的 INSERT 語句省略了這兩列及其對應(yīng)的值
  • 省略列
    如果表的定義允許,則可以在 INSERT 操作中省略某些列。省略的列必須滿足以下某個條件。
    ? 該列定義為允許 NULL 值(無值或空值)。
    ? 在表定義中給出默認值。這表示如果不給出值,將使用默認值
  • 省略所需的值
    如果表中不允許有 NULL 值或者默認值,這時卻省略了表中的值,
    DBMS 就會產(chǎn)生錯誤消息,相應(yīng)的行不能成功插入
  • 插入檢索出的數(shù)據(jù)
  • INSERT 一般用來給表插入具有指定列值的行。INSERT 還存在另一種
    形式,可以利用它將 SELECT 語句的結(jié)果插入表中,這就是所謂的
    INSERT SELECT。顧名思義,它是由一條 INSERT 語句和一條 SELECT
    語句組成的

    INSERT INTO Customers(cust_id,cust_contact,cust_email,cust_name,cust_address,cust_city,cust_state,cust_zip,cust_country) SELECT cust_id,cust_contact,cust_email,cust_name,cust_address,cust_city,cust_state,cust_zip,cust_country FROM CustNew; 假如想把另一表中的顧客列合并到 Customers 表中。 不需要每次讀取一行再將它用 INSERT 插入
  • :插入多行
    INSERT 通常只插入一行。要插入多行,必須執(zhí)行多個 INSERT 語句。
    INSERT SELECT是個例外,它可以用一條INSERT插入多行,不管SELECT
    語句返回多少行,都將被 INSERT 插入。
    (INSERT SELECT 中 SELECT 語句可以包含 WHERE 子句,以過濾插入的數(shù)據(jù))

  • 從一個表復(fù)制到另一個表
    有一種數(shù)據(jù)插入不使用 INSERT 語句。要將一個表的內(nèi)容復(fù)制到一個全新的表(運行中創(chuàng)建的表),可以使用 SELECT INTO 語句。

  • 與 INSERT SELECT 將數(shù)據(jù)添加到一個已經(jīng)存在的表不同,SELECT INTO
    將數(shù)據(jù)復(fù)制到一個新表(有的 DBMS 可以覆蓋已經(jīng)存在的表,這依賴于所使用的具體 DBMS
    INSERT SELECT 與 SELECT INTO
    它們之間的一個重要差別是前者導(dǎo)出數(shù)據(jù),而后者導(dǎo)入數(shù)據(jù)。

  • SELECT INTO使用 SELECT * INTO CustCopy FROM Customers; 這條 SELECT 語句創(chuàng)建一個名為 CustCopy 的新表, 并把 Customers 表的整個內(nèi)容復(fù)制到新表中MariaDB、MySQL、Oracle、PostgreSQL 和 SQLite 使用的語法稍有不同

    第 16 課 更新和刪除數(shù)據(jù)

    更新(修改)表中的數(shù)據(jù),可以使用 UPDATE 語句

  • 有兩種使用 UPDATE的方式:
    ? 更新表中的特定行;
    ? 更新表中的所有行
  • 基本的 UPDATE 語句由三部分組成,分別是:
    ? 要更新的表;
    ? 列名和它們的新值;
    ? 確定要更新哪些行的過濾條件
  • UPDATE Customers SET cust_email = 'kim@thetoystore.com' WHERE cust_id = '1000000005';
  • SET 命令用來將新值賦給被更新的列
  • 在更新多個列時,只需要使用一條 SET 命令, 每個“列=值”對之間用逗號分隔(最后一列之后不用逗號)UPDATE Customers SET cust_contact = 'Sam Roberts',cust_email = 'sam@toyland.com' WHERE cust_id = '1000000006';
  • 要刪除某個列的值,可設(shè)置它為 NULL(假如表定義允許 NULL 值)
  • UPDATE Customers SET cust_email = NULL WHERE cust_id = '1000000005'; 其中NULL用來去除cust_email列中的值。這與保存空字符串很不同(空 字符串用''表示,是一個值),而 NULL 表示沒有值。
  • 刪除數(shù)據(jù):使用 DELETE 語句
  • 兩種使用 DELETE的方式:
    ? 從表中刪除特定的行;
    ? 從表中刪除所有行。
  • DELETE FROM Customers WHERE cust_id = '1000000006';


  • DELETE 不需要列名或通配符。DELETE 刪除整行而不是刪除列。要刪除
    指定的列,請使用 UPDATE 語句
  • 刪除表的內(nèi)容而不是表
    DELETE 語句從表中刪除行,甚至是刪除表中所有行。但是,DELETE
    不刪除表本身
  • 更快的刪除
    如果想從表中刪除所有行,不要使用 DELETE。可使用 TRUNCATE TABLE
    語句,它完成相同的工作,而速度更快(因為不記錄數(shù)據(jù)的變動)
  • 更新和刪除的指導(dǎo)原則
    ? 除非確實打算更新和刪除每一行,否則絕對不要使用不帶 WHERE 子句
    的 UPDATE 或 DELETE 語句。
    ? 保證每個表都有主鍵(如果忘記這個內(nèi)容,請參閱第 12 課),盡可能
    像 WHERE 子句那樣使用它(可以指定各主鍵、多個值或值的范圍)。
    ? 在 UPDATE 或 DELETE 語句使用 WHERE 子句前,應(yīng)該先用 SELECT 進
    行測試,保證它過濾的是正確的記錄,以防編寫的 WHERE 子句不正確。
    ? 使用強制實施引用完整性的數(shù)據(jù)庫(關(guān)于這個內(nèi)容,請參閱第 12 課),
    這樣 DBMS 將不允許刪除其數(shù)據(jù)與其他表相關(guān)聯(lián)的行。
    ? 有的 DBMS 允許數(shù)據(jù)庫管理員施加約束,防止執(zhí)行不帶 WHERE 子句
    的 UPDATE 或 DELETE 語句。如果所采用的 DBMS 支持這個特性,應(yīng)
    該使用它。
    若是 SQL沒有撤銷(undo)按鈕,應(yīng)該非常小心地使用 UPDATE 和 DELETE,
    否則你會發(fā)現(xiàn)自己更新或刪除了錯誤的數(shù)據(jù)。
  • 第 17 課 創(chuàng)建和操縱表

    創(chuàng)建、更改和刪除表的基本知識

  • 創(chuàng)建表:SQL 不僅用于表數(shù)據(jù)操縱,還用來執(zhí)行數(shù)據(jù)庫和表的所有操作,包括表
    本身的創(chuàng)建和處理

  • 兩種創(chuàng)建表的方法:
    ? 多數(shù) DBMS 都具有交互式創(chuàng)建和管理數(shù)據(jù)庫表的工具;
    ? 表也可以直接用 SQL 語句操縱

  • 表創(chuàng)建基礎(chǔ)
    利用 CREATE TABLE 創(chuàng)建表,必須給出下列信息:
    ? 新表的名字,在關(guān)鍵字 CREATE TABLE 之后給出;
    ? 表列的名字和定義,用逗號分隔;
    ? 有的 DBMS 還要求指定表的位置。
    4創(chuàng)建表名,命名:表名緊跟 CREATE TABLE 關(guān)鍵字.

  • 使用NULL值
    NULL 值就是沒有值或缺值。允許 NULL 值的列也允許在插入行時不給出該列的值。不允許 NULL 值的列不接受沒有列值的行,換句話說,在插入或更新行時,該列必須有值(每個表列要么是 NULL 列,要么是 NOT NULL 列,這種狀態(tài)在創(chuàng)建時由表
    的定義規(guī)定)

  • 理解Null

  • 指定默認值:關(guān)鍵字 DEFAULT 指定

  • 默認值經(jīng)常用于日期或時間戳列。例如,通過指定引用系統(tǒng)日期的函數(shù)或變量,將系統(tǒng)日期用作默認日期。
    MySQL 用戶指定 DEFAULT CURRENT_DATE(),
    Oracle 用戶指定 DEFAULT SYSDATE,
    而 SQL Server用戶指定 DEFAULT GETDATE()。
    遺憾的是,這條獲得系統(tǒng)日期的命令在不同的 DBMS 中幾乎都是不同的

  • 使用 DEFAULT 而不是 NULL 值
    許多數(shù)據(jù)庫開發(fā)人員喜歡使用 DEFAULT 值而不是 NULL 列,對于用于
    計算或數(shù)據(jù)分組的列更是如此

  • 更新表:用 ALTER TABLE 語句

  • ALTER TABLE Vendors ADD vend_phone CHAR(20); 給 Vendors 表增加一個名為 vend_phone 的列,其數(shù)據(jù)類型為 CHAR ALTER TABLE Vendors DROP COLUMN vend_phone; 刪除列
  • 刪除表:DROP TABLE 語句
  • DROP TABLE CustCopy; 刪除表沒有確認,也不能撤銷,執(zhí)行這條語句將永久刪除該表
  • 重命名表:
    DB2、MariaDB、MySQL、Oracle 和 PostgreSQL 用戶使用 RENAME語句,SQL Server 用戶使用 sp_rename 存儲過程,
    SQLite 用戶使用 ALTERTABLE 語句
  • 第 18 課 使用視圖

    介紹什么是視圖,它們怎樣工作,何時使用它們;還將講述如
    何利用視圖簡化前幾課中執(zhí)行的某些 SQL 操作

  • 視圖:視圖是虛擬的表。與包含數(shù)據(jù)的表不一樣,視圖只包含使用時動態(tài)檢索
    數(shù)據(jù)的查詢
  • SELECT cust_name, cust_contact FROM Customers, Orders, OrderItems WHERE Customers.cust_id = Orders.cust_idAND OrderItems.order_num = Orders.order_numAND prod_id = 'RGAN01'; 此查詢用來檢索訂購了某種產(chǎn)品的顧客。任何需要這個數(shù)據(jù)的人都必須 理解相關(guān)表的結(jié)構(gòu),知道如何創(chuàng)建查詢和對表進行聯(lián)結(jié)。檢索其他產(chǎn)品 (或多個產(chǎn)品)的相同數(shù)據(jù),必須修改最后的 WHERE 子句。 現(xiàn)在,假如可以把整個查詢包裝成一個名為 ProductCustomers 的虛擬 表,則可以如下輕松地檢索出相同的數(shù)據(jù): 輸入▼ SELECT cust_name, cust_contact FROM ProductCustomers WHERE prod_id = 'RGAN01';
  • 為什么使用視圖
    ? 重用 SQL 語句
    ? 簡化復(fù)雜的 SQL 操作。在編寫查詢后,可以方便地重用它而不必知道
    其基本查詢細節(jié)。
    ? 使用表的一部分而不是整個表。
    ? 保護數(shù)據(jù)。可以授予用戶訪問表的特定部分的權(quán)限,而不是整個表的
    訪問權(quán)限。
    ? 更改數(shù)據(jù)格式和表示。視圖可返回與底層表的表示和格式不同的數(shù)據(jù)
  • 視圖僅僅是用來查看存儲在別處數(shù)據(jù)的一種設(shè)施。
    視圖本身不包含數(shù)據(jù),因此返回的數(shù)據(jù)是從其他表中檢索出來的。
    在添加或更改這些表中的數(shù)據(jù)時,視圖將返回改變過的數(shù)據(jù)
  • 創(chuàng)建視圖:用 CREATE VIEW 語句
  • 利用視圖簡化復(fù)雜的聯(lián)結(jié)
  • 輸入▼ CREATE VIEW ProductCustomers AS SELECT cust_name, cust_contact, prod_id FROM Customers, Orders, OrderItems WHERE Customers.cust_id = Orders.cust_idAND OrderItems.order_num = Orders.order_num; 分析▼ 這條語句創(chuàng)建一個名為 ProductCustomers 的視圖,它聯(lián)結(jié)三個表,返 回已訂購了任意產(chǎn)品的所有顧客的列表。如果執(zhí)行 SELECT * FROM ProductCustomers,將列出訂購了任意產(chǎn)品的顧客 檢索訂購了產(chǎn)品 RGAN01 的顧客 輸入▼ SELECT cust_name, cust_contact FROM ProductCustomers WHERE prod_id = 'RGAN01';輸出▼ cust_name cust_contact ------------------- ------------------ Fun4All Denise L. Stephens The Toy Store Kim Howard 詳細看書介紹P160-165

    第 19 課 使用存儲過程

  • 簡單來說,存儲過程就是為以后使用而保存的一條或多條 SQL 語句。
    可將其視為批文件,雖然它們的作用不僅限于批處理
  • 為什么要使用存儲過程
    ? 通過把處理封裝在一個易用的單元中,可以簡化復(fù)雜的操作(如前面
    例子所述)。
    ? 由于不要求反復(fù)建立一系列處理步驟,因而保證了數(shù)據(jù)的一致性。如
    果所有開發(fā)人員和應(yīng)用程序都使用同一存儲過程,則所使用的代碼都
    是相同的。
    這一點的延伸就是防止錯誤。需要執(zhí)行的步驟越多,出錯的可能性就
    越大。防止錯誤保證了數(shù)據(jù)的一致性。
    ? 簡化對變動的管理。如果表名、列名或業(yè)務(wù)邏輯(或別的內(nèi)容)有變
    化,那么只需要更改存儲過程的代碼。使用它的人員甚至不需要知道
    這些變化。
    這一點的延伸就是安全性。通過存儲過程限制對基礎(chǔ)數(shù)據(jù)的訪問,減
    少了數(shù)據(jù)訛誤(無意識的或別的原因所導(dǎo)致的數(shù)據(jù)訛誤)的機會。
    ? 因為存儲過程通常以編譯過的形式存儲,所以 DBMS 處理命令所需的
    工作量少,提高了性能。
    ? 存在一些只能用在單個請求中的 SQL 元素和特性,存儲過程可以使用
    它們來編寫功能更強更靈活的代碼。
    換句話說,使用存儲過程有三個主要的好處,即簡單、安全、高性能。
    顯然,它們都很重要。不過,在將 SQL 代碼轉(zhuǎn)換為存儲過程前,也必須
    知道它的一些缺陷。
    ? 不同 DBMS 中的存儲過程語法有所不同。事實上,編寫真正的可移植
    存儲過程幾乎是不可能的。不過,存儲過程的自我調(diào)用(名字以及數(shù)
    據(jù)如何傳遞)可以相對保持可移植。因此,如果需要移植到別的DBMS,
    至少客戶端應(yīng)用代碼不需要變動。
    ? 一般來說,編寫存儲過程比編寫基本 SQL 語句復(fù)雜,需要更高的技能,
    更豐富的經(jīng)驗。因此,許多數(shù)據(jù)庫管理員把限制存儲過程的創(chuàng)建作為
    安全措施(主要受上一條缺陷的影響)
  • 執(zhí)行存儲過程
    執(zhí)行存儲過程的 SQL 語句很簡單,即 EXECUTE。
    EXECUTE 接受存儲過程名和需要傳遞給它的任何參數(shù)。
  • EXECUTE AddNewProduct( 'JTS01','Stuffed Eiffel Tower',6.49,'Plush stuffed toy with the text La ?Tour Eiffel in red white and blue' ); 這里執(zhí)行一個名為 AddNewProduct 的存儲過程,將一個新產(chǎn)品添加到Products 表中。 AddNewProduct 有四個參數(shù),分別是: 供應(yīng)商 ID(Vendors 表的主鍵)、產(chǎn)品名、價格和描述。 這 4 個參數(shù)匹配存儲過程中 4 個預(yù)期變量(定義為存儲過程自身的組成部分)。 此存儲過程將新行添加到 Products 表,并將傳入的屬性賦給相應(yīng)的列詳細看書P170-174
  • 創(chuàng)建存儲過程
  • 第 20 課 管理事務(wù)處理

    介紹什么是事務(wù)處理,如何利用 COMMIT 和 ROLLBACK 語句管理事務(wù)處理

  • 事務(wù)處理:
    通過確保成批的 SQL 操作
    要么完全執(zhí)行,要么完全不執(zhí)行,來維護數(shù)據(jù)庫的完整性
  • 可以回退哪些語句?
    事務(wù)處理用來管理 INSERT、UPDATE 和 DELETE 語句。不能回退 SELECT
    語句(回退 SELECT 語句也沒有必要),也不能回退 CREATE 或 DROP 操
    作。事務(wù)處理中可以使用這些語句,但進行回退時,這些操作也不撤銷
  • 控制事務(wù)處理:
  • 有的 DBMS要求明確標識事務(wù)處理塊的開始和結(jié)束。如在 SQL Server中 BEGIN TRANSACTION ... COMMIT TRANSACTION -------------------- MariaDB 和 MySQL 中等同的代碼為: START TRANSACTION ... ---------------- PostgreSQL 使用 ANSI SQL 語法: 輸入▼ BEGIN ... ---------
  • 使用ROLLBACK:用來回退(撤銷)SQL 語句
  • DELETE FROM Orders; ROLLBACK; 在此例子中,執(zhí)行 DELETE 操作,然后用 ROLLBACK 語句撤銷。雖然這不 是最有用的例子,但它的確能夠說明,在事務(wù)處理塊中,DELETE 操作(與 INSERT 和 UPDATE 操作一樣)并不是最終的結(jié)果
  • 使用COMMIT
  • 第 21 課 使用游標

  • 游標
    SQL 檢索操作返回一組稱為結(jié)果集的行,這組返回的行都是與 SQL 語句
    相匹配的行(零行或多行)。簡單地使用 SELECT 語句,沒有辦法得到第
    一行、下一行或前 10 行
  • 結(jié)果集(result set):SQL 查詢所檢索出的結(jié)果
  • 第 22 課 高級 SQL 特性

    幾個高級數(shù)據(jù)處理特性:約束、索引和觸發(fā)器

  • 約束:管理如何插入或處理數(shù)據(jù)庫數(shù)據(jù)的規(guī)則

  • 主鍵:主鍵是一種特殊的約束,用來保證一列(或一組列)中的值是唯一的,而且永不改動

  • ALTER TABLE Vendors ADD CONSTRAINT PRIMARY KEY (vend_id);
  • 外鍵:外鍵是表中的一列,其值必須列在另一表的主鍵中。外鍵是保證引用完
    整性的極其重要部分
  • ALTER TABLE Orders ADD CONSTRAINT FOREIGN KEY (cust_id) REFERENCES Customers (cust_id)
  • 唯一約束:唯一約束用來保證一列(或一組列)中的數(shù)據(jù)是唯一的。它們類似于主

    ? 表可包含多個唯一約束,但每個表只允許一個主鍵。
    ? 唯一約束列可包含 NULL 值。
    ? 唯一約束列可修改或更新。
    ? 唯一約束列的值可重復(fù)使用。
    ? 與主鍵不一樣,唯一約束不能用來定義外鍵。
  • 檢查約束:檢查約束用來保證一列(或一組列)中的數(shù)據(jù)滿足一組指定的條件
  • ADD CONSTRAINT CHECK (gender LIKE '[MF]')

    ? 檢查最小或最大值。例如,防止 0 個物品的訂單(即使 0 是合法的數(shù))。
    ? 指定范圍。例如,保證發(fā)貨日期大于等于今天的日期,但不超過今天
    起一年后的日期。
    ? 只允許特定的值。例如,在性別字段中只允許 M 或 F。

  • 索引:用來排序數(shù)據(jù)以加快搜索和排序操作的速度
  • ? 索引改善檢索操作的性能,但降低了數(shù)據(jù)插入、修改和刪除的性能。
    在執(zhí)行這些操作時,DBMS 必須動態(tài)地更新索引。
    ? 索引數(shù)據(jù)可能要占用大量的存儲空間。
    ? 并非所有數(shù)據(jù)都適合做索引。取值不多的數(shù)據(jù)(如州)不如具有更多
    可能值的數(shù)據(jù)(如姓或名),能通過索引得到那么多的好處。
    ? 索引用于數(shù)據(jù)過濾和數(shù)據(jù)排序。如果你經(jīng)常以某種特定的順序排序數(shù)
    據(jù),則該數(shù)據(jù)可能適合做索引。
    ? 可以在索引中定義多個列(例如,州加上城市)。這樣的索引僅在以州
    加城市的順序排序時有用。如果想按城市排序,則這種索引沒有用處

    在 Products 表的產(chǎn)品名列上創(chuàng)建一個簡單的索引 CREATE INDEX prod_name_ind ON Products (prod_name); 索引必須唯一命名。這里的索引名 prod_name_ind 在關(guān)鍵字 CREATEINDEX 之后定義 ON 用來指定被索引的表,而索引中包含的列(此例中僅有一列)在表名后的圓括號中給出
  • 觸發(fā)器:是特殊的存儲過程,它在特定的數(shù)據(jù)庫活動發(fā)生時自動執(zhí)行。 觸發(fā)器可以與特定表上的 INSERT、UPDATE 和 DELETE 操作(或組合)相關(guān)聯(lián)
  • 與存儲過程不一樣(存儲過程只是簡單的存儲 SQL 語句),觸發(fā)器與單個的表相關(guān)聯(lián)
  • 觸發(fā)器內(nèi)的代碼具有以下數(shù)據(jù)的訪問權(quán):
    ? INSERT 操作中的所有新數(shù)據(jù);
    ? UPDATE 操作中的所有新數(shù)據(jù)和舊數(shù)據(jù);
    ? DELETE 操作中刪除的數(shù)據(jù)。
  • 總結(jié)

    以上是生活随笔為你收集整理的读书:SQL必知必会的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

    日韩免费av网址 | 国产精品久久久久久爽爽爽 | 成人动漫精品一区二区 | 天堂在线v | 亚洲精品色 | 久久久久久视频 | 91亚洲精品久久久 | 丝袜美腿av | 精品福利网| 久久大片 | 日韩特级黄色片 | 91在线一区 | 视频一区二区三区视频 | 91麻豆精品91久久久久同性 | 五月天六月婷婷 | 亚洲精品在线观看av | 干干夜夜| 在线观看香蕉视频 | 精品在线视频播放 | 中文资源在线官网 | 久久久.com | av经典在线 | 99自拍视频在线观看 | 国产精品九九视频 | 国产精品一区二区三区视频免费 | 在线观看视频日韩 | 欧美日韩精品在线观看视频 | 日韩精品高清不卡 | 在线 你懂 | 久久久99精品免费观看app | 最近免费中文字幕 | 在线 成人| 一区精品久久 | 日日爽日日操 | a视频免费看 | 久久久免费高清视频 | 中文字幕免费成人 | 在线免费黄 | 成年人黄色在线观看 | 999久久国精品免费观看网站 | 国产精品视频不卡 | 久久久久亚洲精品男人的天堂 | 一二三四精品 | 丁香六月av | 激情自拍av | 色偷偷男人的天堂av | 国产裸体视频网站 | 欧美视屏一区二区 | 狠狠干婷婷色 | 在线高清一区 | 91精品视屏 | 国产精品一区二区视频 | 久国产在线播放 | 视频一区二区视频 | 久久精品中文字幕 | 亚洲狠狠婷婷综合久久久 | 亚洲天堂va | 亚洲精品在线视频播放 | 久久久久久久久毛片精品 | 日韩av一区在线观看 | 亚洲欧美国产精品久久久久 | 中文不卡视频在线 | 免费精品在线 | 婷婷丁香导航 | 久久久久久久久久免费视频 | 天天曰视频 | 91麻豆免费视频 | 中文字幕第一页av | 免费视频一级片 | 国产精品久久久久久久久岛 | 99色在线 | 亚洲va韩国va欧美va精四季 | 国语久久 | 91av九色| 在线观看免费日韩 | 99热9 | 91九色免费视频 | 91麻豆精品 | 亚洲第一久久久 | 欧美在线视频不卡 | 国产美女被啪进深处喷白浆视频 | 日韩欧美一区二区三区在线观看 | 狠狠狠色丁香婷婷综合久久88 | av免费网站| 日韩精品一区电影 | 久草在线视频网站 | 成人亚洲精品国产www | 久久这里精品视频 | 亚洲一区二区天堂 | 一区二区三区四区精品 | 日韩欧美一区二区三区黑寡妇 | 免费看wwwwwwwwwww的视频 久久久久久99精品 91中文字幕视频 | 国模视频一区二区三区 | www.亚洲视频 | 一区三区视频在线观看 | 超级碰99| 日韩视频图片 | 久久涩视频| 成人小视频在线免费观看 | 91精品一区在线观看 | 国产精品久久久久久高潮 | 开心激情综合网 | 伊人射 | 国产不卡精品 | 国内三级在线 | 日韩伦理片hd | 激情欧美在线观看 | 在线观看免费日韩 | 成人av在线资源 | 韩日三级在线 | 国产精品久久久久久久久久久久午 | 国产日本亚洲高清 | 日韩精品视频在线免费观看 | 成人在线你懂得 | 天天操天天干天天综合网 | 国产成年免费视频 | 久久久久免费精品视频 | 亚洲最大的av网站 | 国内精品二区 | 国内精品久久久久久久久久久 | 成人在线观看你懂的 | 天天爽天天爽夜夜爽 | 国产 成人 久久 | 亚洲天天综合网 | 亚洲一级二级三级 | 日产av在线播放 | 91 中文字幕| 日本精品二区 | 久久久久亚洲天堂 | 一级免费黄色 | 国产一区视频在线 | 亚洲欧美成人综合 | 青青河边草手机免费 | 精品国产一区二区三区噜噜噜 | 日韩一三区 | 97视频在线观看视频免费视频 | 日韩欧美精品一区二区三区经典 | 中文字幕精品一区久久久久 | 丁香综合网| 在线精品一区二区 | 激情欧美丁香 | 欧美电影在线观看 | 亚洲九九 | 亚洲国产精品成人va在线观看 | a黄在线观看 | 久草91视频 | 美女精品国产 | 99精品免费久久久久久日本 | 日韩系列 | 国产精品一区电影 | 97超碰人人模人人人爽人人爱 | 久草青青在线观看 | 久久免费视频在线观看6 | 亚洲人成影院在线 | 国内精品久久久久久久久久 | 最近免费中文字幕大全高清10 | 久久 国产一区 | www.久久免费视频 | 天天干夜夜 | 丰满少妇麻豆av | 久久视频在线 | 91精品老司机久久一区啪 | 日日夜夜精品 | 日韩av片免费在线观看 | 成人91在线 | av在线8| 精品国产精品一区二区夜夜嗨 | 午夜久久福利视频 | 97日日碰人人模人人澡分享吧 | 中文字幕 婷婷 | 99精品视频播放 | www91在线| 激情网站| av免费电影在线 | 网址你懂的在线观看 | 国产999精品久久久久久 | 在线视频 影院 | 国产成人精品av在线观 | 国产小视频91 | 国产精品69久久久久 | 四虎国产精| 国产99久久久久久免费看 | 91免费版在线观看 | 人人藻人人澡人人爽 | 久爱精品在线 | 国内小视频 | 欧美日韩免费视频 | 久久国产影院 | 日韩在线视 | 欧美日韩精品国产 | 色婷婷av在线 | 亚洲精品视频在线播放 | 亚洲综合一区二区精品导航 | 亚洲精品色婷婷 | 草久在线播放 | 日韩激情在线 | 色悠悠久久综合 | 欧美日韩中文在线 | 香蕉视频网址 | 在线之家免费在线观看电影 | 国产高清视频免费最新在线 | 免费高清在线观看电视网站 | 天天综合网久久 | 国产高清精品在线 | 亚洲免费精品视频 | 五月天亚洲综合 | 在线看日韩 | 国产视频精品久久 | 日韩啪啪小视频 | 亚洲,国产成人av | 国产精品久久久久久久久久久免费 | 欧美国产日韩激情 | 就要干b| 国产成人一区二区三区在线观看 | 欧美孕妇与黑人孕交 | 国产精品av免费观看 | 欧美另类xxxxx | 免费在线观看a v | 国产成人性色生活片 | 国产午夜精品一区二区三区嫩草 | 在线观看国产一区二区 | 色综合婷婷 | 精品91久久久久 | 国产在线91精品 | 91看片一区二区三区 | 五月黄色 | 天天色天天上天天操 | 香蕉视频色 | 国产亚洲精品美女 | 韩国av在线播放 | 福利精品在线 | 免费日韩 精品中文字幕视频在线 | 国产精品嫩草影院9 | 日韩免费视频在线观看 | 国产精品国产三级国产aⅴ9色 | 亚洲精品美女 | 亚洲国产精品久久久久 | 国产精品com | 久久影院中文字幕 | 狠狠综合 | 免费在线精品视频 | 视频 天天草 | 婷婷色综 | 成人黄在线观看 | av免费看网站 | 福利视频午夜 | 欧美日韩国产精品久久 | 国产综合视频在线观看 | 91重口视频 | 午夜精品一区二区三区在线观看 | 婷婷色综合网 | 美女在线黄 | 夜夜嗨av色一区二区不卡 | 亚洲在线高清 | av再线观看 | 精品美女视频 | 人人网人人爽 | 999精品网| 成人一级影视 | 99av国产精品欲麻豆 | 国内丰满少妇猛烈精品播 | 欧美日韩破处 | 亚洲欧洲一区二区在线观看 | 日韩av不卡在线 | 激情欧美一区二区免费视频 | 欧美精品乱码久久久久久按摩 | 精品国产福利在线 | 99热这里只有精品8 久久综合毛片 | 色婷婷88av视频一二三区 | 在线视频观看亚洲 | 国产精品都在这里 | 中文字幕久久精品一区 | 99高清视频有精品视频 | 欧美在线视频不卡 | 天天爱天天操 | 人人爱在线视频 | 插久久 | 国产专区在线视频 | 五月天色丁香 | 久久精品一二三区白丝高潮 | 伊人久在线 | 国产精品色视频 | 在线观看免费黄色 | 免费观看视频黄 | 在线免费精品视频 | 中文字幕大全 | 免费在线一区二区三区 | 白丝av在线 | 日狠狠| 婷婷色中文网 | 在线91网| 国产精品乱码高清在线看 | 成人免费色 | 深夜激情影院 | 日韩av中文在线 | 在线播放国产精品 | 久久久久久久久久网站 | 日韩精品一区二区三区高清免费 | 国产又黄又硬又爽 | 丁香婷婷激情啪啪 | 国产精品永久免费观看 | 99精品在线 | 探花视频免费观看高清视频 | 久久婷婷精品视频 | 成人一区影院 | 日韩电影一区二区在线观看 | 狠狠色香婷婷久久亚洲精品 | 日韩中出在线 | 欧美精品一二三 | 在线91网 | 日韩亚洲国产中文字幕 | wwwww.国产 | 亚洲涩涩网| 国产999精品久久久久久麻豆 | 久久av伊人 | 五月天中文字幕 | 在线观看亚洲成人 | 欧美小视频在线观看 | 女人高潮特级毛片 | 成人亚洲网 | av资源网在线播放 | 天天干天天干天天干天天干天天干天天干 | av在线8| 色婷婷视频在线 | 天天综合网国产 | 国产大尺度视频 | 99精彩视频在线观看免费 | 久久久wwww | 99r在线观看| www色,com| 又湿又紧又大又爽a视频国产 | 99在线高清视频在线播放 | 亚洲网久久 | 日本黄色免费观看 | 久久国产精品色av免费看 | 国产a免费| 国产精品午夜久久久久久99热 | 天天干,天天干 | 日韩欧美在线观看 | 免费在线观看成人小视频 | 国产精品每日更新 | 精品国产免费av | 中文欧美字幕免费 | 免费三级黄 | 在线视频中文字幕一区 | 人人干97 | 久久午夜电影 | 成人一级视频在线观看 | av在线免费播放网站 | 色综合久久久 | 日韩欧美综合精品 | 欧美在线视频不卡 | 久久国产视频网 | 亚洲欧美色婷婷 | 一区二区免费不卡在线 | 99精品欧美一区二区三区黑人哦 | 9999精品免费视频 | 九九综合久久 | 手机在线黄色网址 | www.亚洲精品视频 | 黄色毛片视频免费观看中文 | 国产乱对白刺激视频不卡 | 国产精品自在线 | 黄色精品久久 | 午夜精品婷婷 | 国产一级二级在线播放 | 日日夜夜天天久久 | 国产黄色片免费看 | 天天操天天操天天操天天操天天操天天操 | 国产成人99久久亚洲综合精品 | 99综合视频 | 有没有在线观看av | www天天干com | 超碰97.com| 一区二区视频在线看 | 日本精品视频在线观看 | 黄色亚洲免费 | 丁香六月婷 | 日韩久久久 | 九月婷婷人人澡人人添人人爽 | 国产精品麻豆三级一区视频 | 不卡的av在线播放 | 少妇自拍av| 久久精品美女视频网站 | 日韩精品一区二区三区在线播放 | 久久久久久久久久网 | 涩涩伊人| www久久99 | 中文字幕在线看视频国产中文版 | 蜜臀av在线一区二区三区 | 国产成人在线观看免费 | 日韩精品一区二区三区高清免费 | 国产成人综 | 天天躁日日躁狠狠躁av麻豆 | 久久久久亚洲a | 国产糖心vlog在线观看 | 81国产精品久久久久久久久久 | 久草精品在线 | 狠狠综合久久 | 久久久久久福利 | 99精品视频免费 | 久久高清免费观看 | 欧美精品久久久久久久久免 | 成人免费在线电影 | 精品主播网红福利资源观看 | 99视频国产在线 | 国产精品18videosex性欧美 | 欧美成人精品在线 | 国产精品美女久久久久久久久 | 天天操夜夜逼 | 中文字幕在线观看视频网站 | 97超碰在| 四虎精品成人免费网站 | 午夜三级理论 | 中文字幕在线专区 | 天天色综合1 | 亚洲 欧美 国产 va在线影院 | 亚洲精品 在线视频 | 久久艹久久 | 日韩视频一区二区三区在线播放免费观看 | 在线国产不卡 | 欧美日韩一区三区 | av女优中文字幕在线观看 | 美女黄视频免费 | 久久成人精品视频 | 亚洲国产精品激情在线观看 | av成人免费网站 | 99久久久国产精品免费99 | 草久草久 | 日韩欧美高清不卡 | 在线观看aa | 久久精久久精 | 国产1区在线 | 亚洲精品日韩一区二区电影 | 精品一二三四在线 | 四虎成人精品在永久免费 | 成年人国产在线观看 | 日日夜夜亚洲 | 99色免费视频 | 欧美a视频| 免费看国产一级片 | 亚洲午夜av久久乱码 | 久久理论视频 | 天天干夜夜夜操天 | 久久精品男人的天堂 | 狠狠ri | 国产手机在线精品 | 婷婷深爱五月 | 91豆麻精品91久久久久久 | 国产精品免费视频网站 | 99精品国产一区二区三区不卡 | av在线播放国产 | 国产丝袜网站 | 国产xxxxx在线观看 | 精品一区在线看 | 中文字幕.av.在线 | 国产亚洲精品日韩在线tv黄 | 欧美日韩国产在线精品 | 337p日本欧洲亚洲大胆裸体艺术 | 国产美女视频免费观看的网站 | 亚洲天堂自拍视频 | 亚洲午夜久久久影院 | 91你懂的 | 国产玖玖在线 | 久草视频在线免费看 | 99中文字幕视频 | 日韩视频中文字幕在线观看 | 色妞色视频一区二区三区四区 | 国产91在线观| 国产精品99在线播放 | 人人草人| 欧美日韩中文字幕综合视频 | 欧美在线视频一区二区三区 | av黄色成人 | 国产精品欧美日韩在线观看 | 激情小说网站亚洲综合网 | 中文字幕资源在线 | 国产免费精彩视频 | 激情av资源网| 精品99在线| 999电影免费在线观看 | 色综合久久中文字幕综合网 | 国产精品一区二区久久精品爱微奶 | 特黄特色特刺激视频免费播放 | 亚洲成人资源在线观看 | 欧美人体xx | 国产精品自在线拍国产 | 午夜久久 | 国产精品久久久久久电影 | 成人a级大片 | 福利一区视频 | 99色亚洲 | 99久久精品国产毛片 | 亚洲欧美怡红院 | 天天操天天干天天操天天干 | 国产高清视频免费观看 | 国产无遮挡猛进猛出免费软件 | 九热精品 | 日韩精品中文字幕有码 | 成人黄色毛片视频 | av不卡中文字幕 | 国产传媒一区在线 | 日韩在线理论 | 91看片网址 | 免费看一及片 | 久久精品资源 | 亚洲成a人片77777kkkk1在线观看 | 国产免费又粗又猛又爽 | 国产亚洲精品福利 | 亚洲精品国产免费 | 成人黄色在线电影 | 国产精品高潮呻吟久久av无 | 午夜在线观看一区 | 日韩视频图片 | 综合国产视频 | 亚洲精品18日本一区app | 日日夜夜综合网 | 国产精品永久在线观看 | 99精品乱码国产在线观看 | 伊人婷婷激情 | 亚洲欧美综合精品久久成人 | 特级a老妇做爰全过程 | 久久人人爽人人爽 | 九色精品在线 | 国产人成精品一区二区三 | 成人在线观看av | 91在线影院 | 婷婷激情站 | 国产精品久久久久一区二区三区共 | 久久99九九99精品 | 激情网五月天 | 在线视频日韩一区 | 精品国产自 | 首页国产精品 | 欧美一级专区免费大片 | 精品成人网 | 欧美日本不卡视频 | 国精产品满18岁在线 | 日韩在线中文字幕视频 | 国产一区二区在线视频观看 | 色综合久久久久网 | 人人狠狠 | 久久久在线 | 日韩欧美精品在线观看视频 | 精品你懂的| 97视频在线免费观看 | 久草在线看片 | 欧美人操人 | 国产精品国产亚洲精品看不卡 | 91豆麻精品91久久久久久 | 99久久精品网 | 亚洲最新av在线网站 | 狠狠干中文字幕 | 91中文字幕永久在线 | 成人午夜电影网站 | 五月天伊人 | 激情视频区 | 国产精品美女久久久久久免费 | 日本黄色免费电影网站 | 欧美日韩精品免费观看 | 伊人av综合 | 久久综合久久综合这里只有精品 | 91av亚洲| 91精品中文字幕 | 97在线精品国自产拍中文 | 亚洲国产成人精品电影在线观看 | 狠狠色丁香婷婷 | 欧美亚洲成人免费 | 国产永久免费高清在线观看视频 | 国产成人精品一区二区 | 免费福利视频网站 | 综合久久精品 | 国产精品手机在线 | 国产在线传媒 | 国产直播av | 手机av电影在线观看 | 精品在线观 | 综合网成人 | 特级毛片爽www免费版 | 91一区二区三区久久久久国产乱 | 亚洲日本国产精品 | 福利网在线 | 精品99视频| 亚洲激情综合网 | 九九视频在线 | 4438全国亚洲精品观看视频 | 最近中文字幕mv免费高清在线 | 亚洲精品视频一二三 | 日韩乱色精品一区二区 | 日韩黄色在线观看 | 国产精品网站 | 久久国产精品成人免费浪潮 | 亚洲特级毛片 | 91av在线视频免费观看 | 久久久久久久久黄色 | 国产最新视频在线 | 九九久久影视 | 久久成人午夜 | 免费看色的网站 | 亚洲国产精品成人女人久久 | 看片在线亚洲 | 婷婷成人亚洲综合国产xv88 | 婷婷av网站 | 97在线观视频免费观看 | 免费久久网站 | av中文字幕免费在线观看 | 中文av免费 | 日韩美在线 | 国产在线观看 | 中文高清av| 婷婷在线免费视频 | 人成在线免费视频 | 国产精品扒开做爽爽的视频 | 亚洲精品成人网 | 亚在线播放中文视频 | 久久精品96 | 国产成人一区二区精品非洲 | 国产成人精品久久 | 日韩二区三区在线观看 | 曰本免费av| 一区二区三区视频 | 国产精品久久久久久a | 天天操夜夜操夜夜操 | 在线观看黄 | 亚州精品成人 | h视频在线看| 日本护士撒尿xxxx18 | 免费在线观看国产精品 | 国产精品自产拍在线观看中文 | 国产精品成人自产拍在线观看 | 毛片网站免费在线观看 | 亚洲影院一区 | 久久久久免费观看 | 精品夜夜嗨av一区二区三区 | 国产精品99久久久久久武松影视 | 九九99| 91精品网站在线观看 | 国产黄影院色大全免费 | 天天操天天色天天射 | 人人狠狠综合久久亚洲 | 久久免费视频精品 | 欧美影院久久 | 亚洲高清91| 97天天干| 视频直播国产精品 | 福利网址在线观看 | 中文字幕色婷婷在线视频 | 欧美九九九 | 欧美三人交| 国产精品国产三级国产 | 四虎国产精品永久在线国在线 | 免费在线一区二区三区 | 日日草av| 国产成人在线一区 | 综合天天网| 国产精品18久久久久久久网站 | 久久久久女教师免费一区 | av 一区 二区 久久 | 欧美日韩一区二区免费在线观看 | 色狠狠操 | 91在线一区 | 91精品欧美一区二区三区 | 一本一本久久a久久精品综合妖精 | 久久久免费在线观看 | www.久久99| 美女黄网站视频免费 | 免费网站黄 | 国产精品第10页 | 免费国产在线视频 | 久久日本视频 | 国产这里只有精品 | 久草在线最新免费 | 日韩精品综合在线 | 麻豆系列在线观看 | 色综合久久久久久中文网 | 热久久99这里有精品 | 玖玖色在线观看 | 超碰日韩在线 | 久久草草影视免费网 | 最近免费中文字幕大全高清10 | 在线一区电影 | 九9热这里真品2 | 夜色成人网 | 亚洲精品乱码久久久久久蜜桃不爽 | 国产精品高清免费在线观看 | 国内精品久久久久久久97牛牛 | 91香蕉视频720p | 激情丁香久久 | 国产成人久久av免费高清密臂 | 日韩在线精品一区 | 黄色成人在线 | 亚洲播放一区 | 成人av在线影视 | 免费高清在线观看成人 | 午夜在线免费观看 | 黄色91免费观看 | 成人欧美在线 | 国内视频一区二区 | 伊人av综合 | 久久久久久国产精品999 | 91精品啪在线观看国产 | 久久国产精品99久久久久久老狼 | 免费在线国产精品 | 欧美日韩国产亚洲乱码字幕 | 在线视频亚洲 | 又黄又爽又刺激视频 | 色中射 | 国产精品免费在线 | 婷婷.com| 狠狠躁夜夜躁人人爽视频 | 久久久精品视频网站 | 国产不卡在线播放 | 久久国产亚洲精品 | 成人全视频免费观看在线看 | 亚洲精品国产成人av在线 | 日本精品二区 | 久久久久久毛片精品免费不卡 | 精品理论片 | 久久久精品 一区二区三区 国产99视频在线观看 | 久草精品资源 | 97超碰人人澡人人 | 日韩精品在线看 | 五月婷婷开心 | 六月婷操| 欧美精品一二三 | 亚洲欧洲一区二区在线观看 | 黄色天堂在线观看 | 亚洲精品视频中文字幕 | av大全在线观看 | 三级在线播放视频 | 日韩国产在线观看 | 九九日九九操 | 成人污视频在线观看 | 国产真实精品久久二三区 | 九九久| 国产精品欧美久久久久无广告 | 国内精品福利视频 | 日韩在线理论 | 91大神dom调教在线观看 | 2021国产视频 | 免费高清在线一区 | 欧美日韩一区二区在线观看 | 天天干天天做天天爱 | 免费观看xxxx9999片 | 成人av在线看 | 亚洲精品美女在线 | 国产成人中文字幕 | 久插视频 | 久久美女免费视频 | 国产亚洲午夜高清国产拍精品 | 日韩高清三区 | 综合网伊人 | 一本到视频在线观看 | 手机在线视频福利 | 毛片基地黄久久久久久天堂 | 成人av资源在线 | 日韩久久精品一区二区三区 | 欧美孕交vivoestv另类 | 久久伊人婷婷 | 久草在线在线视频 | 主播av在线| 日韩在线三区 | 久久国产精品99精国产 | av在线中文| 国内久久 | 久久国产99| 国产视频一区二区在线观看 | 日韩欧美在线视频一区二区 | 久久伊人精品天天 | 国产成人综合精品 | av在线收看 | 视频一区二区免费 | 91精品久久久久久综合五月天 | 日韩视频免费在线观看 | 91porny九色91啦中文 | 99自拍视频在线观看 | 亚洲午夜久久久久久久久电影网 | 国产午夜一区二区 | 狠狠精品 | 欧美日韩伦理在线 | 色就色,综合激情 | 国产二级视频 | 菠萝菠萝在线精品视频 | 欧美精品日韩 | 久久这里只有精品视频99 | 亚洲欧洲精品一区二区精品久久久 | 国产精品ssss在线亚洲 | 国产亚洲精品日韩在线tv黄 | 最近在线中文字幕 | 在线视频日韩欧美 | 久久第四色 | 在线观看视频中文字幕 | 亚洲精品黄色在线观看 | 久久久久久久av | 亚洲色综合| 美女网站色在线观看 | 国产最新在线 | 国产高清永久免费 | 亚洲最新在线 | 特级西西444www大精品视频免费看 | 97精品免费视频 | 国产精品无av码在线观看 | 热久久免费视频 | 久久久精品日本 | 中文字幕在线观看视频一区 | www.日韩免费 | 欧美精品在线观看免费 | 欧美日韩久| 亚洲成人第一区 | 欧美精品做受xxx性少妇 | 综合久久五月天 | 日韩在线观看不卡 | 五月天激情婷婷 | 18久久久久| 亚洲日本国产精品 | 狠狠色丁香久久综合网 | 激情婷婷av | 最近字幕在线观看第一季 | 91大神精品视频在线观看 | 91成人在线看 | av中文字幕网址 | 99久久国产免费,99久久国产免费大片 | 成人免费观看网址 | av福利在线看 | 九色激情网 | 久久久久区 | 亚洲另类在线视频 | 欧美日韩高清一区 | 特级西西444www高清大视频 | 91麻豆视频 | 国产精品久久久区三区天天噜 | 亚洲精品网址在线观看 | 欧美另类sm图片 | 狠狠色香婷婷久久亚洲精品 | 久久久影院官网 | 四虎影视成人精品国库在线观看 | 91插插插免费视频 | 国产99re| 久久试看 | 五月婷婷香蕉 | 97综合网| 久久天堂亚洲 | 成人一区二区在线观看 | 久久精品99国产精品 | 黄色av电影在线 | 天天干,天天操,天天射 | 亚洲丁香久久久 | 狠狠的干狠狠的操 | 美女视频黄是免费的 | 久久免费av| 国产1区2区3区在线 亚洲自拍偷拍色图 | 中文字幕国产精品一区二区 | 深夜国产福利 | 免费看成年人 | 丁香婷婷激情国产高清秒播 | 免费观看黄色av | 99精品国产在热久久 | 99久久精品国产毛片 | 深爱开心激情网 | 免费在线观看成人小视频 | 视频成人免费 | 免费黄色av片 | 国产精品原创视频 | 91| 久视频在线 | 天天玩天天操天天射 | 欧美精品小视频 | 在线观看国产高清视频 | 成人三级网址 | 国产亚洲在线视频 | 狠狠色丁香婷婷综合久小说久 | 最近中文字幕大全中文字幕免费 | 免费在线播放视频 | 狠狠色狠狠色 | 91久久丝袜国产露脸动漫 | 久久精品亚洲一区二区三区观看模式 | 国产精品欧美精品 | 97av视频 | 天天操导航 | 国产成人不卡 | 日本aaa在线观看 | 成人黄色小视频 | 亚州av成人 | 久草香蕉在线视频 | 日韩专区在线播放 | 久久精品aaa | 一区三区视频 | 天天操人人干 | 一区二区三区中文字幕在线观看 | 亚洲一级黄色片 | 免费污片| 欧美激情综合网 | 日日婷婷夜日日天干 | 国产一区二区三区高清播放 | 日韩精品一卡 | 欧美激情在线看 | 91视频 - 114av | 久久亚洲人| 在线观看你懂的网站 | 成人理论电影 | 精品一区二区综合 | 国产高清不卡av | 成人免费观看在线视频 | 婷婷色站 | 激情影院在线 | 日韩欧美在线第一页 | 西西www4444大胆视频 | 国内精品久久久久久久久 | 国产96在线 | 911av视频| 国产精品一区二区三区在线播放 | 中文字幕在线看视频国产中文版 | 久久久私人影院 | 婷婷六月综合亚洲 | 九九久久婷婷 | 激情久久影院 | av综合站 | av免费成人 | 国产成人精品一区二三区 | 亚洲精品在线看 | 国产精品九九九九九 | 国产精品一区专区欧美日韩 | 中文一区在线 | 在线一区二区三区 | 免费韩国av | 天天射天天拍 | 国产一区二区免费 | 日韩欧美在线一区 | 在线观看深夜视频 | 黄色一级网 | 国内精品久久久久久久影视麻豆 | 人人爽人人爽人人片 | 99热日本| 免费看一级黄色 | 久久精品国产精品亚洲 | 国产又粗又硬又长又爽的视频 | 麻豆91小视频 | 成人羞羞视频在线观看免费 | 国产精品久久久久久99 | 丁香五月亚洲综合在线 | 男女激情免费网站 | 国产成人免费在线观看 | 日韩在线精品一区 | 美女视频一区 | 久久国产欧美日韩 | 欧美日韩中文在线视频 | 视频一区在线免费观看 | 2024av| 午夜精品一区二区三区在线视频 | 99久久精品国产欧美主题曲 | 午夜的福利 | 亚洲国产mv | 午夜视频一区二区 | 91九色国产视频 | 美女视频一区二区 | 天天做日日做天天爽视频免费 | 久久综合五月 | 国产精品午夜久久 | 免费看一级一片 | 国产精品免费久久久久 | 免费观看国产视频 | 日韩精品短视频 | 色婷婷色 | 国产免费又爽又刺激在线观看 | av一级片在线观看 | 日韩成人精品在线观看 | 99久久精品国产系列 | 国产精品美女久久久久久久 | 色婷婷免费视频 | 97精品国产97久久久久久春色 | 久久99在线 | 九色在线 | 91精品在线视频观看 | 成人在线免费观看视视频 | 国产精品美女久久久久久久 | 国产精品扒开做爽爽的视频 | 国产精品久久嫩一区二区免费 | 福利网在线 | 天天干人人干 | 97超碰在线资源 | 国产精品九九九九九九 | 久久天堂网站 | 中文字幕有码在线观看 | 亚洲精品久久久久中文字幕m男 | 日本在线观看一区二区三区 | 91视频中文字幕 | 91精品导航| 麻豆传媒电影在线观看 | 五月综合激情 | www激情com| 国产精品久久久久久影院 | 亚洲婷婷伊人 | 一区在线观看视频 | 91视频在线看| 99国产高清 | 少妇bbw搡bbbb搡bbbb| 美女av在线免费 | 久久综合精品一区 |