SQL必知必會(huì)筆記(1-6)

生成數(shù)據(jù)庫(kù)表和數(shù)據(jù)的SQL文件

第1課:了解SQL

1、數(shù)據(jù)庫(kù)基礎(chǔ)

  • 數(shù)據(jù)庫(kù)(database):保存有組織的數(shù)據(jù)的容器

數(shù)據(jù)庫(kù)軟件也稱為數(shù)據(jù)庫(kù)管理系統(tǒng)(DBMS);

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

  • 列:表中的一個(gè)字段。所有表都是由一個(gè)或多個(gè)列組成

  • 數(shù)據(jù)類型:限定可存儲(chǔ)在列中的數(shù)據(jù)的種類

  • 行:表中的一條記錄

  • 主鍵:一列(或一組列),其值能夠唯一標(biāo)識(shí)表中每一行

應(yīng)該總是定義主鍵,主鍵滿足的條件:

  • 任意兩行都不具有相同的主鍵值
  • 每一行都必須具有一個(gè)主鍵(主鍵不允許為NULL)
  • 主鍵列中的值不允許修改或更新
  • 主鍵值不能重用(如果某行被刪除,它的主鍵不能賦給以后的新行)


1.2、什么是SQL

  • SQL:Structured Query Language(結(jié)構(gòu)化查詢語(yǔ)言)

SQL的優(yōu)點(diǎn):

  • 幾乎所有重要的DBMS都支持SQL;
  • SQL簡(jiǎn)單易學(xué);
  • SQL可以進(jìn)行非常復(fù)雜和高級(jí)的數(shù)據(jù)庫(kù)操作;


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



SELECT語(yǔ)句

SELECT語(yǔ)句用于從一個(gè)或多個(gè)表中檢索信息

關(guān)鍵字不能用作表或列的名字;


檢索單個(gè)列:

SELECT prod_name FROM products;

從products表中檢索名為prod_name的列,FROM關(guān)鍵字指出從那個(gè)表中檢索數(shù)據(jù)。

多條SQL語(yǔ)句必須以分號(hào)(即";")分割

SQL語(yǔ)句不區(qū)分大小寫,一般情況下,為了易于閱讀和維護(hù),對(duì)關(guān)鍵字使用大寫,而對(duì)列名和表名使用小寫;


檢索多個(gè)列

SELECT prod_id, prod_name, prod_price FROM products;

多個(gè)列之間使用逗號(hào)分隔


檢索所有列

SELECT * FROM products;

一般而言除非確實(shí)需要表中的每一列,否則最好不要使用通配符,使用通配符通常會(huì)降低檢索和應(yīng)用程序的性能;


檢索不同的值

SELECT DISTINCT vend_id FROM products;
  • DISTINCT關(guān)鍵字指示數(shù)據(jù)庫(kù)返回不同的值;
  • DISTINCT關(guān)鍵字作用于所有的列,不僅僅是緊跟其后的那一列;


限制結(jié)果

如果查詢的數(shù)據(jù)有很多,只想返回一定的行數(shù),則可以根據(jù)不同的DBMS的關(guān)鍵字來(lái)實(shí)現(xiàn)

  • SQL Server和Access: SELECT TOP 5 prod_name FROM products;
  • DB2: SELECT prod_name FROM products FETCH FIRST 5 ROWS ONLY;
  • Oracle: SELECT prod_name FROM products WHERE ROWNUM <= 5;
  • MySQL / MariaDB / PostgreSQL / SQLite: SELEC prod_name FROM products LIMIT 5;

為了得到后面的5行,可以使用OFFSET關(guān)鍵字: SELECT prod_name FROM products LIMIT 5 OFFSET 5;

指示DBMS從OFFSET指定的第5行起行起,查詢LIMIT后的 5 行數(shù)據(jù);


SQL注釋

使用注釋的原因:

  • 隨著SQL語(yǔ)句的變長(zhǎng),復(fù)雜性增加,需要添加一些描述性的文字,以便于以后自己和其他人參考;
  • 在文件開頭添加一些個(gè)人的聯(lián)系方式、程序描述以及一些說(shuō)明;
  • 暫時(shí)停止不需要執(zhí)行的SQL代碼;
  • 雙連字符注釋

    SELECT prod_name ?? -- 這是一條注釋

    FROM products;

兩個(gè)連字符之后的便是注釋的內(nèi)容

  • 另一種注釋:

      # 這是一條注釋
      # 這是一條注釋
    
  • 多行注釋

      /*
       SELECT prod_name, vend_id
       FROM products
       LIMIT 5 OFFSET 10;
      */
    


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


排序順序

子句:SQL由子句構(gòu)成,一個(gè)子句通常由一個(gè)關(guān)鍵字加上所提供的數(shù)據(jù)組成。


ORDER BY 子句可以對(duì)檢索出的數(shù)據(jù)進(jìn)行排序

SELECT prod_name
FROM products
ORDER BY prod_name;

ORDER BY 子句的位置總是在SELECT語(yǔ)句的最后一條,否則會(huì)報(bào)錯(cuò)。


按多個(gè)列排序

SELECT prod_id, prod_price, prod_name 
FROM products 
ORDER BY prod_price, prod_name;


按排列的位置排序

SELECT prod_id, prod_price, prod_name
FROM products
ORDER BY 2, 3;


指定排序方向

SELECT prod_id, prod_price, prod_name
FROM products
ORDER BY prod_price DESC, prod_name;

DESC是降序排列(DESCENDING),默認(rèn)是升序排列ASC(ASCENDING);

DESC關(guān)鍵字只能應(yīng)用到直接位于其前的列名,如果想對(duì)多個(gè)列進(jìn)行降序排列,必須對(duì)每一列指定DESC關(guān)鍵字;


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


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

使用WHERE子句

SELECT prod_name, prod_price
FROM products
WHERE prod_price = 3.49;


WHERE子句操作符

操作符 說(shuō)?明
= 等于
<> 不等于
!= 不等于
< 小于
<= 小于等于
!< 不小于
> 大于
>= 大于等于
!> 不大于
BETWEEN 在指定的兩個(gè)值之間
IS NULL 為NULL值

并非所有的DBMS都支持以上所有的操作符,如<>就不是所有的DBMS支持;

實(shí)例

查詢單個(gè)值

查詢小于價(jià)格小于10的商品

SELECT prod_name, prod_price
FROM products
WHERE prod_price < 10
ORDER BY prod_price DESC, prod_name;

限定查詢

SELECT vend_id, prod_name
FROM products
WHERE vend_id != 'DLL01';

范圍查詢

SELECT prod_name, prod_price
FROM products
WHERE prod_price BETWEEN 3 AND 10;

兩個(gè)值之間需要 AND 關(guān)鍵字隔開

NULL值查詢

SELECT cust_name
FROM customer
WHERE cust_email IS NULL;


第5課:高級(jí)數(shù)據(jù)過(guò)濾

5.1、組合WHERE子句

SQL允許給出多個(gè)WHERE子句,這些子句以 AND 子句或 OR 子句的方式組合:

  • AND操作符:AND指示DBMS檢索只滿足所有給定所有條件的行。

      SELECT prod_id, prod_price, prod_name
      FROM products
      WHERE vend_id = 'DLL01' AND prod_price <= 4
      ORDER BY prod_name DESC;
    


  • OR操作符:用來(lái)表示檢索匹配任一給定條件的行。

      SELECT prod_name, prod_price
      FROM products
      WHERE vend_id = 'DLL01' OR vend_id = 'BRS01'
      ORDER BY prod_price DESC;
    


求值順序

AND 操作符的優(yōu)先級(jí)高于 OR ,所以在同時(shí)使用時(shí)建議加上圓括號(hào)加以區(qū)別;

實(shí)例一:

SELECT prod_name, prod_price
FROM products
WHERE vend_id = 'DLL01' OR vend_id = 'BRS01' AND prod_price >= 10
ORDER BY prod_price DESC;

實(shí)例二:

SELECT prod_name, prod_price
FROM products
WHERE (vend_id = 'DLL01' OR vend_id = 'BRS01') AND prod_price >= 10 
ORDER BY prod_price DESC;


IN 操作符

IN操作符用來(lái)指定的范圍,范圍中的每個(gè)條件都可以匹配。

SELECT prod_id, prod_name, prod_price
FROM products
WHERE vend_id IN ('DLL01', 'BRS01')
ORDER BY prod_id;

使用 IN 操作符的優(yōu)點(diǎn):

  • 在有很多合法選項(xiàng)時(shí),IN操作符的語(yǔ)法更清楚,更直觀;
  • 在與AND和OR等其他操作符組合使用時(shí),求值順序更容易管理;
  • IN 操作符一般比一組OR操作符執(zhí)行的更快;
  • IN 操作符的最大優(yōu)點(diǎn)是可以包含SELECT語(yǔ)句,能夠更動(dòng)態(tài)的建立WHERE子句;


NOT操作符

NOT操作符用來(lái)否定其后跟的條件;

實(shí)例:

SELECT prod_id, prod_name
FROM products
WHERE NOT vend_id = 'DLL01'
ORDER BY prod_id;C

以上實(shí)例等同于:

SELECT prod_id, prod_name
FROM products
WHERE vend_id != 'DLL01'
ORDER BY prod_id;


第6課:用通配符進(jìn)行過(guò)濾

LIKE操作符

通配符(wildcard):用來(lái)匹配值的一部分的特殊字符


為在搜索子句中使用通配符,必須使用LIKE操作符。LIKE指示DBMS,后跟的搜索模式利用通配符而不是簡(jiǎn)單的相等匹配進(jìn)行比較。


通配符只能用于文本字段(字符串)

百分號(hào)(%)通配符

% 表示任何字符出現(xiàn)任意次數(shù);

實(shí)例: 找出所有以Fish起頭的產(chǎn)品

SELECT prod_id, prod_name
FROM products
WHERE prod_name LIKE 'Fish%';

搜索時(shí)會(huì)區(qū)分大小寫;


使用多個(gè)%通配符:找出所有包含“bean bag”的產(chǎn)品

SELECT prod_id, prod_name
FROM products
WHERE prod_name LIKE '%bean bag%';

在搜索模式的中間:找出以F開頭,以y結(jié)尾的所有產(chǎn)品

SELECT prod_id, prod_name
FROM products
WHERE prod_name LIKE 'F%y';

在中間使用時(shí)搜索電子郵件很有用,如:WHERE email LIKE 'b%@163.com';

%不會(huì)匹配NULL


下劃線(_)匹配符

下劃線通配符是用來(lái)匹配單個(gè)字符的

實(shí)例:匹配兩個(gè)

SELECT prod_id, prod_name
FROM products
WHERE prod_name LIKE '__ inch teddy bear';

匹配任意個(gè):

SELECT prod_id, prod_name
FROM products
WHERE prod_name LIKE '% inch teddy bear';

方括號(hào)([])通配符

方括號(hào)([])匹配符用來(lái)指定一個(gè)字符集,它必須匹配指定位置(通配符的位置)的一個(gè)字符;

并不是所有的DBMS都支持創(chuàng)建集合的[],只有微軟的Access和SQL Server支持。

SELECT cust_contact
FROM customers
WHERE cust_contact LIKE '[JM]%'
ORDER BY cust_contact;

對(duì)[]進(jìn)行否定,[^JM]%


使用通配符的技巧:

  • 不要過(guò)度使用通配符,如果能達(dá)到相同目的,應(yīng)該使用其他操作符;
  • 在確實(shí)需要使用時(shí),盡量不要把它們用在搜索模式的開始處,因?yàn)槟菢邮撬阉髌饋?lái)最慢的;
  • 仔細(xì)注意通配符的位置;

....

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容