您好,登錄后才能下訂單哦!
這篇文章主要介紹了SQL中關鍵字的使用示例,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
起別名
在實際的項目中,有時候我們的表名、字段名過于復雜以致于我們的 SQL 寫出來過長、過于復雜,這時候我們往往會通過起別名的方式將一些名字較長、較為復雜的字段或是表名簡化。
我們可以使用別名(Alias)來對數據表或者列進行臨時命名,既然是別名,也就是說并不會修改原表或列的原始名稱,僅僅用于當前查詢的簡介化顯示。
給表起別名:
select * from person as p where p.id = 1;
一旦為表執行了別名,那么本次查詢的子查詢語句中都可以直接引用別名替代原表的引用。
給列起別名:
select name as n,age as a from perosn;
除了使用關鍵字 as 來給表或是列起別名外,還可以直接使用空格字符達到同樣的效果,但是個人認為要么全部使用 as 進行別名,要么全部使用空格進行別名,不要交叉使用使得你的 SQL 復雜又難以看懂。
消除重復記錄
有時候,我們的數據庫中會存在兩條完全一樣的數據,我們也叫做冗余數據,當然不希望在查詢數據的時候查出來這么些冗余的重復數據,我們要把它們過濾掉。
LeetCode 上的一道簡單題:
有一個courses 表 ,有: student (學生) 和 class (課程)。
請列出所有超過或等于5名學生的課。
例如,表:
+---------+------------+ | student | class | +---------+------------+ | A | Math | | B | English | | C | Math | | D | Biology | | E | Math | | F | Computer | | G | Math | | H | Math | | I | Math | +---------+------------+
應該輸出:
+---------+
| class |
+---------+
| Math |
+---------+
你可以花個一分鐘思考一下,運用我們之前的基本功,應該是不難的。
顯然是需要用到分組的,想要統計每門課有多少人選,就得按照學科進行分組,每個分組內就是該門學科選修的學生記錄。
那么 SQL 語句也就信手拈來了:
select class from courses group by class having count(student) >=5
但是你提交后在海量測試用例下,會返回給你解答錯誤的提示,不信你試試,問題出在哪?
問題就出現在冗余數據這個邊界條件沒有被考慮,如果 A 選了兩次 Math,當我們對 Math 這個分組進行計數時就會多算一次選 Math 的人數,實際上這是不符合邏輯的,我們需要過濾掉那些重復選擇的數據記錄。
解決方案如下:
select class from courses group by class having count(distinct student) >=5
有些人可能看出來了,我們在 count 函數的列參數前添加了一個 distinct 關鍵字,它表示如果 student 列的值重復出現的話只計數一次。
當然,distinct 除了可以在聚合函數中使用外,也可以直接用在查詢語句的列篩選階段,例如:
//取出所有的學生,不允許重復名字的學生同時出現 select distinct name from students
連接結果集
UNION 運算符可以將一個或多個 SELECT 語句的結果連接組合成一個結果集,但要求兩個或多個結果具有相同數量的列,列的數據類型相同,舉個例子:
構建一個學生表:
+----+------+----------+-------+ | id | name | uNo | fees | +----+------+----------+-------+ | 1 | 張三 | 15263501 | 18000 | | 2 | 李四 | 15263506 | 15960 | | 3 | 王二 | 15263512 | 2500 | +----+------+----------+-------+
學生表主要有學生的姓名,學號和學費。
構建一個教師表:
+----+--------+------+--------+ | id | name | tNo | salary | +----+--------+------+--------+ | 1 | 李老師 | 1001 | 10000 | | 2 | 楊老師 | 1002 | 15000 | | 3 | 曹老師 | 1030 | 5000 | +----+--------+------+--------+
現在有一個需求,需要拿到全校所有人的姓名和編號,包括學生和老師。一般來說,我們兩次 select 查詢就好了,但是沒法合并在一個結果集中顯示,這是一個問題。
于是我們可以使用 union 來連接兩個結果并在一張表中顯示出來:
select name,uNo from students union select name,tNo from teacher
查詢結果:
+--------+----------+
| name | uNo |
+--------+----------+
| 張三 | 15263501 |
| 李四 | 15263506 |
| 王二 | 15263512 |
| 李老師 | 1001 |
| 楊老師 | 1002 |
| 曹老師 | 1030 |
+--------+----------+
看起來是不是直觀了很多,除此之外的是,如果兩個結果集中存在完全重復的數據記錄,合并后的結果集中不會重復出現該數據記錄。
當然了,如果你不需要在合并結果集的時候刪除掉重復的數據行,你可以轉而使用關鍵字 UNION ALL 替代 UNION。
TOP
TOP 子句用于從一張數據表中取回前 N 個或者 X% 的記錄,但是需要注意的是,沒有一個數據庫實現是支持 TOP 的,各自有各自的關鍵字作為替代,例如 MySQL 和 SQLserver 使用 LIMIT 關鍵字,Oracle 使用 ROWNUM 關鍵字。
例如:
select * from students limit 2;
MySQL 數據庫取出前兩條數據,等效的 Oracle 數據庫寫法:
select * from students rownum <= 2
感謝你能夠認真閱讀完這篇文章,希望小編分享的“SQL中關鍵字的使用示例”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。