?數(shù)據(jù)檢索
?? 數(shù)據(jù)檢索是指從數(shù)據(jù)庫中按照預(yù)定條件查詢數(shù)據(jù),及引用相關(guān)數(shù)據(jù)進(jìn)行計(jì)算而獲取所需信息的過程。
?? 查詢數(shù)據(jù)是數(shù)據(jù)庫操作中最常用、最重要的操作。MySQL是通過select語句查詢實(shí)現(xiàn)數(shù)據(jù)檢索的。
基本查詢語句
select
select語句是SQL語言從數(shù)據(jù)庫中獲取信息的一個(gè)基本語句。該語句可以實(shí)現(xiàn)從一個(gè)或多個(gè)數(shù)據(jù)庫中的一個(gè)或多個(gè)表中查詢信息,并將結(jié)果顯示為另外一個(gè)二維表的形式,稱之為結(jié)果集(result set)。
select語句的基本的語法格式可歸納如下:
select ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? select 列名1,列名2,…列名n
[ all | distinct ] selection list ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? [ into 新表名 ]
from? table source ? [where search condition] ? ? ? ? ? ? ? ? ? ? ? ? ? ? [ from 表名1,表名2,…,表名n ]
[ group by grouping columns ] [with rollup ] ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? [ group by 列名1,列名2,…列名n ]
[having search condition] ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?[ having 條件表達(dá)式 ]
[order by order expression[ asc | desc ] ] ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? [ order by 列名1 [ asc | desc ] , 列名2 [ asc | desc ],…列 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 名n [ asc | desc ] ]
[limit count] ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?[ where 條件表達(dá)式 ]
select 子句用于指定輸出字段
into 子句用于將查詢到的結(jié)果集形成一個(gè)新表
from 子句用于指定顯示的列來源于哪些表或視圖
group by 子句用于指定列值相同的記錄作為一組
having 子句用于指定對組的過濾條件。
order by 子句用于將查詢到的結(jié)果集按指定列排序,asc 升序 desc 降序
where 子句用于指定對記錄的過濾條件
使用order by子句對結(jié)果集排序:
使用order?by?子句可以對查詢的結(jié)果進(jìn)行升序(asc)或降序(desc)排列排序可以依照某個(gè)列的值,若列值相等則根據(jù)第2個(gè)屬性的值,以此類推。利用order?by子句進(jìn)行排序,需要注意如下事項(xiàng)和原則:
默認(rèn)情況下,結(jié)果集按照升序排列。也可以在輸出項(xiàng)的后面加上關(guān)鍵字desc來實(shí)現(xiàn)降序輸出。對含有null值的列進(jìn)行排序時(shí),如果是按升序排列,null值將出現(xiàn)在最前面,如果是按降序排列,null值將出現(xiàn)在最后。
order?by子句包含的列并不一定出現(xiàn)在選擇列表中。
order?by子句可以通過指定列名、函數(shù)值和表達(dá)式的值進(jìn)行排序。
order?by子句不可以使用text、blob、longtext和mediumblob等類型的列。
在order?by子句中可以同時(shí)指定多個(gè)排序項(xiàng)。
group by 子句:
group?by子句可以將查詢結(jié)果按屬性列或?qū)傩粤薪M合在行的方向上進(jìn)行分組,每組在屬性列或?qū)傩粤薪M合上具有相同的聚合值。如果聚合函數(shù)沒有使用group?by子句,則只為select語句報(bào)告一個(gè)聚合值。將一列或多列定義成為一組,使組內(nèi)所有的行在那些列中的數(shù)值相同。出現(xiàn)在查詢的select列表中的每一列都必須同時(shí)出現(xiàn)在group?by?子句中。
使用?group?by?關(guān)鍵字來分組:單獨(dú)使用group?by關(guān)鍵字,查詢結(jié)果只顯示每組的一條記錄。
用is null?關(guān)鍵字查詢空值:
在where 子句中,如何處理null的值的比較呢?為了取得列中含有null的行,MySQL語句包含了操作待功能is?[not]?null。說明:
一個(gè)字段值是空值或者不是空值,要表示為“is?null”或“is?not?null”;不能表示為“=null”或“?>null”。
如果寫成“字段=null”或“字段<>null”,系統(tǒng)的運(yùn)行結(jié)果都直接處理為null值,按照?false處理而不報(bào)錯(cuò)。
注意:
(1)使用select語句查詢一個(gè)數(shù)據(jù)表。使用select語句時(shí),首先要確定所要查詢的列?!?”代表所有的列。
例:查詢teaching數(shù)據(jù)庫course表中的所有數(shù)據(jù)。
use teaching;
select * from? course;
(2)查詢表中的指定列。針對表中的多列進(jìn)行查詢,只要在select后面指定要查詢的列名即可,多列之間用“,”分隔。
例:查詢student表中的studentno、sname和phone數(shù)據(jù)。
select studentno,sname,phone from student;
(3)可以從一個(gè)或多個(gè)表中獲取數(shù)據(jù)。使用select語句進(jìn)行查詢,需要確定所要查詢的數(shù)據(jù)在哪個(gè)表中,或在哪些表中,在對多個(gè)表進(jìn)行查詢時(shí),同樣使用“,”對多個(gè)表進(jìn)行分隔。進(jìn)行多表查詢,主要采用多表連接或子查詢的方式,也可以通過where子句中使用連接運(yùn)算來確定表之間的聯(lián)系,然后根據(jù)這個(gè)條件返回查詢結(jié)果。
單表查詢
? (1) select……from基本子句的使用
Select子句的主要功能是輸出字段或表達(dá)式的值,form子句的主要功能是指定數(shù)據(jù)源。這兩個(gè)子句在進(jìn)行數(shù)據(jù)庫表查詢時(shí),都是必選項(xiàng)。
A.為字段取別名:利用select語句查詢數(shù)據(jù)時(shí),輸出項(xiàng)一般顯示創(chuàng)建表時(shí)定義的字段名。MySQL可以為查詢顯示的每個(gè)輸出字段或表達(dá)式取一個(gè)別名,以增加結(jié)果集的可讀性。例如,可以用as關(guān)鍵字給字段取一個(gè)中文名。實(shí)現(xiàn)給select子句中的各項(xiàng)取別名其語法格式為:select 項(xiàng)的原名?as? 別名?
例:在student表中查詢出生日期在2001年以后的學(xué)生的學(xué)號、姓名、電話和年齡。(可以通過as為列或表達(dá)式更改名稱,增加可讀性。)
select? studentno as '學(xué)號',sname as '姓名',
phone as '手機(jī)號',year(now())-year(birthdate) as? '年齡'
from? student
where?? year(birthdate)>2001;
B.使用謂詞過濾記錄:如果希望一個(gè)列表沒有重復(fù)值,可以利用distinct子句從結(jié)果集中除去重復(fù)的行。當(dāng)使用distinct子句時(shí),需要注意以下事項(xiàng):
a.選擇列表的行集中,所有值的組合決定行的唯一性。
b.數(shù)據(jù)檢索包含任何唯一值組合的行,如果不指定distinct子句則將所有行返回到結(jié)果集中。
例: 在score表中查詢期末成績中有高于95的學(xué)生的學(xué)號和課程號,并按照學(xué)號排序。(不管學(xué)生有幾門課的成績高于95,只要有一門就可以顯示,利用distinct子句可將重復(fù)行消除。)
select? distinct studentno,courseno
from?? score
where final>95
order? by studentno;
聚合函數(shù)查詢
MySQL的常用聚合函數(shù)包括count()、sum()、avg()、max()和?min()等。其中,count()用來統(tǒng)計(jì)記錄的條數(shù);sum()用來計(jì)算字段的值的總和;avg()用來計(jì)算字段的值的平均值;max()用來查詢字段的最大值;min()用來查詢字段的最小值。利用聚合函數(shù)可以滿足表中記錄的聚合運(yùn)算。
count()函數(shù):count()函數(shù)對于除“*”以外的任何參數(shù),返回所選擇聚合中非null值的行的數(shù)目;對于參數(shù)“×”,返回選擇聚合所有行的數(shù)目,包含null值的行。沒有?where?子句count()是經(jīng)過內(nèi)部優(yōu)化的,能夠快速地返回表中所有的記錄總數(shù)。
sum()函數(shù)和avg()函數(shù):sum()函數(shù)可以求出表中某個(gè)字段取值的總和。avg()函數(shù)可以求出表中某個(gè)字段取值的平均值。
max()函數(shù)和min()函數(shù):max()函數(shù)可以求出表中某個(gè)字段取值的最大值,min()函數(shù)可以求出表中某個(gè)字段取值的最小值。