SQL必知必會(筆記)

由于本人使用的mac,第一次涉及數(shù)據(jù)庫方面知識,軟件與環(huán)境配置都不是那么熟悉,安裝MySQL還有GUI客戶端的安裝使用都是參照這位同學:不會停的蝸牛非常感謝!
分別為
安裝SQL:圖解Mac下如何安裝管理MySQL
使用MySQL Workbench

這里寫下SQL必知必會的前幾章的筆記
目錄:

  • 檢索數(shù)據(jù)
  • 排序檢索數(shù)據(jù)
  • 過濾數(shù)據(jù)
  • 高級數(shù)據(jù)過濾

一、檢索數(shù)據(jù)

簡單的
SELECT * FROM XXX 檢索出XXX表中的所有列

SELECT Y, Z, W FROM XXX 檢索出XXX表中的列,如果有多個則用逗號隔開

SELECT DISTINCT Y FROM XXX 檢索出XXX表中不同的值,返回的是不同值

限制結果:

SELECT TOP5 prod_name FROM XXX;只檢索前5行數(shù)據(jù)

SELECT prod_name FROM XXX 
FETCH FIRST 5 ROWS ONLY;//使用DB2的語法
SELECT prod_name FROM xxx WHERE ROWNUM <=5;
-- 使用Oracle時的語法
SELECT prod_name FROM xxx LIMIT 5;
-- 使用MySQL、MariaDB或者SQLite需要使用LIMIT字句。
SELECT prod_name FROM xxx LIMIT 5 OFFSET 5;
-- 為了得到后面的5行數(shù)據(jù),即第一個數(shù)字指從哪開始,第二個數(shù)字是檢索的行數(shù)

注意:第0行

第一個被檢索的行是第0行,而不是第一行

MySQL支持簡化版的

LIMIT 4 OFFSET 3 
-- 可以簡化為 
LIMIT 3,4
-- 之前的值對應 LIMIT,之后的值對應 OFFSET

使用注釋:行內注釋

SELECT prod_name    -- 這是一條注釋 

FROM Products;
  1. 注釋使用-- (兩個連字符)嵌在行內。-- 之后的文本就是注釋
  2. 在一行的開始處使用#,這一整行都將作為注釋。
/* SELECT prod_name, vend_id 

FROM Products; */ 

SELECT prod_name 

FROM Products;
  1. 也可以進行多行注釋,注釋可以在腳本的任何位置停止和開始。

    注釋從/*開始,到*/結束,/**/之間的任何內容都是注釋。這種方式常用于給代碼加注釋,

二、排序檢索數(shù)據(jù)

SELECT prod_name
FROM Products
ORDER BY prod_name

使用ORDER BY這樣DBMS軟件對prod_name列以字母順序排列數(shù)據(jù)

警告??:在指定一條ORDER BY子句的時候,保證它是SELECT語句中最后一條子句,不然的話會出現(xiàn)錯誤信息

也可以通過非選擇列進行排序

通常,ORDER BY子句中使用的列將是為顯示而選擇的列。但是,實際上并不一定要這樣,用非檢索的列排序數(shù)據(jù)是完全合法的。

按照多個列排序

經(jīng)常我們需要不止一個列進行數(shù)據(jù)排序,如果要顯示雇員的名單,可能希望按姓和名排序,(先按照姓排序,然后在每個姓中再按照名排序),這樣對于重姓來說很有用。

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

重要是理解在按多個列排序時,排序完全按規(guī)定進行,僅在相同的prod_price時才對prod_name進行排序

按列位置排序

除了能用列名指出排序順序外,ORDER BY還支持按相對列位置進行排序。

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

這里和上面的查詢結果相同,不同之處在于ORDER BY子句.SELECT清單中指定的是選擇列的相對位置而不是列名.ORDER BY 2表示按SELECT 清單中的第二個列prod_name進行排序

這一技術的主要好處在于不用重新輸入列名,也有缺點,

1.不能明確給出列名可能造成錯用列名排序,

2.其次在SELECT清單進行更改是容易錯誤地對數(shù)據(jù)進行排序(可能忘記對ORDER BY子句做改動),

3.如果排序的列不在SELECT清單中,不能使用這項技術[不能按非選擇列進行排序]

指定排序方向

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

數(shù)據(jù)排序不限升序排序(從A—>Z)這是默認的排序方式,為了進行降序排序,必須指定DESC關鍵字

多個列排序

SELECT prod_id, prod_price, prod_name
FROM Products
ORDER BY prod_price DESC, prod_name;
/* DESC關鍵字只應用到直接位于其前面的列名,所以上述例子prod_price是降序排列,而prod_name則是升序排列*/

三、過濾數(shù)據(jù)

使用SELECT語句的WHERE子句指定搜索條件

SELECT prod_name, prod_price
FROM Products
WHERE prod_price = 3.49;

這條語句從products表中檢索兩個列,但不返回所有行,只返回prod_price值為3.49的行

數(shù)據(jù)也可以在應用層過濾。為此,SQL的SELECT語句為客戶端應用檢索出超過實際所需的數(shù)據(jù),然后客戶端代碼對返回數(shù)據(jù)進行循環(huán),提取出需要的行。

通常,這種做法極其不妥。優(yōu)化數(shù)據(jù)庫后可以更快速有效地對數(shù)據(jù)進行過濾。而讓客戶端應用(或開發(fā)語言)處理數(shù)據(jù)庫的工作將會極大地影響應用的性能,并且使所創(chuàng)建的應用完全不具備可伸縮性。此外,如果在客戶端過濾數(shù)據(jù),服務器不得不通過網(wǎng)絡發(fā)送多余的數(shù)據(jù),這將導致網(wǎng)絡帶寬的浪費。

警告??:WHERE子句的位置

在同時使用ORDER BY 和 WHERE子句時,應該讓ORDER BY位于WHERE之后

WHERE子句操作符

操作符 說明
= 等于
<> 不等于
!= 不等于
< 小于
<= 小于等于
! 不小于
> 大于
>= 大于等于
!> 不大于
BETWEEN 在指定的兩個值之間
IS NULL 為NULL值

不匹配檢查

SELECT vend_id, prod_name
FROM Products
WHERE vend_id <> 'DLL01'
/*何時使用引號?:單引號用來限定字符串.如果將值與字符串的列進行比較,就需要限定引號.用來與數(shù)值列進行比較的值不用引號*/

警告??:是使用!=還是<>?

要根據(jù)你所使用的DBMS,具體請參考相應的DBMS文檔

范圍值檢查

要檢查某個范圍的值,可以使用BETWEEN操作符

范例:

SELECT prod_name, prod_price
FROM Products
WHERE prod_price BETWEEN 5 AND 10;
/*在使用BETWEEN時,必須指定兩個值——所需范圍的低端值和高端值。這兩個值必須用AND關鍵字分隔。BETWEEN匹配范圍中所有的值,包括指定的開始值和結束值。*/

空值檢查

再創(chuàng)建表時,表設計人員可以指定其中的列能否不包含值.在一個列不包含值時,稱其包含空值NULL

無值(no value),它與字段包含0、空字符串或僅僅包含空格不同。

確定值是否為NULL,不能簡單地檢查是否= NULL。SELECT語句有一個特殊的WHERE子句,可用來檢查具有NULL值的列。這個WHERE子句就是IS NULL子句。其語法如下:

SELECT prod_name
FROM products
WHERE prod_price IS NULL;

注意: NULL和非匹配

通過過濾選擇不包含指定值的所有行時,你可能希望返回含NULL值的行。但是這做不到。因為未知(unknown)有特殊的含義,數(shù)據(jù)庫不知道它們是否匹配,所以在進行匹配過濾或非匹配過濾時,不會返回這些結果。

過濾數(shù)據(jù)時,一定要驗證被過濾列中含NULL的行確實出現(xiàn)在返回的數(shù)據(jù)中。

小結:本小節(jié)學習了如何使用SELECT語句和WHERE子句過濾返回的數(shù)據(jù)

四、高級數(shù)據(jù)過濾

組合WHERE子句,上一課所以WHERE子句在過濾數(shù)據(jù)的時候都是單一的條件,為了更強的過濾控制,SQL給出了多個WHERE子句,有兩張方式使用,AND子句和OR子句

這一課講授如何用ANDOR操作符組合成WHERE子句,還講授了如何明確地管理求值順序,如何使用INNOT操作符。

操作符(operator)

用來聯(lián)結或改變WHERE子句中的子句的關鍵字,也稱為邏輯操作符(logical operator)。

AND

用在WHERE子句中的關鍵字,用來指示檢索滿足所有給定條件的行。

OR

WHERE子句中使用的關鍵字,用來表示檢索匹配任一給定條件的行。

IN

WHERE子句中用來指定要匹配值的清單的關鍵字,功能與OR相當。

AND操作符

SELECT prod_id, prod_price, prod_name
FROM Products
WHERE vend_id = 'DLL01' AND prod_price <= 4;

上面的語句應該不難解釋

OR操作符

SELECT prod_name, prod_price
FROM Products
WHERE vend_id = 'DLL01' OR vend_id = 'BRS01';

結果和上述類似,這里也不做說明

求值順序

/*目的是為了篩選出vend_id是
DLL01和BRS01,并且價格是大于等于10的*/
SELECT prod_name, prod_price
FROM Products
WHERE vend_id = 'DLL01' OR vend_id = 'BRS01'
AND prod_price >= 10;
/*但是結果卻和預期不一樣
prod_name               prod_price

-------------------     ----------

Fish bean bag toy       3.4900

Bird bean bag toy       3.4900

Rabbit bean bag toy     3.4900

18 inch teddy bear      11.9900

Raggedy Ann             4.9900*/

原因是:SQL中在處理OR操作符之前,優(yōu)先處理AND操作符.SQL理解為BRS01制造的價格10美元以上以及DLL01制造的所有產(chǎn)品,No matter價格多少(解決方法就是使用圓括號,進行分組)

SELECT prod_name, prod_price
FROM Products
WHERE (vend_id = 'DLL01' OR vend_id = 'BRS01')
AND prod_price <= 10;
-- 使用圓括號沒有什么壞處,可以消除歧義,盡量不要依賴默認求值順序

IN操作符

IN操作符用來指定條件范圍,范圍中的每個條件都可以進行匹配。IN取一組由逗號分隔、括在圓括號中的合法值。

SELECT prod_name, prod_price
FROM Products
WHERE vend_id IN ('DLL01', 'BRS01')
ORDER BY prod_name;
-- 上下兩端代碼功能是相同的
SELECT prod_name, prod_price
FROM Products
WHERE vend_id = 'DLL01' OR vend_id = 'BRS01'
ORDER BY prod_name;

為什么要使用IN操作符?其優(yōu)點為:

  • 在有很多合法選項時,IN操作符的語法更清楚,更直觀。
  • 在與其他ANDOR操作符組合使用IN時,求值順序更容易管理。
  • IN操作符一般比一組OR操作符執(zhí)行得更快(在上面這個合法選項很少的例子中,你看不出性能差異)。
  • IN的最大優(yōu)點是可以包含其他SELECT語句,能夠更動態(tài)地建立WHERE子句。

NOT操作符

SELECT prod_name
FROM Products
WHERE NOT vend_id = 'DLL01'
ORDER BY prod_name;
-- 列出除DLL01之外的所有數(shù)據(jù)
SELECT prod_name
FROM Products
WHERE vend_id <> 'DLL01'
ORDER BY prod_name;

這里的NOT否定跟在其后的條件,因此DBMS不是匹配vend_id為DLL01,而是匹配非DLL01之外的所有東西,以上也可以使用<>來完成

既然這樣為什么還要使用NOT呢?

對于這里的這種簡單的WHERE子句,使用NOT確實沒有什么優(yōu)勢。但在更復雜的子句中,NOT是非常有用的。例如,在與IN操作符聯(lián)合使用時,NOT可以非常簡單地找出與條件列表不匹配的行。

以上就是前五課的總結與筆記(未完待續(xù))

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

相關閱讀更多精彩內容

友情鏈接更多精彩內容