數(shù)據(jù)查詢?nèi)腴T
什么是數(shù)據(jù)查詢
數(shù)據(jù)庫(kù)的查詢是對(duì)數(shù)據(jù)表中現(xiàn)有的數(shù)據(jù)進(jìn)行逐行篩選的工作,它按照要求從符合查詢條件的記錄中把指定的字段值提取出來,形成一個(gè)結(jié)果呈現(xiàn)給用戶。
簡(jiǎn)單查詢
select 命令在SQL語(yǔ)句中使用頻率是最高的。在select語(yǔ)句中包含大量的子句,用于完成不同的查詢功能,如排序(OPDER BY)、條件(WHERE)、分組(GROUP BY)等
基本語(yǔ)句
select命令的最基本的語(yǔ)法如下
select select_list
from table_name
[WHEREsearch_condition]
[ORDER BY order_expression[ASC|DESC]]
[LIMIT [offset] rowcount]
語(yǔ)法說明
select_list :用戶要查詢的字段列表,“**” 代表所有字段
table_name : 用戶要查詢信息的表(表或視圖)。
where : 查詢的篩選條件開始關(guān)鍵字。
search_condition: 查詢條件的內(nèi)容。
order_expression: 按照那些字段進(jìn)行排序
asc: 表明是升序
Desc: 將結(jié)果按照降序排序
limit: 限制每次查詢出來的數(shù)據(jù)字?jǐn)?shù)
基本應(yīng)用
select 全麥查詢
用戶有時(shí)需要查看當(dāng)前表內(nèi)的所有內(nèi)容,分析表的信息內(nèi)容是,可以采用下面的方式查看學(xué)生表中所有的數(shù)據(jù)
示例:
select* from StudentInfo
select 選擇列查詢
select id,studemtNmae,age from StuddentInfo
查詢中的別名
當(dāng)直接使用select查詢后,由于在設(shè)計(jì)數(shù)據(jù)庫(kù)是使用的是都是英文的字段名,而且有的字段名不是很好理解,對(duì)用戶來說不夠直觀。
使用AS關(guān)鍵字為字段定義別名
語(yǔ)法:
select 字段名1 AS 別名,字段名2 AS 別名 .... FROM 表名
使用空格為字段定義別名
語(yǔ)法
select 字段名1 別名,字段名2 別名 ... FROM 表名
條件查詢
使用where子句限制查詢結(jié)果
全表查詢雖然能夠?qū)⑺械臄?shù)據(jù)查詢出來,但是這樣操作也有一定的弊端,如果表的數(shù)據(jù)量非常大,則會(huì)消耗掉大量的內(nèi)存和系統(tǒng)資源,而且一般的全表查詢結(jié)果,對(duì)于用戶來說作用不是很大,有時(shí)候只需要查看某些閑著條件內(nèi)的數(shù)據(jù),因此需要按照條件進(jìn)行數(shù)據(jù)的查詢。
單條件查詢
單條件查詢是指在where語(yǔ)句后面只有一個(gè)條件,
例如,要查詢年齡在21歲以上的學(xué)生信息
select id,StudentName,Age from StudentInfo where Age >21;
多條件符合查詢
有時(shí)候條件可能不僅僅是一條,可能是多個(gè)條件的組合。在這種情況下就需要使用到上一張中的邏輯運(yùn)算符來組合多個(gè)條件,邏輯運(yùn)算符有:“NOT” 、“AND”、“OR”。
示例:
select id,StudentName,Age,Gender from StudentInfo where Age =20 AND Gender='女';
使用Distinct 消除重復(fù)行
在查詢某列數(shù)據(jù)的時(shí)候,可能返回的結(jié)果中存在重復(fù)的值,而用戶對(duì)于重復(fù)的值可能只需要知道一個(gè)即可。
例如要查詢學(xué)生表中登記的學(xué)生都有那些班級(jí)的,只需要知道這些班級(jí)編號(hào)即可。因?yàn)橐粋€(gè)辦理一定存在多名同學(xué),所以使用之前的查詢方式,返回的班級(jí)編號(hào)結(jié)果一定有很多重重復(fù)的行,這些重復(fù)的行值只需要消除成1個(gè),select 語(yǔ)句中的 Distinct關(guān)鍵字就是用來解決這個(gè)問題的
示例:
select DISTINCT classID FROM studentinfo
使用LIMIT限定查詢返回行
當(dāng)表中的數(shù)據(jù)量比較多的時(shí)候,用戶只需要看到前面的幾行就能達(dá)到查詢的目的,這時(shí)用LIMIT 關(guān)鍵字可以限制返回的查詢結(jié)構(gòu)的行數(shù).LIMIT限定查詢一般和數(shù)據(jù)查詢排序結(jié)合使用,對(duì)比排序后的數(shù)據(jù)取前面一定量的結(jié)果。
語(yǔ)法
LIMIT[位置偏移量] 行數(shù)
位置偏移量: 用于只是MYSQL從哪一行開始顯示,是一個(gè)可選參數(shù),如果不指定該參數(shù),將會(huì)從結(jié)果集的第一條記錄開始(從零開始計(jì)數(shù));
行數(shù):只是返回的記錄條數(shù)
例如:現(xiàn)在我們要顯示studentInfo表的前四條記錄,命令如下:
select id,studentName,Gender,Age from studentInfo LIMIT 4;
注意:
LIMIT 語(yǔ)句時(shí)MYSQL 特有的功能。Oracle 、SQL Server 限定查詢返回行使用的時(shí)其他語(yǔ)句。
處理Null值
MySQL中經(jīng)常有些字段值為Null。Null是一種 比較特殊的情況,如果直接通過sql語(yǔ)句查詢Null是查詢不到的結(jié)果都是0條,用字段名=Null和字段名 !=Null 判斷結(jié)果是錯(cuò)誤的。
所以MySQL提供了一個(gè)專門針對(duì)Null查詢的關(guān)鍵字就是 isNull 和 is not Null.
使用Order by 進(jìn)行查詢排序
表中數(shù)據(jù)是按照添加的物理順序存放的,但是在查詢的時(shí)候,我們會(huì)需要按照某個(gè)規(guī)則來對(duì)結(jié)果進(jìn)行順序的排序然后在顯示,這是就需要用到Select命令中的排列子句來幫忙實(shí)現(xiàn)了。
單列排序
單列排序是指按照表中的某一列進(jìn)行排序,即ORDER BY 子句后面只有一個(gè)列名。比如我們向根據(jù)學(xué)生的年齡從小往大或從大往小 來排列查詢的結(jié)果。
示例:
select id,studentName,Gender,Age from studentInfo ORDER BY Age ASC -- 升序的方式進(jìn)行查詢
select id,studentName,Gender,Age from studentInfo ORDER BY Age DESC -- 降序的方式進(jìn)行查詢
注意:
(1) :在數(shù)據(jù)庫(kù)中默認(rèn)是以升序進(jìn)行排序的,所以ASC可以略去不寫
(2) :在數(shù)據(jù)中,Null值比所有的值都要小
多列排序
多列排序時(shí),order by 子句后面跟多個(gè)字段,字段之間用逗號(hào)隔開,每個(gè)字段后面都可以跟ASC或DESC 。多列偶愛徐的基本運(yùn)算過程時(shí):數(shù)據(jù)庫(kù)引擎會(huì)按照第一個(gè)字段以及升、降序規(guī)則排序查詢結(jié)果,如果查詢結(jié)果里在這個(gè)字段上有重復(fù)值,則對(duì)這些存在重復(fù)的數(shù)據(jù)行按照第二個(gè)排列字段及其升、降序規(guī)則進(jìn)行排序,以此類推
案例
select id,studentName,Gender,Age from studentInfo ORDER BY Age DESC,Gender ASC