mysql必知必 SQL必知必會學習筆記 一

2021-10-22 07:35:13 字數 4730 閱讀 6937

資料庫基礎

資料庫≠資料庫軟體

確切的說,資料庫軟體應稱為資料庫管理系統(dbms),資料庫是通過dbms建立和操作的容器

資料庫相當於檔案櫃(容器),表相當於檔案

同乙個資料庫不能存在相同的表名,不同的資料庫可以存在相同的表名

主鍵應滿足的條件:

唯一性非空性(not null)

主鍵列中的值不允許修改或更新

主鍵值不能重用(某行從表中刪除,其主鍵不能賦給新行)

注:可以一起使用多個列作為主鍵,所有列值的組合必須是唯一的,但其中單個列的值可以不唯一

檢索資料

sql語句一般返回原始的、無格式的資料,不同的dbms和客戶端顯示資料的方式略有不同,資料的格式化是表示問題,而不是檢索問題

select * from products; 一般而言,除非確實需要表中的每一列,否則最好別使用*萬用字元,檢索不需要的列通常會降低檢索速度和應用程式的效能;當然,萬用字元也有乙個大優點:可以檢索出名字未知的列

select distinct vend_id, prod_price from products; 使用distinct檢索不同的列值,注意distinct關鍵字作用於其後所有的列,不僅僅是跟在其後的一列,即取多個列組合起來的不同結果

當需要返回一定數量的行時,各種資料庫的實現並不相同:

sql server: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、sqlite等:select prod_name from products limit 5;

當需要從指定位置開始檢索一定數量的行數時,limit和offset組合使用

select prod_name from products limit 4 offset 3; 從第4行開始,檢索4行資料(起始行為第0行);mysql、mariadb、sqlite中可以把limit 4 offset 3 簡化為limit 3,4 ,注意 , 之前的值對應offset,, 之後的值對應limit(反過來了)

使用注釋

行內注釋

--文字,可以嵌在行內,--之後的文字就是注釋

#文字,在一行的開始處使用#,這一整行都將作為注釋

select prod_name from products; --這是一條注釋

#這是一條注釋

select prod_name from products;

多行注釋

/*文字*/,從 /* 到 */ 之間的所有內容都是注釋

/*select prod_name ,

vend_id

from products; */

select prod_name from products;

排序檢索

sql語句由子句構成,有些子句是必需的,有些則是可選的。乙個子句通常由乙個關鍵字加上所提供的資料組成。例如select語句的from子句。

order by 子句:取乙個或多個列的名字,據此對輸出進行排序。

注意:在指定一條 order by 子句時,應該保證它是select語句中最後一條子句。如果它不是最後的子句,將會出錯。

按列位置(相對位置)排序:

除了能用列名指出排序順序外,order by 還支援按相對位置進行排序。

select prod_id, prod_price, prod_name

from products

order by 2, 3;

order by 2 表示按select清單中的第二個列prod_price進行排序;order by 2, 3 表示先按prod_price,再按prod_name進行排序。

這一技術的主要好處在於不用重新輸入列名;缺點是可能造成錯用列名、對select清單進行更改時容易錯誤地對資料進行排序、如果進行排序的列不在select清單中,顯然不能使用這項技術。

如果有必要,可以混合使用實際列名和相對列位置

指定排序方向

資料排序預設是公升序排序(從a到z),當然,也可以使用desc關鍵字在order by 子句中進行降序排序

select prod_id, prod_price, prod_name

from products

order by prod_price desc, prod_name;

desc關鍵字只應用到直接位於其前面的列名,因此,上面的語句prod_price列以降序排序,而prod_name列(在每個**內)仍然以預設公升序排序

注意:如果想在多個列上進行降序排列,必須對每一列指定desc關鍵字

過濾資料

sql過濾與應用過濾

sql過濾之後,資料也可以在應用層過濾,但是通常這種做法及其不妥。優化資料庫後可以更快速有效地對資料進行過濾。而讓客戶端應用(或開發語言)處理資料庫的工作將會極大地影響應用的效能,並且使所建立的應用完全不具備可伸縮性。此外,如果在客戶端過濾資料,伺服器不得不通過網路傳送多餘的資料,這將導致網路頻寬的浪費。

使用between關鍵字時,必須指定兩個值--所需範圍的低端值和高階值,這兩個值必須用and關鍵字分隔。between匹配範圍中的所有的值,包括指定的開始值和結束值,即左閉右閉[ ]區間。

確定值是否為null,不能簡單地檢查是否等於null,select語句有乙個特殊的where子句,可用來檢查具有null值的列,這個where子句就是 is null 子句

select cust_name

from customers

where cust_email is null;

null和非匹配

通過過濾選擇不包含指定值的所有列時,我們可能希望返回包含null值的行,但是這做不到,因為null比較特殊,所以在進行匹配過濾或非匹配過濾時,不會返回這些結果。

高階資料過濾

在where子句中使用圓括號

任何時候使用具有and和or操作符的where子句,都應該使用圓括號明確地分組操作符。不要過分依賴預設求值順序,即使它確實如你希望的那樣。使用圓括號沒有什麼壞處,它能消除歧義。

in操作符

where子句中用來指定要匹配的清單的關鍵字,功能與or相當

其優點如下:

在有很多合法選項時,in操作符的語法更清楚、更直觀

在與其他and和or操作符組合使用in時,求值順序更容易管理

in操作符一般比一組or操作符執行得更快

in操作符的最大優點是可以包含其他select語句,能夠動態地建立where子句

not操作符

where子句中用來否定其後條件的關鍵字

select prod_name

from products

where not vend_id = 'dll01'

order by prod_name;

上面的例子也可以使用 <> 操作符來完成

select prod_name

from products

where vend_id <> 'dll01'

order by prod_name;

為什麼使用not?

對於簡單的where子句,使用not確實沒有什麼優勢,但在更複雜的子句中,not是非常有用的。例如,在與in操作符聯合使用時,not可以非常簡單地找出與條件列表不匹配的行

用萬用字元進行過濾

萬用字元本身實際上是sql的where子句中有特殊含義的字元,sql支援幾種萬用字元。為在搜尋子句中使用萬用字元,必須使用like操作符。like指示dbms,後跟的搜尋模式利用萬用字元匹配而不是簡單的相等匹配進行比較。

最常使用的萬用字元是百分號(%),表示任何字元出現任意次數(0次、1次或多次)。

select prod_id, prod_name

from products

where prod_name like 'fish%';

此例子使用了搜尋模式 'fish%' ,將檢索任意以fish起頭的詞,%告訴dbms接受fish之後的任意字元,不管它有多少字元

mysql等dbms預設搜尋是不區分大小寫的,根據dbms的不同及其配置,搜尋是可以區分大小寫的。如果區分大小寫,則 'fish%' 與 fish bean bag toy就不匹配

注意null:萬用字元%看起來像是可以匹配任何東西,但有個例外,這就是null。子句 where prod_name like '%' 不會匹配產品名稱為null的行

另乙個有用的萬用字元是下劃線(_),它只匹配單個字元,而不是多個字元。

select prod_id, prod_name

from products

where prod_name like '__ inch teddy bear';

注意這個where子句中的搜尋模式給出了後面跟有文字的兩個萬用字元,結果如下:

圖6-1

8 inch teddy bear 產品沒有匹配,因為搜尋模式要求匹配兩個萬用字元而不是乙個,%萬用字元則可以有任意多個。

與 % 能匹配任意個數的字元不同,_ 總是剛好匹配乙個字元,不能多也不能少。

使用萬用字元的技巧:

正如所見,sql的萬用字元很有用,但這種功能是有代價的,即萬用字元搜尋一般比前面討論的其他搜尋要耗費更長的處理時間,這裡給出一些使用萬用字元時要記住的技巧:

不要過度使用萬用字元。如果其他操作符能達到相同的目的,應該使用其他操作符

在確實需要使用萬用字元時,也盡量不要把它們用在搜尋模式的開始處。把萬用字元置於開始處,搜尋起來是最慢的

仔細注意萬用字元的位置。如果放錯地方,可能不會返回想要的資料

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

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

SQL必知必會

資料庫 儲存有組織的資料的容器。資料庫管理系統 dbms 資料庫軟體,資料庫是通過dbms建立和操縱的容器。表 某種特定資料型別的結構化清單。資料庫中的每個表都有自己的名字,且唯一。不同的資料庫可以使用相同的表名。表的特性 模式 資料在表中如何儲存,儲存什麼樣的資料,資料如何分解。模式可以用來描述資...

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

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