以下討論的DBMS全是mysql
檢索數據
以world中city表爲例
檢索單個列select name from city
仔細對比會發現結果是無序的,跟原始表單中的順序並不是互相對應的。
結束SQL的語句,多條SQL語句必須以分號(;)分隔,MySQL如同多數DBMS一樣,並不需要加上;,但是加上也沒有壞處。
但是如果使用的是mysql的命令行必須要加上;來結束SQL語句。
SQL語句和大小寫:SQL並不區分大小寫,但是區分大小寫更容易閱讀和理解。值得注意的是有些標識符需要區分大小寫(數據庫、表、列名)等。
使用空格:在處理SQL語句時,其中所有的空格都被忽略,所以可以把SQL分成多行便於閱讀。
檢索多個列:select name,ID,Population from city;
注意:這裏使用逗號分開,但是逗號不能加錯位置。
但是如圖所示,查詢的結果仍舊不是原數據的結構組織。
檢索出所有的列select * from city;
檢索出不同的行select distinct Isofficial from countrylanguage;
Distinct 去除了結果中的重複值,只顯示唯一值。
限制結果
Select語句返回的結果是所有的,爲了返回第一行或者前幾行可以使用limit子句。
select name from city limit 6;返回結果爲6條
爲得出下一個6行,可以指定檢索開始行和行數
select name from city limit 6,6;
注意:
行0:檢索出來的第一行爲行0而不是行1,因此limit1將檢索出來第二行
在行數不夠時:MYsql將只返回它能返回的那麼多
MySQL5以後limit3,4=limit4offset3
使用完全限定的表名
select city.Name from world.city;
在數據庫world中選擇表city的行name
排序檢索數據
檢索出的數據並不是以純粹的隨機順序顯示,如果不排序,數據一般將以它在底層的表中出現的順序顯示,這可以是數看,據添加到表中的順序。
子句(clause)SQL語句由子句構成,有些子句是必須的,而有一些是可以選的。
爲了明確排序用select語句檢索出的數據,可以使用order by子句。Order by子句取一個或多個列的名字,據此對輸出進行排序。
select name,ID from city order by ID;
按照多個排序
只需要制定列名,列名之間用逗號分開即可。
select name,ID,population from city order by Population,name;
數據的排序方式默認爲升序排序(從A到Z),也可以用order by 進行降序排序,此時需要指定DESC關鍵詞。
select name,ID from city order by ID desc;
select name,ID,population from city order by Population desc,ID;
如果想在多個列上進行將序排列,一定要將每個列都指定DESC關鍵字。
與DESC相對應的是升序ASC,但是升序一般是默認,很少會用到。
Order by和limit組合可以找出一個列中的最高或者最低的值。(limit在order by後邊)
select name,ID,population from city order by Population desc limit 1;
得出的結果是人口最多的ID。
過濾數據
數據庫表一般包含大量的數據,很少需要檢索表中的所有行,通常根據特定的操作報告需求提取表數據的子集,只檢測所需數據需要指定搜索條件,也稱爲過濾條件。
在同時使用where和order by時,where優先在前,否則會報錯。
操作符 |
說明 |
= |
等於 |
<> |
不等於 |
!= |
不等於 |
< |
小於 |
<= |
小於等於 |
> |
大於 |
>= |
大於等於 |
BETWEEN |
在指定的兩個值之間 |
檢查單個值select name,ID,population from city where ID =5;
檢查某個條件
select name,ID,population from city where population >= 1000000;
不匹配檢查
select * from city where countrycode <> "JPN";
剔除countrycode 爲JPN的數據
範圍值檢查select * from city where ID between 6 and 10;
篩選出ID從6至10的數據。
篩選出空值:select * from city where District is null;
爲了進行更強的過濾控制,MySQL允許給出多個WHERE子句,有兩種方式使用:以AND子句方式或OR子句方式使用。
操作符(Operator):用來聯結或改變WHERE子句中的子句的關鍵詞。也稱爲邏輯操作符(logical operator )。
AND操作符
爲了通過不止一個列進行過濾,可使用AND操作符給WHERE子句附加條件。
select * from city where countrycode ="TWN"and population<=160000;
OR操作符
與AND操作符不同,匹配任意條件即可。
select * from city where countrycode ="TWN" or countrycode ="AIA";
計算次序
Where可以包含任意數目的AND或OR操作符,允許兩者進行復雜或者高級的過濾。
但是SQL像多數語言一樣,在處理OR操作符前,優先處理AND操作符。
解決方案是用圓括號明確的分組相應的操作符,消除分歧。
IN操作符:用來指定條件範圍,範圍中的每一個條件都可以進行匹配。IN取合法值的由逗號分隔清單都在圓括號中。
select * from city where ID in (1,2,10) order by population;
注意,這裏只有ID爲1,2,10的三條數據。
IN操作符的優點:
在使用長的合法選項清單時,IN操作符的語法更清楚更直觀。
在使用IN時,計算的次序更容易管理。
IN操作符一般比OR操作符清單執行更快。
IN最大的優點是可以包含其他select語句,使得能夠更動態的建立where子句。
NOT操作符:否定後跟條件的關鍵字。
用通配符進行過濾
通配符:用來匹配值的一部分特殊字符。
搜索模式:由字面值、通配符或兩者組合成的搜索條件。
通配符本身是SQL的WHERE子句中有特殊含義的字符,SQL支持幾種通配符。爲在搜索子句中使用通配符,必須使用LIKE操作符。
LIKE指示MySQL後跟的搜索模式利用通配符匹配而不是直接相等匹配進行比較。
百分號(%)通配符
最常使用的通配符是百分號%,在搜索串中,%表示任何字符出現任意次數。
select * from city where name like'ka%';
注意:這裏的搜索根據MySQL的配置方式是可以區分大小寫的。
‘%ka%’表示匹配中間有ka的文本,不管他前後出現什麼內容。‘s%e’表示匹配以s開頭e結尾的對象,%除了一個或多個字符外還能匹配0個字符。
注意null:%不能匹配null。
劃線通配符(-),但是下劃線的用途與%一樣,但是下劃線只匹配單個字符。
通配符使用技巧:不要過度使用通配符。
用正則表達式進行搜索
select * from city where population regexp '.8000';
LIKE與REGEXP有很大的區別,且REGEXP匹配不分大小寫,如區分大小寫可以用BINARY等關鍵字。
LIKE 匹配整個列,如果匹配的文本在列值中出現,LIKE不會找到它。
進行OR匹配
匹配幾個字符之一
- =[1|2|3]
匹配特殊字符:使用\\作爲前導,\\-表示查找-,\\.表示查找.