MySQL必知必會(三)

2021-08-23 14:03:03 字數 3508 閱讀 9570

sql還允許建立子查詢,即巢狀在其他查詢中的查詢。

包含子查詢的select語句難以閱讀和除錯,特別是它們較為複雜時更是如此。

但是,將子查詢分解為多行並且適當地進行縮排,能極大地簡化子查詢的使用。

子查詢的數目沒有限制,不過在實際使用中由於效能的限制,不巢狀太多的子查詢。

逐漸增加子查詢來建立查詢。

什麼是,為什麼用,如何編寫聯結的select語句

sql的強大性:可以在資料檢索查詢的執行中聯結(join)表。聯結是利用sql的select能執行的最重要的操作。

關係表

外來鍵:為某個表中的一列,它包含另乙個表的主鍵值。定義了2個表之間的關係。

優勢

1.資訊不重複,不浪費時間和空間

2.如果有乙個資訊改動,只需要改變乙個表中的單個記錄。相關表的資料不用改動。

3.資料無重複,顯然資料是一致的,使得處理資料更簡單。

總結

關係資料可以有效地儲存和方便地處理,可伸縮性遠比非關聯式資料庫要好。

可伸縮性

能夠適應不斷增加的工作量而不失敗。

設計良好的資料庫或應用程式稱為伸縮性好。

如果資料儲存在多個表中,怎麼樣用單條select語句檢索資料。

使用聯結。聯結是一種機制,用來在一條select語句中關聯表。

聯結由mysql根據需要建立,它存在於查詢的執行當中。

建立聯結

需要規定要聯結的所有表以及它們如何關聯。

完全限定列名:在引用的列可能出現二義性,必須使用完全限定列名(用乙個點分割的表名和列名),如果引用乙個沒有用表名限制的具有二義性的列名,mysql將返回錯誤。

舉例:

select a,b,c

form 表1,表2

where 表1.c=表2.c

order by a,c

由沒有聯結條件的表關係返回的結果為笛卡爾積。檢索出的行的數目將是第乙個表中的行數*第二個表中的行數。

要保證所有的聯結都有where子句

否則mysql將返回比想要的資料多得多的資料。

有時會聽到返回稱為叉聯結的笛卡爾積的聯結型別。

等值聯結:基於2個表之間的相等測試。這種聯結稱為內部聯結。

內部聯結

inner join 指定,聯結條件用特定的on子句而不是where子句給出。

首先inner join語法。

聯結多個表

對聯結的表個數無限制。

首先在from後邊列出所有表,然後再定義表之間的關係。

mysql在執行時關聯指定的每個表以處理聯結。這種處理可能可能耗資源。不要鏈結不必要的表。表越多,效能下降越厲害。

使用表別名

別名除了應用於列名和計算欄位外,sql還允許給表名起別名。

有2個理由:

1.縮短sql語句

2.允許在單條select語句中多次使用相同的表

注意

表別名只在查詢執行中使用。與列別名不一樣,表別名不返回到客戶機

使用不同型別的聯結

除了內部聯結這種簡單的聯結之外,還有其他的方式:

1.自聯結

用自聯結代替從相同表中檢索資料時使用的子查詢語句。

2.自然聯結

3.外部聯結

outer join指定聯結型別。使用時必須使用right或者left關鍵字指定包括其所有行的表(right指出的是outer join 右邊的表),而left指出的是outer join左邊的表。

舉例:

from customers left inner join orders

意思:從from子句的左邊表(customers)中選擇所有行。

外部聯結的型別:左聯結和右聯結

唯一差別:所關聯的表的順序不同。

聯結的使用條件

1.注意所使用的聯結型別。一般使用內部聯結,但使用外部鏈結也是有效的。

2.保證使用正確的聯結條件,否則將返回不正確的資料

3.應該總是提供聯結條件,否則會得出笛卡爾乘積。

4.乙個聯結中可以包含多個表,甚至對於每個聯結可以採用不同的聯結型別。最好使用前測試測試。

union將多條select語句組合成乙個結果集。

組合查詢

2種情況需要使用它:

1.在單個查詢中從不同的表返回類似結構的資料;

2.對單個表執行多個查詢,按單個查詢返回資料;

建立組合查詢

union操作符來組合數條sql查詢。利用union,可給出多條select語句,將它們的結果組合成單個結果集。

使用union:

所需要做的就是給出每條select語句,在各條語句之間放上關鍵字union。

union規則

必須由2條或2條以上的select語句組成,語句之間用關鍵字union分割。

使用union all ,mysql不取消重複的行。

並非所有的引擎都支援全文本搜尋。

2個最常用的是myisam和innodb.

前者支援,後者不支援。

為進行全文本搜尋,必須索引被搜尋的列,而且隨著資料的改變不斷地重新索引。

啟動全文本搜尋支援

建立表時,根據子句fulltext(note_text)的指示對它進行索引。這個表中有乙個名為note_text的列,為了進行全文本搜尋,根據子句full_text的指示對它進行索引。

不要再匯入資料時使用fulltext,更新索引需要花時間,雖然不多,但是畢竟要花時間。如果正在匯入資料到乙個新錶,此時不應該啟用fulltext索引,要先導入所有資料,然後再修改表。

2個函式

match() 指定被搜尋的列

against() 指定要使用的搜尋表示式

使用全文本搜尋返回以文字匹配的良好程度排序的資料。2個行都包含詞rabbit,但是作為第3個字的等級,比作為第20個字的行高,具有較高等級的行先返回。

由於資料是索引的,全文本搜尋很快

布林文字搜尋

mysql支援全文本搜尋的另外一種形式,稱為布林形式。即使沒有fulltext索引也可以使用。

看不下去了…

MYSQL必知必會(三)

like操作符 萬用字元 用來匹配值得一部分的特殊字元 搜尋模式 由字面值 萬用字元或者兩者組合構成的搜尋條件。select from goods where goods name like 諾基 執行這條語句的時候,將檢索任意以 諾基 開頭的產品,告訴mysql接受 諾基 之後的任意字元,不管它有...

mysql必知必會 mysql必知必會(四)

十四 理解子查詢 1 通過子查詢過濾 這本書在所有的章節都關連到了資料庫表,訂單資料是儲存在兩個表中,orders表儲存著 訂單號碼 顧客id和訂單日期。個人的訂單列表關連著orderitems表,訂單表沒有儲存顧客資訊,它只是儲存著顧客id,這實際的顧客資訊是儲存在customers表中。現在假設...

mysql的必知必會 mysql 必知必會 筆記

好久沒有寫了。1 show columns from table 等同於describe table顯示的是表的結構。而select from table 則顯示的是整個表中插入的資料。2 select distinct c1,c2 from table除非列不相同,否則所有行將被檢索出來,即不能對...