欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SQL中一些小巧但常用的關(guān)鍵字小結(jié)

 更新時(shí)間:2019年03月05日 09:29:14   作者:Single_Yam  
這篇文章主要給大家總結(jié)介紹了關(guān)于SQL中一些小巧但常用的關(guān)鍵字,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

前言

前面的幾篇文章中,我們大體上介紹了 SQL 中基本的創(chuàng)建、查詢語(yǔ)句,甚至也學(xué)習(xí)了相對(duì)復(fù)雜的連接查詢和子查詢,這些基本功相信你也一定掌握的不錯(cuò),那么本篇?jiǎng)t著重介紹幾個(gè)技巧方面的關(guān)鍵字,能夠讓你更快更有效率的寫出一些 SQL。

下面話不多說了,來(lái)一起看看詳細(xì)的介紹吧

起別名

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

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

給表起別名:

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

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

給列起別名:

select name as n,age as a from perosn;

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

消除重復(fù)記錄

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

LeetCode 上的一道簡(jiǎn)單題:

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

請(qǐng)列出所有超過或等于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    |
+---------+

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

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

那么 SQL 語(yǔ)句也就信手拈來(lái)了:

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

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

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

解決方案如下:

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

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

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

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

連接結(jié)果集

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

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

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

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

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

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

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

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

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

查詢結(jié)果:

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

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

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

TOP

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

例如:

select * from students limit 2;

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

select * from students
rownum <= 2

以上的一些關(guān)鍵字雖然逐個(gè)看起來(lái)很簡(jiǎn)單,但有時(shí)候可能會(huì)幫上你大忙的,不要忘記使用它們!。

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • 深入SQL中PIVOT 行列轉(zhuǎn)換詳解

    深入SQL中PIVOT 行列轉(zhuǎn)換詳解

    T-SQL語(yǔ)句中,Pivot運(yùn)算符用于在列和行之間對(duì)數(shù)據(jù)進(jìn)行旋轉(zhuǎn)或透視轉(zhuǎn)換,PIVOT命令可以實(shí)現(xiàn)數(shù)據(jù)表的列轉(zhuǎn)行,同時(shí)執(zhí)行聚合運(yùn)算,UNPIVOT則與其相反,實(shí)現(xiàn)數(shù)據(jù)的行轉(zhuǎn)列。
    2015-10-10
  • 使用SQL語(yǔ)句查詢MySQL,SQLServer,Oracle所有數(shù)據(jù)庫(kù)名和表名,字段名

    使用SQL語(yǔ)句查詢MySQL,SQLServer,Oracle所有數(shù)據(jù)庫(kù)名和表名,字段名

    本文例出了使用SQL語(yǔ)句查詢MySQL,SQLServer,Oracle所有數(shù)據(jù)庫(kù)名和表名的SQL語(yǔ)句,有需要的可以參考下
    2018-03-03
  • JDBC大批量寫入數(shù)據(jù)到SQLServer2000,記錄數(shù)大于10000

    JDBC大批量寫入數(shù)據(jù)到SQLServer2000,記錄數(shù)大于10000

    JDBC大批量寫入數(shù)據(jù)到SQLServer2000,記錄數(shù)大于10000
    2009-12-12
  • SQL注入報(bào)錯(cuò)注入函數(shù)圖文詳解

    SQL注入報(bào)錯(cuò)注入函數(shù)圖文詳解

    報(bào)錯(cuò)注入是SQL注入的一種,下面這篇文章主要給大家介紹了關(guān)于SQL注入報(bào)錯(cuò)注入函數(shù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-07-07
  • Doris?數(shù)據(jù)模型ROLLUP及前綴索引官方教程

    Doris?數(shù)據(jù)模型ROLLUP及前綴索引官方教程

    本文檔主要從邏輯層面,描述 Doris 的數(shù)據(jù)模型 ROLLUP 以及前綴索引的概念,以幫助用戶更好的使用 Doris 應(yīng)對(duì)不同的業(yè)務(wù)場(chǎng)景,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • Spark?SQL小文件問題處理

    Spark?SQL小文件問題處理

    大量的小文件會(huì)影響Hadoop集群管理或者Spark在處理數(shù)據(jù)時(shí)的穩(wěn)定性,這篇文章主要介紹了Spark?SQL小文件問題的處理,感興趣的同學(xué)可以借鑒一下
    2023-04-04
  • 讓你的insert操作速度增加1000倍的方法

    讓你的insert操作速度增加1000倍的方法

    大家平時(shí)都會(huì)使用insert語(yǔ)句,特別是有時(shí)候需要一個(gè)大批量的數(shù)據(jù)來(lái)做測(cè)試,一條一條insert將會(huì)是非常慢的,那么我們?nèi)绾巫屛覀兊膇nser更快呢。
    2009-08-08
  • 關(guān)于SQL注入繞過的一些知識(shí)點(diǎn)

    關(guān)于SQL注入繞過的一些知識(shí)點(diǎn)

    網(wǎng)上關(guān)于SQL注入的繞過技巧有很多,最近正好空下來(lái),想著整理下關(guān)于SQL注入繞過的一些姿勢(shì)。歡迎大牛補(bǔ)充,下面這篇文章主要介紹了關(guān)于SQL注入繞過的一些知識(shí)點(diǎn),總結(jié)的還是相對(duì)比較全面的,需要的朋友可以參考下。
    2017-03-03
  • DataGrip 數(shù)據(jù)導(dǎo)出與導(dǎo)入的實(shí)現(xiàn)示例

    DataGrip 數(shù)據(jù)導(dǎo)出與導(dǎo)入的實(shí)現(xiàn)示例

    DataGrip 是一款類似于Workbench的數(shù)據(jù)庫(kù)設(shè)計(jì)工具。文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • MySQL與Redis如何保證數(shù)據(jù)一致性詳解

    MySQL與Redis如何保證數(shù)據(jù)一致性詳解

    在高并發(fā)的業(yè)務(wù)場(chǎng)景下數(shù)據(jù)庫(kù)大多數(shù)情況都是用戶并發(fā)訪問最薄弱的環(huán)節(jié),所以就需要使用redis做一個(gè)緩沖操作,讓請(qǐng)求先訪問到redis,而不直接訪問Mysql等數(shù)據(jù)庫(kù),這篇文章主要給大家介紹了關(guān)于MySQL與Redis如何保證數(shù)據(jù)一致性的相關(guān)資料,需要的朋友可以參考下
    2021-08-08

最新評(píng)論