真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

SQL中關(guān)鍵字的使用示例

這篇文章主要介紹了SQL中關(guān)鍵字的使用示例,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)建站!專注于網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、小程序開發(fā)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了衢江免費(fèi)建站歡迎大家使用!

起別名

在實(shí)際的項(xiàng)目中,有時候我們的表名、字段名過于復(fù)雜以致于我們的 SQL 寫出來過長、過于復(fù)雜,這時候我們往往會通過起別名的方式將一些名字較長、較為復(fù)雜的字段或是表名簡化。

我們可以使用別名(Alias)來對數(shù)據(jù)表或者列進(jìn)行臨時命名,既然是別名,也就是說并不會修改原表或列的原始名稱,僅僅用于當(dāng)前查詢的簡介化顯示。

給表起別名:

select * from person as p
where p.id = 1;

一旦為表執(zhí)行了別名,那么本次查詢的子查詢語句中都可以直接引用別名替代原表的引用。

給列起別名:

select name as n,age as a from perosn;

除了使用關(guān)鍵字 as 來給表或是列起別名外,還可以直接使用空格字符達(dá)到同樣的效果,但是個人認(rèn)為要么全部使用 as 進(jìn)行別名,要么全部使用空格進(jìn)行別名,不要交叉使用使得你的 SQL 復(fù)雜又難以看懂。

消除重復(fù)記錄

有時候,我們的數(shù)據(jù)庫中會存在兩條完全一樣的數(shù)據(jù),我們也叫做冗余數(shù)據(jù),當(dāng)然不希望在查詢數(shù)據(jù)的時候查出來這么些冗余的重復(fù)數(shù)據(jù),我們要把它們過濾掉。

LeetCode 上的一道簡單題:

有一個courses 表 ,有: student (學(xué)生) 和 class (課程)。

請列出所有超過或等于5名學(xué)生的課。

例如,表:

+---------+------------+
| student | class  |
+---------+------------+
| A  | Math  |
| B  | English |
| C  | Math  |
| D  | Biology |
| E  | Math  |
| F  | Computer |
| G  | Math  |
| H  | Math  |
| I  | Math  |
+---------+------------+

應(yīng)該輸出:

+---------+
| class   |
+---------+
| Math    |
+---------+

你可以花個一分鐘思考一下,運(yùn)用我們之前的基本功,應(yīng)該是不難的。

顯然是需要用到分組的,想要統(tǒng)計每門課有多少人選,就得按照學(xué)科進(jìn)行分組,每個分組內(nèi)就是該門學(xué)科選修的學(xué)生記錄。

那么 SQL 語句也就信手拈來了:

select class from courses
group by class
having count(student) >=5

但是你提交后在海量測試用例下,會返回給你解答錯誤的提示,不信你試試,問題出在哪?

問題就出現(xiàn)在冗余數(shù)據(jù)這個邊界條件沒有被考慮,如果 A 選了兩次 Math,當(dāng)我們對 Math 這個分組進(jìn)行計數(shù)時就會多算一次選 Math 的人數(shù),實(shí)際上這是不符合邏輯的,我們需要過濾掉那些重復(fù)選擇的數(shù)據(jù)記錄。

解決方案如下:

select class from courses
group by class
having count(distinct student) >=5

有些人可能看出來了,我們在 count 函數(shù)的列參數(shù)前添加了一個 distinct 關(guān)鍵字,它表示如果 student 列的值重復(fù)出現(xiàn)的話只計數(shù)一次。

當(dāng)然,distinct 除了可以在聚合函數(shù)中使用外,也可以直接用在查詢語句的列篩選階段,例如:

//取出所有的學(xué)生,不允許重復(fù)名字的學(xué)生同時出現(xiàn)
select distinct name from students

連接結(jié)果集

UNION 運(yùn)算符可以將一個或多個 SELECT 語句的結(jié)果連接組合成一個結(jié)果集,但要求兩個或多個結(jié)果具有相同數(shù)量的列,列的數(shù)據(jù)類型相同,舉個例子:

構(gòu)建一個學(xué)生表:

+----+------+----------+-------+
| id | name | uNo  | fees |
+----+------+----------+-------+
| 1 | 張三 | 15263501 | 18000 |
| 2 | 李四 | 15263506 | 15960 |
| 3 | 王二 | 15263512 | 2500 |
+----+------+----------+-------+

學(xué)生表主要有學(xué)生的姓名,學(xué)號和學(xué)費(fèi)。

構(gòu)建一個教師表:

+----+--------+------+--------+
| id | name | tNo | salary |
+----+--------+------+--------+
| 1 | 李老師 | 1001 | 10000 |
| 2 | 楊老師 | 1002 | 15000 |
| 3 | 曹老師 | 1030 | 5000 |
+----+--------+------+--------+

現(xiàn)在有一個需求,需要拿到全校所有人的姓名和編號,包括學(xué)生和老師。一般來說,我們兩次 select 查詢就好了,但是沒法合并在一個結(jié)果集中顯示,這是一個問題。

于是我們可以使用 union 來連接兩個結(jié)果并在一張表中顯示出來:

select name,uNo from students
union
select name,tNo from teacher

查詢結(jié)果:

+--------+----------+
| name   | uNo      |
+--------+----------+
| 張三   | 15263501 |
| 李四   | 15263506 |
| 王二   | 15263512 |
| 李老師 | 1001     |
| 楊老師 | 1002     |
| 曹老師 | 1030     |
+--------+----------+

看起來是不是直觀了很多,除此之外的是,如果兩個結(jié)果集中存在完全重復(fù)的數(shù)據(jù)記錄,合并后的結(jié)果集中不會重復(fù)出現(xiàn)該數(shù)據(jù)記錄。

當(dāng)然了,如果你不需要在合并結(jié)果集的時候刪除掉重復(fù)的數(shù)據(jù)行,你可以轉(zhuǎn)而使用關(guān)鍵字 UNION ALL 替代 UNION。

TOP

TOP 子句用于從一張數(shù)據(jù)表中取回前 N 個或者 X% 的記錄,但是需要注意的是,沒有一個數(shù)據(jù)庫實(shí)現(xiàn)是支持 TOP 的,各自有各自的關(guān)鍵字作為替代,例如 MySQL 和 SQLserver 使用 LIMIT 關(guān)鍵字,Oracle 使用 ROWNUM 關(guān)鍵字。

例如:

select * from students limit 2;

MySQL 數(shù)據(jù)庫取出前兩條數(shù)據(jù),等效的 Oracle 數(shù)據(jù)庫寫法:

select * from students
rownum <= 2

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“SQL中關(guān)鍵字的使用示例”這篇文章對大家有幫助,同時也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識等著你來學(xué)習(xí)!


分享名稱:SQL中關(guān)鍵字的使用示例
URL網(wǎng)址:http://weahome.cn/article/gjihdg.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部