SQL數據查詢之——單表查詢

来源:https://www.cnblogs.com/OctoptusLian/archive/2018/01/02/8150657.html
-Advertisement-
Play Games

一、SQL數據查詢的一般格式 數據查詢是資料庫的核心操作。SQL提供了SELECT語句進行數據查詢,其一般格式為: 整個SELECT語句的含義是,根據WHERE子句的條件表達式從FROM子句指定的基本表、視圖或派生表中找出滿足條件的元組,再按SELECT子句中的目標列表達式選出元組中的屬性值形成結果 ...


一、SQL數據查詢的一般格式

數據查詢是資料庫的核心操作。SQL提供了SELECT語句進行數據查詢,其一般格式為:

SELECT [ALL | DISTINCT]<目標列表達式>[,<目標列表達式>]···
FROM<表名或視圖名>[,<表名或視圖名>···] | (SELECT語句>)[AS]<別名>
[WHERE<條件表達式>]
[GROUP BY<列名1>[HAVING<條件表達式>]]
[ORDER BY<列名2>[ASC | DESC]];

整個SELECT語句的含義是,根據WHERE子句的條件表達式從FROM子句指定的基本表、視圖或派生表中找出滿足條件的元組,再按SELECT子句中的目標列表達式選出元組中的屬性值形成結果表

如果有GROUP BY子句,則將結果按<列名1>的值進行分組,該屬性列值相等的元組為一個組。通常會在每組中作用聚集函數。如果GROUP BY子句帶HAVING短語,則只有滿足指定條件的組才予以輸出。

如果有ORDER BY子句,則結果還要按<列名2>的值的升序或降序排序。

SELECT語句既可以完成簡單的單表查詢,也可以完成複雜的連接查詢和嵌套查詢。

 

二、SQL單表查詢(僅涉及一個表的查詢)

1.選擇表中的若幹列

(1)查詢指定列

查詢全體學生的學號與姓名

SELECT Sno,Sname
FROM Student;

 

查詢全體學生的姓名、學號、所在系

SELECT Sname,Sno,Sdept
FROM Student;

 

(2)查詢全部列

查詢全體學生的詳細記錄

    SELECT *
    FROM Students;
等價於
    SELECT Sno,Sname,Ssex,Sage,Sdept
    FROM Student;

 

(3)查詢經過計算的值

查詢全體學生的姓名及其出生年份

SELECT Sname,2014-Sage  //查詢結果的第2列是一個 算術表達式
FROM Student;

註意:用當時的年份(假設為2014年)減去學生的年齡,這樣所得的即是學生的出生年份。

 

查詢全體學生的姓名、出生年份和所在的院系,要求用小寫字母表示系名

SELECT Sname,'Year of Birth:',2014-Sage,LOWER(Sdept)
FROM Student;

 

2.選擇表中的若幹組

(1)消除取值重覆的行

查詢選修了課程的學生學號

SELECT DISTINCT Sno
FROM SC;

 

(2)查詢滿足條件的元組

查詢滿足指定條件的元組可以通過WHERE子句實現。WHERE子句常用的查詢條件如下表所示

查詢條件

謂詞

比較

=,>,<,>=,<=,!=,<>,!>,!<; NOT+上述比較運算符

確定範圍

BETWEEN AND,NOT BETWEEN AND

確定集合

IN,NOT IN

字元匹配

LIKE,NOT LIKE

空值

IS NULL,IS NOT NULL

多重條件(邏輯運算)

AND,OR,NOT

 

查詢電腦科學系全體學生的名單

SELECT Sname
FROM Student
WHERE Sdept='CS'

 

查詢所有年齡在20歲以下的學生姓名及其年齡

SELECT Sname,Sage
FROM Student
WHERE Sage<20;

 

查詢考試成績不合格的學生的學號

SELECT DISTINCT Sno
FROM SC
WHERE Grade<60;

 

查詢年齡在20~23歲之間的學生的姓名、系別和年齡

SELECT Sname,Sdept,Sage
FROM Student
WHERE Sage BETWEEN 20 AND 23

 

查詢年齡在20~23歲之間的學生的姓名、系別和年齡

SELECT Sname,Sdept,Sage
FROM Student
WHERE Sage NOT BETWEEN 20 AND 23

 

查詢電腦科學系(CS)、數學系(MA)和信息系(IS)學生的姓名、系別和年齡

SELECT Sname,Ssex
FROM Student
WHERE Sdept IN('CS','MA','IS');

 

查詢學號為201215121的學生的詳細情況

    SELECT *
    FROM Student
    WHERE Sno LIKE '201215121'
等價於
    SELECT *
    FROM Student
    WHERE Sno='201215121'

此處介紹下字元匹配

謂詞LIKE可以用來進行字元串的匹配。其一般語法格式如下:

[NOT] LIKE'<匹配串>' [ESCAPE '<換碼字元>']

 

其含義是查找指定的屬性列值與<匹配串>相匹配的元組。<匹配串>可以是一個完整的字元串,也可以含有通配符 % 和 _ 。其中:

  • %(百分號)代表任意長度(長度可以為0)的字元串。例如:a%b 表示以a開頭,以b結尾的任意長度的字元串。如acb、addgb、ab等。
  • _(下劃線)代表任意單個字元。例如:a_b表示以a開頭,以b結尾的長度為3的任意字元串。如acb、agb等。

 

查詢所有姓劉的學生的姓名、學號和性別

SELECT Sname,Sno,Ssex
FROM Student
WHERE Sname LIKE '劉%';

 

查詢姓“歐陽”且全名為三個漢字的學生的姓名

SELECT Sname
FROM Student
WHERE Sname LIKE '歐陽_'

註意:資料庫字集為ASCII時一個漢字需要兩個_;當字元集為GBK時只需要一個。

 

查詢名字中第二個字為“陽”的學生的姓名和學號

SELECT Sname,Sno,
FROM Student
WHERE Sname LIKE '_陽%';

 

查詢所有不姓劉的學生的姓名、學號和性別

SELECT Sname,Sno,Ssex
FROM Student
WHERE Sname NOT LIKE '劉%';

 如果用戶要查詢的字元串本身就含有通配符%或_,這時就要使用 ESCAPE '<換碼字元>' 短語對通配符進行轉義了。

 

查詢DB_Design 課程的課程號和學分

SELECT Cno,Ccredit
FROM Course
WHERE Cname LIKE 'DB \ _Design' ESCAPE '\';

 ESCAPE '\' 表示 “\” 為換碼字元。這樣匹配串中緊跟在 “\” 後面的字元“_”不再具有通配符的含義,轉義為普通的“_”字元。

 

查詢以“DB_”開頭,且倒數第三個字元為i的課程的詳細情況

SELECT *
FROM Course
WHERE Cname LIKE 'DB \_%i__'ESCAPE '\';

 

某些學生選修課程後沒有參加考試,所以有選課記錄,但沒有考試成績。查詢缺少成績的學生的學號和相應的課程號

SELECT Sno,Cno
FROM SC
WHERE Grade IS NULL;  /*分數Grade是空值*/

 註意:這裡的“IS”不能用等號(=)代替。

 

查所有有成績的學生學號和課程號

SELECT Sno,Cno
FROM SC
WHERE Grade IS NOT NULL;

 

查詢電腦科學系年齡在20歲以下的學生姓名

SELECT Sname
FROM Student
WHERE Sdept='CS' AND Sage<20;

 

3.ORDER BY 子句

用戶可以用ORDER BY子句對查詢結果按照一個或多個屬性列的升序(ASC)或降序(DESC)排列,預設值為升序。

查詢選修了3號課程的學生的學號及其成績,查詢結果按分數的降序排列

SELECT Sno,Grade
FROM SC
WHERE Cno='3'
ORDER BY Grade DESC;

 

查詢全體學生情況,查詢結果按所在系的系號升序排列,同一系中的學生按年齡降序排列

SELECT *
FROM Student
ORDER BY Sdept,Sage DESC;

 

4. 聚集函數

為了進一步方便用戶,增強檢索功能,SQL提供了許多聚集函數,主要有:

COUNT(*)

統計元組個數

COUNT([DISTINCT|ALL]<列名>)

統計一列中值的個數

SUM([DISTINCT|ALL]<列名>)

計算一列值的總和(此列必須是數值型)

AVG([DISTINCT|ALL]<列名>)

計算一列值的平均值(此列必須是數值型)

MAX([DISTINCT|ALL]<列名>)

求一列值中的最大值

MIN([DISTINCT|ALL]<列名>)

求一列值中的最小值

如果指定 DISTINCT 短語,則表示在計算時要取消指定列中的重覆值。

如果不指定 DISTINCT 短語或指定 ALL 短語(ALL為預設值),則表示不取消重覆值。

 

查詢學生總人數

SELECT COUNT(*)
FROM Student;

 

查詢選修了課程的學生人數

SELECT COUNT(DISTINCT Sno)
FROM SC;

 

計算選修1號課程的學生平均成績

SELECT AVG(Grade)
FROM SC
WHERE Cno='1';

 

查詢選修1號課程的學生最高分數

SELECT MAX(Grade)
FROM SC
WHERE Cno='1';

 

查詢學生201215012選修課程的總學分數

SELECT SUM(Ccredit)
FROM SC,Course
WHERE Sno='201215012' AND SC.Cno=Course.Cno;

 註意:WHERE 子句中是不能用聚集函數作為條件表達式的。聚集函數只能用於SELECT子句和GROUP BY中的HAVING子句。

 

5.GROUP BY子句

將查詢結果按某一列或多列的值分組,值相等的為一組。

 

求各個課程號及相應的選課人數

SELECT Cno,COUNT(Sno)
FROM SC
GROUP BY Cno;

 

查詢選修了三門以上課程的學生學號

SELECT Sno
FROM SC
GROUP BY Sno
HAVING COUNT(*)>3;

 

查詢平均成績大於等於90分的學生學號和平均成績

    SELECT Sno,AVG(Grade)
    FROM SC
    WHERE AVG(Grade)>=90 (錯誤!)
    GROUP BY Sno;
因為WHERE子句中是不能用聚集函數作為條件表達式的,正確的查詢語句應該是:
    SELECT Sno,AVG(Grade)
    FROM SC
    GROUP BY Sno;    
    HAVING AVG(Grade)>=90;

 

三、總結

此次整理了SQL數據查詢中有關單表查詢的程式,其中應格外註意

  • 字元匹配中 % 和 _ 的區別。
  • ESCAPE 的 換碼操作。
  • 聚集函數只能用於 SELECT子句 和 GROUP BY子句 中的 HAVING 子句。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.關機重啟命令 (1)shutdown命令:shutdown [選項] 時間 選項:-c 取消前一個關機命令 -h 關機 -r 重啟 例:shutdown -h now #立刻關機,root用戶 +10& #10分鐘後關機 20:30& #定義絕對重啟時間 (2)其他關機命令(不一定正確保存):h ...
  • Mac OS X一直能夠讀取NTFS驅動器,但隱藏在Mac OS X中是隱藏的選項,以支持格式化為NTFS的驅動器(NTFS代表新技術文件系統,是Microsoft Windows專有的文件系統格式)。在Mac上啟用NTFS寫入支持是有相當技術性的,並沒有得到蘋果公司的正式支持,因此它是一個實驗性的 ...
  • 從 1970 年開始,vi 和 vim 就成為了程式員最喜愛的文本編輯器之一。5年前,我寫了一個問自己名為 “每個程式員都應該知道的 100 個 vim 命令” 這次算是之前那篇文章的改進版,希望你會喜歡。 基礎 在文件中移動 剪切、複製和粘貼 搜索 替換 大小寫 讀寫文件 文件瀏覽器 和 Unix ...
  • 今天依舊是SQL Server資料庫。。。 1. 在月銷售情況表中刪除銷售價格在10元以下的商品月銷售信息 2. 查詢編號為G001、G002、G003三種商品的銷售情況,包括商店號gno、商品號sno、年份Yr、月份Mth、銷售數量count(*),並按銷售數量降序排列 3. 查詢各商店的每月詳細 ...
  • 1、安裝jdk 測試jdk是否已經安裝 [root@node002 ~]# java -version-bash: java: command not found 創建解壓目錄 [root@node002 ~]# mkdir -p /usr/local/java 上傳jdk 解壓jdk [root@ ...
  • 建庫、建表 1、建庫 (1)SQL語句命令建庫: Create database資料庫名稱 (該方法創建的資料庫沒有設置編碼亂碼) 1 2 3 4 5 -- 創建資料庫時,設置資料庫的編碼方式 -- CHARACTER SET:指定資料庫採用的字元集,utf8不能寫成utf-8 -- COLLATE ...
  • Mysql資料庫知識點 1.管理資料庫語句: 使用資料庫: use test; 添加資料庫: create database 資料庫名; create database test; 修改資料庫: alter database 資料庫名; alter database test; 刪除資料庫: dro ...
  • 今天在用一鍵安裝mysql的shell腳本安裝mysql-5.1.73軟體後發現mysql始終無法啟動,多次執行後依舊報錯,只能去查看error日誌,發現瞭如下的2個錯誤: 錯誤一:Fatal error: Can't open and lock privilege tables: Table 'm ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...