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除非列不相同,否則所有行將被檢索出來,即不能對...