国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > 綜合 > 正文

查詢數(shù)據(jù)表中的記錄(SELECT)

2024-07-21 02:44:40
字體:
供稿:網(wǎng)友

摘要:SELECT 語句可以幫助我們從MySQL中取出數(shù)據(jù)。SELECT 大概是 SQL 語言中最常用的語句,而且怎樣使用它也最為講究;用它來選擇記錄可能相當(dāng)復(fù)雜,可能會涉及許多表中列之間的比較。本節(jié)介紹Select語句關(guān)于查詢的最基本功能。

除非最終檢索它們并利用它們來做點(diǎn)事情,否則將記錄放入數(shù)據(jù)庫沒什么好處。這就是 SELECT 語句的用途,即幫助取出數(shù)據(jù)。SELECT 大概是 SQL 語言中最常用的語句,而且怎樣使用它也最為講究;用它來選擇記錄可能相當(dāng)復(fù)雜,可能會涉及許多表中列之間的比較。本節(jié)介紹Select語句關(guān)于查詢的最基本功能。

SELECT 語句的語法如下:

SELECT selection_list 選擇哪些列

FROM table_list 從何處選擇行

WHERE PRimary_constraint 行必須滿足什么條件

GROUP BY grouping_columns 怎樣對結(jié)果分組

HAVING secondary_constraint 行必須滿足的第二條件

ORDER BY sorting_columns 怎樣對結(jié)果排序

LIMIT count 結(jié)果限定

注意:所有使用的關(guān)鍵詞必須精確地以上面的順序給出。例如,一個(gè)HAVING子句必須跟在GROUP BY子句之后和ORDER BY子句之前。

除了詞“SELECT”和說明希望檢索什么的 column_list 部分外,語法中的每樣?xùn)|西都是可選的。有的數(shù)據(jù)庫還需要 FROM 子句。MySQL 有所不同,它允許對表達(dá)式求值而不引用任何表。

普通查詢

SELECT最簡單的形式是從一張表中檢索每樣?xùn)|西:

mysql> SELECT * FROM pet;

其結(jié)果為:

+----------+--------+---------+------+------------+------------+

| name     | owner  | species | sex  | birth      | death      |

+----------+--------+---------+------+------------+------------+

| Fluffy   | Harold | cat     | f    | 1993-02-04 | NULL       |

| Claws    | Gwen   | cat     | m    | 1994-03-17 | NULL       |

| Buffy    | Harold | dog     | f    | 1989-05-13 | NULL       |

| Chirpy   | Gwen   | bird    | f    | 1998-09-11 | NULL       |

| Fang     | Benny  | dog     | m    | 1990-08-27 | NULL       |

| Bowser   | Diane  | dog     | m    | 1990-08-31 | 1995-07-29 |

| Whistler | Gwen   | bird    | NULL | 1997-12-09 | NULL       |

| Slim     | Benny  | snake   | m    | 1996-04-29 | NULL       |

| Puffball | Diane  | hamster | f    | 1999-03-30 | NULL       |

+----------+--------+---------+------+------------+------------+

查詢特定行:

你能從你的表中只選擇特定的行。例如,如果你想要驗(yàn)證你對Bowser的出生日期所做的改變,像這樣精選Bowser的記錄:

mysql> SELECT * FROM pet WHERE name = "Bowser";

其結(jié)果為:

+--------+-------+---------+------+------------+------------+

| name   | owner | species | sex  | birth      | death      |

+--------+-------+---------+------+------------+------------+

| Bowser | Diane | dog     | m    | 1990-08-31 | 1995-07-29 |

+--------+-------+---------+------+------------+------------+

你可以對照前一個(gè)例子來驗(yàn)證。

查詢特定列

如果你不想要看到你的表的整個(gè)行,就命名你感興趣的列,用逗號分開。例如,如果你想要知道你的動物什么時(shí)候出生的,精選name和birth列:

mysql> SELECT name, birth FROM pet where owner="Gwen";

其結(jié)果為:

+----------+------------+

| name     | birth      |

+----------+------------+

| Claws    | 1994-03-17 |

| Chirpy   | 1998-09-11 |

| Whistler | 1997-12-09 |

+----------+------------+

進(jìn)行表達(dá)式計(jì)算

前面的多數(shù)查詢通過從表中檢索值已經(jīng)產(chǎn)生了輸出結(jié)果。MySQL 還允許作為一個(gè)公式的結(jié)果來計(jì)算輸出列的值。表達(dá)式可以簡單也可以復(fù)雜。下面的查詢求一個(gè)簡單表達(dá)式的值(常量)以及一個(gè)涉及幾個(gè)算術(shù)運(yùn)算符和兩個(gè)函數(shù)調(diào)用的較復(fù)雜的表達(dá)式的值。例如,計(jì)算Browser生活的天數(shù):

mysql> SELECT death-birth FROM pet WHERE name="Bowser";

其結(jié)果是:

+-------------+

| death-birth |

+-------------+

|       49898 |

+-------------+

由于MySQL允許對表達(dá)式求值而不引用任何表。所以也可以這樣使用:

mysql>select (2+3*4.5)/2.5;

其結(jié)果為:

+---------------+

| (2+3*4.5)/2.5 |

+---------------+

|         6.200 |

+---------------+

 


條件查詢

不必每次查詢都返回所有的行記錄,你能從你的表中只選擇特定的行。為此你需要使用WHERE或者HAVING從句。HAVING從句與WHERE從句的區(qū)別是,HAVING表達(dá)的是第二條件,在與其他從句配合使用,顯然不能在WHERE子句中的項(xiàng)目使用HAVING。因此本小節(jié)緊介紹WHERE從句的使用,HAVING從句的使用方法類似。另外WHERE從句也可以實(shí)現(xiàn)HAVING從句的絕大部分功能。

為了限制 SELECT 語句檢索出來的記錄集,可使用 WHERE 子句,它給出選擇行的條件。可通過查找滿足各種條件的列值來選擇行。

WHERE 子句中的表達(dá)式可使用表1 中的算術(shù)運(yùn)算符、表2 的比較運(yùn)算符和表3 的邏輯運(yùn)算符。還可以使用圓括號將一個(gè)表達(dá)式分成幾個(gè)部分。可使用常量、表列和函數(shù)來完成運(yùn)算。在本教程的查詢中,我們有時(shí)使用幾個(gè) MySQL 函數(shù),但是 MySQL 的函數(shù)遠(yuǎn)不止這里給出的這些。請參閱附錄 一,那里給出了所有MySQL 函數(shù)的清單。

表1   算術(shù)運(yùn)算符


運(yùn)算符
 說明
 運(yùn)算符
 說明
 
+

-
 加


 *

/
 乘


 

 

表2   比較運(yùn)算符


運(yùn)算符
 說明
 運(yùn)算符
 說明
 
<
<=
=
 小于
小于或等于
等于
 != 或 <>
>=
>
 不等于
大于或等于
大于
 


表3  邏輯運(yùn)算符


運(yùn)算符
 說明
 
NOT或 !
OR 或 ||
AND或 &&
 邏輯非
邏輯或
邏輯與

 


例如,如果你想要驗(yàn)證你對Bowser的出生日期所做的改變,像這樣精選Bowser的記錄:

mysql> SELECT * FROM pet WHERE name = "Bowser";

+--------+-------+---------+------+------------+------------+

| name   | owner | species | sex  | birth      | death      |

+--------+-------+---------+------+------------+------------+

| Bowser | Diane | dog     | m    | 1990-08-31 | 1995-07-29 |

+--------+-------+---------+------+------------+------------+

輸出證實(shí)出生年份現(xiàn)在正確記錄為1990,而不是1909。

字符串比較通常是大小些無關(guān)的,因此你可以指定名字為"bowser"、"BOWSER"等等,查詢結(jié)果將是相同的。

你能在任何列上指定條件,不只是name。例如,如果你想要知道哪個(gè)動物在1998以后出生的,測試birth列:

mysql> SELECT * FROM pet WHERE birth >= "1998-1-1";

+----------+-------+---------+------+------------+-------+

| name     | owner | species | sex  | birth      | death |

+----------+-------+---------+------+------------+-------+

| Chirpy   | Gwen  | bird    | f    | 1998-09-11 | NULL  |

| Puffball | Diane | hamster | f    | 1999-03-30 | NULL  |

+----------+-------+---------+------+------------+-------+

你能組合條件,例如,找出雌性的狗:

mysql> SELECT * FROM pet WHERE species = "dog" AND sex = "f";

+-------+--------+---------+------+------------+-------+

| name  | owner  | species | sex  | birth      | death |

+-------+--------+---------+------+------------+-------+

| Buffy | Harold | dog     | f    | 1989-05-13 | NULL  |

+-------+--------+---------+------+------------+-------+

上面的查詢使用AND邏輯操作符,也有一個(gè)OR操作符:

mysql> SELECT * FROM pet WHERE species = "snake" OR species = "bird";

+----------+-------+---------+------+------------+-------+

| name     | owner | species | sex  | birth      | death |

+----------+-------+---------+------+------------+-------+

| Chirpy   | Gwen  | bird    | f    | 1998-09-11 | NULL  |

| Whistler | Gwen  | bird    | NULL | 1997-12-09 | NULL  |

| Slim     | Benny | snake   | m    | 1996-04-29 | NULL  |

+----------+-------+---------+------+------------+-------+

AND和OR可以混用。如果你這樣做,使用括號指明條件應(yīng)該如何被分組是一個(gè)好主意:

mysql> SELECT * FROM pet WHERE (species = "cat" AND sex = "m")

-> OR (species = "dog" AND sex = "f");

+-------+--------+---------+------+------------+-------+

| name  | owner  | species | sex  | birth      | death |

+-------+--------+---------+------+------------+-------+

| Claws | Gwen   | cat     | m    | 1994-03-17 | NULL  |

| Buffy | Harold | dog     | f    | 1989-05-13 | NULL  |

+-------+--------+---------+------+------------+-------+

查詢排序

使用ORDER BY子句對查詢返回的結(jié)果按一列或多列排序。ORDER BY子句的語法格式為:

ORDER BY column_name [ASC|DESC] [,…]

其中ASC表示升序,為默認(rèn)值,DESC為降序。ORDER BY不能按text、text和image數(shù)據(jù)類型進(jìn)行排 序。另外,可以根據(jù)表達(dá)式進(jìn)行排序。

例如,這里是動物生日,按日期排序:

mysql> SELECT name, birth FROM pet ORDER BY birth;

+----------+------------+

| name     | birth      |

+----------+------------+

| Buffy    | 1989-05-13 |

| Fang     | 1990-08-27 |

| Bowser   | 1990-08-31 |

| Fluffy   | 1993-02-04 |

| Claws    | 1994-03-17 |

| Slim     | 1996-04-29 |

| Whistler | 1997-12-09 |

| Chirpy   | 1998-09-11 |

| Puffball | 1999-03-30 |

+----------+------------+

為了以逆序排序,增加DESC(下降 )關(guān)鍵字到你正在排序的列名上:

mysql> SELECT name, birth FROM pet ORDER BY birth DESC;

+----------+------------+

| name     | birth      |

+----------+------------+

| Puffball | 1999-03-30 |

| Chirpy   | 1998-09-11 |

| Whistler | 1997-12-09 |

| Slim     | 1996-04-29 |

| Claws    | 1994-03-17 |

| Fluffy   | 1993-02-04 |

| Bowser   | 1990-08-31 |

| Fang     | 1990-08-27 |

| Buffy    | 1989-05-13 |

+----------+------------+

你能在多個(gè)列上排序。例如,按動物的種類排序,然后按生日,首先是動物種類中最年輕的動物,使用下列查詢:

mysql> SELECT name, species, birth FROM pet ORDER BY species, birth DESC;

+----------+---------+------------+

| name     | species | birth      |

+----------+---------+------------+

| Chirpy   | bird    | 1998-09-11 |

| Whistler | bird    | 1997-12-09 |

| Claws    | cat     | 1994-03-17 |

| Fluffy   | cat     | 1993-02-04 |

| Bowser   | dog     | 1990-08-31 |

| Fang     | dog     | 1990-08-27 |

| Buffy    | dog     | 1989-05-13 |

| Puffball | hamster | 1999-03-30 |

| Slim     | snake   | 1996-04-29 |

+----------+---------+------------+

注意DESC關(guān)鍵詞僅適用于緊跟在它之前的列名字(birth);species值仍然以升序被排序。注意,輸出首先按照species排序,然后具有相同species的寵物再按照birth降序排列。

查詢分組與行計(jì)數(shù)

GROUP BY 從句根據(jù)所給的列名返回分組的查詢結(jié)果,可用于查詢具有相同值的列。其語法為:

GROUP BY col_name,….

你可以為多個(gè)列分組。

例如:

mysql>SELECT * FROM pet GROUP BY species;


+----------+--------+---------+------+------------+-------+

| name     | owner  | species | sex  | birth      | death |

+----------+--------+---------+------+------------+-------+

| Chirpy   | Gwen   | bird    | f    | 1998-09-11 | NULL  |

| Fluffy   | Harold | cat     | f    | 1993-02-04 | NULL  |

| Buffy    | Harold | dog     | f    | 1989-05-13 | NULL  |

| Puffball | Diane  | hamster | f    | 1999-03-30 | NULL  |

| Slim     | Benny  | snake   | m    | 1996-04-29 | NULL  |

+----------+--------+---------+------+------------+-------+

由以上結(jié)果可以看出:

查詢顯示結(jié)果時(shí),被分組的列如果有重復(fù)的值,只返回靠前的記錄,并且返回的記錄集是排序的。這并不是一個(gè)很好的結(jié)果。僅僅使用GROUP BY從句并沒有什么意義,該從句的真正作用在于與各種組合函數(shù)配合,用于行計(jì)數(shù)。

1、COUNT()函數(shù)計(jì)數(shù)非NULL結(jié)果的數(shù)目。

你可以這樣計(jì)算表中記錄行的數(shù)目:

mysql> select count(*) from pet;

+----------+

| count(*) |

+----------+

|        9 |

+----------+

計(jì)算sex為非空的記錄數(shù)目:

mysql> select count(sex) from pet;

+------------+

| count(sex) |

+------------+

|          8 |

+------------+

現(xiàn)在配合GROUP BY 從句使用。

例如:要知道每個(gè)主人有多少寵物

mysql> SELECT owner, COUNT(*) FROM pet GROUP BY owner;

+--------+----------+

| owner  | COUNT(*) |

+--------+----------+

| Benny  |        2 |

| Diane  |        2 |

| Gwen   |        3 |

| Harold |        2 |

+--------+----------+

又如,每種寵物的個(gè)數(shù):

mysql> SELECT species,count(*) FROM pet GROUP BY species;

+---------+----------+

| species | count(*) |

+---------+----------+

| bird    |        2 |

| cat     |        2 |

| dog     |        3 |

| hamster |        1 |

| snake   |        1 |

+---------+----------+

如果你除了計(jì)數(shù)還返回一個(gè)列的值,那么必須使用GROU BY語句,否則無法計(jì)算記錄。例如上例,使用GROUP BY對每個(gè)owner分組所有記錄,沒有它,你得到的一切是一條錯(cuò)誤消息:

mysql> SELECT owner, COUNT(owner) FROM pet;

ERROR 1140 at line 1: Mixing of GROUP columns (MIN(),MAX(),COUNT()...)

with no GROUP columns is illegal if there is no GROUP BY clause

也可以根據(jù)多個(gè)列分組,例如:

按種類和性別組合的動物數(shù)量:

mysql> SELECT species, sex, COUNT(*) FROM pet GROUP BY species, sex;

+---------+------+----------+

| species | sex  | COUNT(*) |

+---------+------+----------+

| bird    | NULL |        1 |

| bird    | f    |        1 |

| cat     | f    |        1 |

| cat     | m    |        1 |

| dog     | f    |        1 |

| dog     | m    |        2 |

| hamster | f    |        1 |

| snake   | m    |        1 |

+---------+------+----------+

查詢多個(gè)表

查詢多個(gè)表,F(xiàn)ROM子句列出表名,并用逗號分隔,因?yàn)椴樵冃枰獜乃麄儍蓚€(gè)拉出信息。

當(dāng)組合(聯(lián)結(jié)-join)來自多個(gè)表的信息時(shí),你需要指定在一個(gè)表中的記錄怎樣能匹配其它表的記錄。這很簡單,因?yàn)樗鼈兌加幸粋€(gè)name列。查詢使用WHERE子句基于name值來匹配2個(gè)表中的記錄。

因?yàn)閚ame列出現(xiàn)在兩個(gè)表中,當(dāng)引用列時(shí),你一定要指定哪個(gè)表。這通過把表名附在列名前做到。

現(xiàn)在有一個(gè)event表:

mysql>select * from event;

+----------+------------+----------+-----------------------------+

| name     | date       | type     | remark                      |

+----------+------------+----------+-----------------------------+

| Fluffy   | 1995-05-15 | litter   | 4 kittens, 3 female, 1 male |

| Buffy    | 1993-06-23 | litter   | 5 puppies, 2 female, 3 male |

| Buffy    | 1994-06-19 | litter   | 3 puppies, 3 female         |

| Chirpy   | 1999-03-21 | vet      | needed beak straightened    |

| Slim     | 1997-08-03 | vet      | broken rib                  |

| Bowser   | 1991-10-12 | kennel   | NULL                        |

| Fang     | 1991-10-12 | kennel   | NULL                        |

| Fang     | 1998-08-28 | birthday | Gave him a new chew toy     |

| Claws    | 1998-03-17 | birthday | Gave him a new flea collar  |

| Whistler | 1998-12-09 | birthday | First birthday              |

+----------+------------+----------+-----------------------------+

當(dāng)他們有了一窩小動物時(shí),假定你想要找出每只寵物的年齡。 event表指出何時(shí)發(fā)生,但是為了計(jì)算母親的年齡,你需要她的出生日期。既然它被存儲在pet表中,為了查詢你需要兩張表:

mysql> SELECT pet.name, (TO_DAYS(date) - TO_DAYS(birth))/365 AS age, remark

-> FROM pet, event

-> WHERE pet.name = event.name AND type = "litter";

+--------+------+-----------------------------+

| name   | age  | remark                      |

+--------+------+-----------------------------+

| Fluffy | 2.27 | 4 kittens, 3 female, 1 male |

| Buffy  | 4.12 | 5 puppies, 2 female, 3 male |

| Buffy  | 5.10 | 3 puppies, 3 female         |

+--------+------+-----------------------------+

同樣方法也可用于同一張表中,你不必有2個(gè)不同的表來執(zhí)行一個(gè)聯(lián)結(jié)。如果你想要將一個(gè)表的記錄與同一個(gè)表的其他記錄進(jìn)行比較,聯(lián)結(jié)一個(gè)表到自身有時(shí)是有用的。例如,為了在你的寵物之中繁殖配偶,你可以用pet聯(lián)結(jié)自身來進(jìn)行相似種類的雄雌配對:

mysql> SELECT p1.name, p1.sex, p2.name, p2.sex, p1.species

-> FROM pet AS p1, pet AS p2

-> WHERE p1.species = p2.species AND p1.sex = "f" AND p2.sex = "m";

+--------+------+--------+------+---------+

| name   | sex  | name   | sex  | species |

+--------+------+--------+------+---------+

| Fluffy | f    | Claws  | m    | cat     |

| Buffy  | f    | Fang   | m    | dog     |

| Buffy  | f    | Bowser | m    | dog     |

+--------+------+--------+------+---------+

在這個(gè)查詢中,我們?yōu)楸砻付▌e名以便能引用列并且使得每一個(gè)列引用關(guān)聯(lián)于哪個(gè)表實(shí)例更直觀。

總結(jié)

本文總結(jié)了SELECT語句檢索記錄的簡單使用方法。其中涉及到的內(nèi)容主要包括以下一些內(nèi)容:

1、WHERE從句的用法

2、GROUP BY從句的用法

3、ORDER BY從句的用法

4、連接多個(gè)表的簡單介紹


發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 永福县| 黑河市| 井陉县| 双城市| 岳池县| 炉霍县| 将乐县| 甘洛县| 余江县| 景泰县| 通许县| 彝良县| 喀什市| 梅州市| 浦东新区| 保亭| 阿克| 诸暨市| 同心县| 石渠县| 舒城县| 平邑县| 吉首市| 兰考县| 射洪县| 武宁县| 岳普湖县| 巴南区| 玉田县| 防城港市| 武城县| 四川省| 宁强县| 松桃| 略阳县| 浦北县| 洪湖市| 五原县| 大理市| 班玛县| 赤壁市|