在MySQL中創(chuàng )建數據庫的目的是為了使用其中的數據。
使用select查詢(xún)語(yǔ)句可以從數據庫中把數據查詢(xún)出來(lái)。
select語(yǔ)句的語(yǔ)法格式如下:
select selection_list // 要查詢(xún)的內容,選擇哪些列from table_list // 從什么表中查詢(xún),從何處選擇行where primary_constraint // 查詢(xún)時(shí)需要滿(mǎn)足的條件,行必須滿(mǎn)足的條件group by grouping_columns // 如何對結果進(jìn)行分組order by sorting_columns // 如何對結果進(jìn)行排序having secondary_constraint // 查詢(xún)時(shí)滿(mǎn)足的第二條件limit count // 限定輸出的查詢(xún)結果
下面對select查詢(xún)語(yǔ)句的參數進(jìn)行詳細的講解。
首先,連接MySQL服務(wù)器,其次,選擇指定的數據庫:
use db_xuesheng;
要確保該數據庫已經(jīng)建立。
還要確保已經(jīng)建立了數據表tb_chengji,并且已經(jīng)添加了數據,然后才能更好地理解下面的內容。
設置查詢(xún)的內容。
1)如果要查詢(xún)一個(gè)表中的所有列,可以將其設置為“*”。
比如,查詢(xún)tb_chengji數據表中的所有列。代碼如下:
select * from tb_chengji; // 查詢(xún)數據表中的所有數據

2)如果只查詢(xún)一個(gè)表中的某一列或多列,可以直接輸入列名,并以“,”分隔。代碼如下:
select xuesheng,yuwen from tb_chengji; // 查詢(xún)數據表中xuesheng和yuwen列的數據

指定查詢(xún)的數據表。
既可以從一個(gè)數據表中查詢(xún),也可以從多個(gè)數據表中進(jìn)行查詢(xún),多個(gè)數據表之間用“,”進(jìn)行分隔,并且可以通過(guò)where子句使用連接運算來(lái)確定表之間的聯(lián)系。
多表查詢(xún)的sql語(yǔ)句格式如下:
select 表名.字段名 from 表1,表2... where 表1.字段=表2.字段 and 其它查詢(xún)條件
例如,首先查看一下tb_chengji數據表中的數據記錄。在上圖有顯示效果。
然后查看一下tb_info數據表中的數據記錄。代碼如下:
select * from tb_info;

下面從tb_chengji和tb_info數據表中查詢(xún)yuwen大于等于100的數據記錄。代碼如下:
select tb_chengji.id,tb_chengji.xuesheng,xingbie,dizhi,yuwen,shuxue,yingyu fromtb_chengji,tb_info where tb_chengji.xuesheng=tb_info.xuesheng and tb_chengji.yuwen>=100;

在上面的SQL語(yǔ)句中,因為2個(gè)表都有id字段和xuesheng字段,為了告訴服務(wù)器要顯示的是哪個(gè)表中的字段信息,所以要加上前綴。語(yǔ)法格式如下:
表名.字段名
tb_chengji.xuesheng=tb_info.xuesheng將表tb_chengji和tb_info連接起來(lái),叫做等同連接。如果不使用tb_chengji.xuesheng=tb_info.xuesheng,那么產(chǎn)生的結果將是兩個(gè)表的笛卡爾積,叫做全連接。
在使用查詢(xún)語(yǔ)句時(shí),比如要從很多的記錄中查詢(xún)出想要的記錄,就需要一個(gè)查詢(xún)的條件。只有設定了查詢(xún)的條件,查詢(xún)才有實(shí)際的意義。
設定查詢(xún)條件應用的是where子句。
通過(guò)where子句,可以實(shí)現很多復雜的條件查詢(xún)。在使用where子句時(shí),需要使用一些比較運算符。常用的比較運算符如下表所示:
| 運算符 | 名稱(chēng) | 示例 |
|---|---|---|
| = | 等于 | id=10 |
| > | 大于 | id>10 |
| < | 小于 | id<10 |
| >= | 大于等于 | id>=10 |
| <= | 小于等于 | id<=10 |
| !=或<> | 不等于 | id!=10 |
| is null | n/a | id is null |
| is not null | n/a | id is not null |
| between | n/a | id between 1 and 15 |
| in | n/a | id in(3,4,5) |
| not in | n/a | xuesheng not in(shi,li) |
| like | 模式匹配 | xuesheng like('shi%') |
| not like | 模式匹配 | xuesheng not like('shi%') |
| regexp | 常規表達式 | xuesheng正則表達式 |
上表中列舉的是where子句常用的比較運算符。示例中的id是記錄的編號,xuesheng是表中的學(xué)生名。
例如,使用where子句,查詢(xún)tb_chengji表,條件是xuesheng為李麗的數據記錄。代碼如下:
select * from tb_chengji where xuesheng='李麗';

提示:where子句的作用是在對查詢(xún)結果進(jìn)行分組前,將不符合where條件的行去掉,即在分組之前過(guò)濾數據。因此,在使用where子句時(shí),條件中不能包含聚合函數來(lái)顯示特定的行。
通過(guò)GROUP BY子句,可以將行數據劃分成較小的組,以實(shí)現對記錄進(jìn)行分組查詢(xún)。在與AVG()函數或SUM()函數等聚合函數一起使用時(shí),GROUP BY子句能夠發(fā)揮最大的作用。
GROUP BY子句可以將查詢(xún)結果分組,并返回行的匯總信息。
在帶有GROUP BY子句的查詢(xún)語(yǔ)句中,在SELECT列表中指定的列要么是GROUP BY子句中指定的列,要么就包含在了聚合函數中。
查詢(xún)語(yǔ)句的SELECT和GROUP BY、HAVING子句是聚合函數唯一出現的地方,因此,在where子句中不能使用聚合函數。
例如,在tb_chengji02數據表中。如下圖所示:

就可以使用GROUP BY子句,按照xuesheng進(jìn)行分組,求出每個(gè)學(xué)生的平均成績(jì)。代碼如下:
select xuesheng,avg(fenshu) from tb_chengji02 group by xuesheng;
group by xuesheng是按學(xué)生分組,那么在xuesheng列中,相同名字的學(xué)生就會(huì )分為一組,然后計算出它們的平均成績(jì)。

HAVING子句的作用是篩選滿(mǎn)足條件的組,即在分組之后過(guò)濾數據。在HAVING子句中經(jīng)常包含聚合函數??梢允褂肏AVING條件顯示特定的組,也可以使用多個(gè)分組標準進(jìn)行分組。
當在GROUP BY子句中使用HAVING子句時(shí),查詢(xún)結果中只返回滿(mǎn)足having條件的組。
例如,在tb_chengji02表中查詢(xún)總成績(jì)大于等于280的記錄。代碼如下:
select xuesheng,sum(fenshu) from tb_chengji02 group by xuesheng having sum(fenshu)>=280;

我們也可以在tb_chengji02表中查詢(xún)張冬雪或者李麗的總成績(jì)大于等于270的記錄是否存在,如果存在,則顯示出來(lái)。代碼如下:
select xuesheng,sum(fenshu) from tb_chengji02 where xuesheng='張冬雪' or xuesheng='李麗' group by xuesheng having sum(fenshu)>=270;

使用DISTINCT關(guān)鍵字,可以去除結果中重復的行。
DISTINCT語(yǔ)句中SELECT顯示的字段只能是DISTINCT指定的字段,其他字段是不能出現的。
例如,查詢(xún)tb_chengji02表,并在結果中去掉xuesheng字段中的重復數據。代碼如下:
select distinct xuesheng from tb_chengji02;

使用ORDER BY可以對查詢(xún)的結果進(jìn)行升序(ASC)或降序(DESC)排列,在默認情況下,ORDER BY按升序輸出結果。如果要按降序排列可以使用DESC來(lái)實(shí)現。
在對含有null值的列進(jìn)行排序時(shí),如果按升序排列,null值將出現在最前面;如果按降序排列,null值將出現在最后面。
例如,查詢(xún)tb_chengji表中的所有信息,按照“id”進(jìn)行降序排列。代碼如下:
select * from tb_chengji order by id desc;

LIKE屬于比較常用的比較運算符,通過(guò)它可以實(shí)現模糊查詢(xún)。它有兩種通配符:“%”和下劃線(xiàn)“_”。
“%”可以匹配一個(gè)或多個(gè)字符,而“_”只能匹配一個(gè)字符。
例如,在tb_chengji表中查找所有第二個(gè)字符是“冬”的學(xué)生。代碼如下:
select * from tb_chengji where xuesheng like('_冬%');
使用CONCAT函數可以聯(lián)合多個(gè)字段,構成一個(gè)總的字符串。
例如,把tb_chengji表中的yuwen、shuxue和yingyu字段合并到一起,構成一個(gè)新的字符串。代碼如下:
select id,xuesheng,concat(yuwen,":",shuxue,":",yingyu) as fenshu from tb_chengji;

LIMIT子句可以對查詢(xún)結果的記錄條數進(jìn)行限定,控制它輸出的行數。
例如,查詢(xún)tb_chengji表,按照id字段降序排列,顯示3條記錄。代碼如下:
select * from tb_chengji order by id desc limit 3;

使用LIMIT還可以從查詢(xún)結果的中間部分取值。首先要定義兩個(gè)參數,參數1是開(kāi)始讀取的第一條記錄的編號(在查詢(xún)結果中,第一個(gè)結果的記錄編號是0,而不是1),參數2是要查詢(xún)記錄的個(gè)數。
select * from tb_chengji order by id desc limit 1,2;

在MySQL中,還可以使用表達式來(lái)計算各列的值,作為輸出結果。表達式還可以包含一些函數。
例如,計算tb_chengji表中學(xué)生的總分數。代碼如下:
select id,xuesheng,yuwen,shuxue,yingyu,sum(yuwen+shuxue+yingyu) as zongfen from tb_chengji group by id;
或者:
select *,sum(yuwen+shuxue+yingyu) as zongfen from tb_chengji group by id;

計算tb_chengji表中學(xué)生的三門(mén)平均分數。代碼如下:
select *,format(avg(yuwen+shuxue+yingyu)/3),1) as pingjun feng from tb_chengji group by id;

在對MySQL數據庫進(jìn)行操作時(shí),有時(shí)候需要對數據庫中的記錄進(jìn)行統計,例如求平均值、最小值或最大值等,這時(shí)可以使用MySQL中的統計函數。
常用的統計函數如下表所示:
| 名稱(chēng) | 說(shuō)明 |
|---|---|
| avg(字段名) | 獲取指定列的平均值。 |
| count(字段名) | 如果指定了一個(gè)字段,則會(huì )統計出該字段中的非空記錄。如果在前面增加DISTINCT,則會(huì )統計不同值的記錄,相同的值當做一條記錄。如果使用count(*),則統計包含空值的所有記錄數。 |
| min(字段名) | 獲取指定字段的最小值。 |
| max(字段名) | 獲取指定字段的最大值。 |
| std(字段名) | 指定字段的標準背離值。 |
| stdtev(字段名) | 與std相同。 |
| sum(字段名) | 指定字段所有記錄的總和。 |
除了使用函數之外,還可以使用算術(shù)運算符、字符串運算符以及邏輯運算符來(lái)構成表達式。
例如,計算數學(xué)成績(jì)打八折之后的分數。代碼如下:
select *,(shuxue * 0.8) as '80%' from tb_chengji;
聯(lián)系客服