關係資料庫SQL之基本數據查詢:子查詢、分組查詢、模糊查詢

来源:http://www.cnblogs.com/seayxu/archive/2016/05/06/sql-query-base.html
-Advertisement-
Play Games

前言 上一篇[關係資料庫常用SQL語句語法大全][2]主要是關係型資料庫大體結構,本文細說一下關係型資料庫查詢的SQL語法。 ![SQL數據查詢][1] 語法回顧 SQL查詢語句的順序:SELECT、FROM、WHERE、GROUP BY、HAVING、ORDER BY。SELECT、FROM是必須 ...


前言


上一篇關係資料庫常用SQL語句語法大全主要是關係型資料庫大體結構,本文細說一下關係型資料庫查詢的SQL語法。

SQL數據查詢

語法回顧


SELECT [ALL|DISTINCT] <目標列表達式>[,<目標列表達式>]…
  FROM <表名或視圖名>[,<表名或視圖名>]…
  [WHERE <條件表達式>]
  [GROUP BY <列名> [HAVING <條件表達式>]]
  [ORDER BY <列名> [ASC|DESC]…]

SQL查詢語句的順序:SELECT、FROM、WHERE、GROUP BY、HAVING、ORDER BY。SELECT、FROM是必須的,HAVING子句只能與GROUP BY搭配使用。

準備工作


1.創建資料庫和數據表
2.插入基本數據
3.本文以SQL Server為例介紹

-- 創建學生表
CREATE TABLE Students(
    Id int NOT NULL PRIMARY KEY,
    Name varchar(20) NOT NULL,
    Class varchar(15) NOT NULL,
    Gender varchar(10) NULL,
    Age int NULL,
    Phone varchar(15) NULL,
    [Address] varchar(100) NULL
)

-- 創建課程表
CREATE TABLE Courses(
    Id int NOT NULL PRIMARY KEY IDENTITY(1,1),
    Name varchar(50) NOT NULL
);

-- 創建成績表
CREATE TABLE Scores(
    Id int PRIMARY KEY IDENTITY(1,1),
    SId int NOT NULL,
    CId int NOT NULL,
    Grades decimal(5,2) NOT NULL,
    IsPassed bit NOT NULL
);

-- 插入學生表基礎數據
INSERT INTO Students (Id,Name,Class,Gender,Age,Phone,[Address]) VALUES(2016001,'小明','一班','男',20,'18817716611','北京');
INSERT INTO Students (Id,Name,Class,Gender,Age,Phone,[Address]) VALUES(2016002,'小龍','一班','男',19,'18817716622','天津');
INSERT INTO Students (Id,Name,Class,Gender,Age,Phone,[Address]) VALUES(2016003,'小王','二班','男',20,'18817716633','北京');
INSERT INTO Students (Id,Name,Class,Gender,Age,Phone,[Address]) VALUES(2016004,'婷婷','一班','女',17,'18817716644','濟南');
INSERT INTO Students (Id,Name,Class,Gender,Age,Phone,[Address]) VALUES(2016005,'張三','一班','男',19,'18817716655','北京');
INSERT INTO Students (Id,Name,Class,Gender,Age,Phone,[Address]) VALUES(2016006,'小趙','一班','男',20,'18817716666','北京');
INSERT INTO Students (Id,Name,Class,Gender,Age,Phone,[Address]) VALUES(2016007,'麗麗','二班','女',18,'18817716677','北京');
INSERT INTO Students (Id,Name,Class,Gender,Age,Phone,[Address]) VALUES(2016008,'花花','一班','女',19,'18817716688','沈陽');
INSERT INTO Students (Id,Name,Class,Gender,Age,Phone,[Address]) VALUES(2016009,'靜靜','二班','女',20,'18817716699','北京');

-- 插入課程表基礎數據
INSERT INTO Courses(Name) VALUES('語文');
INSERT INTO Courses(Name) VALUES('數學');
INSERT INTO Courses(Name) VALUES('英語');

-- 插入成績表基礎數據
INSERT INTO Scores(SId,CId,Grades,IsPassed) VALUES(2016001,1,120,1);
INSERT INTO Scores(SId,CId,Grades,IsPassed) VALUES(2016001,2,70,0);
INSERT INTO Scores(SId,CId,Grades,IsPassed) VALUES(2016001,3,89,1);
INSERT INTO Scores(SId,CId,Grades,IsPassed) VALUES(2016002,1,90,1);
INSERT INTO Scores(SId,CId,Grades,IsPassed) VALUES(2016002,2,88,1);
INSERT INTO Scores(SId,CId,Grades,IsPassed) VALUES(2016002,3,96,1);
INSERT INTO Scores(SId,CId,Grades,IsPassed) VALUES(2016003,1,112,1);
INSERT INTO Scores(SId,CId,Grades,IsPassed) VALUES(2016003,3,102,1);
INSERT INTO Scores(SId,CId,Grades,IsPassed) VALUES(2016004,1,80,1);
INSERT INTO Scores(SId,CId,Grades,IsPassed) VALUES(2016004,2,86,1);
INSERT INTO Scores(SId,CId,Grades,IsPassed) VALUES(2016004,3,47,0);
INSERT INTO Scores(SId,CId,Grades,IsPassed) VALUES(2016005,1,87,1);
INSERT INTO Scores(SId,CId,Grades,IsPassed) VALUES(2016005,2,96,1);
INSERT INTO Scores(SId,CId,Grades,IsPassed) VALUES(2016005,3,68,0);
INSERT INTO Scores(SId,CId,Grades,IsPassed) VALUES(2016006,2,95,1);
INSERT INTO Scores(SId,CId,Grades,IsPassed) VALUES(2016006,3,100,1);
INSERT INTO Scores(SId,CId,Grades,IsPassed) VALUES(2016007,1,87,1);
INSERT INTO Scores(SId,CId,Grades,IsPassed) VALUES(2016007,2,57,0);
INSERT INTO Scores(SId,CId,Grades,IsPassed) VALUES(2016007,3,130,1);
INSERT INTO Scores(SId,CId,Grades,IsPassed) VALUES(2016008,1,89,1);
INSERT INTO Scores(SId,CId,Grades,IsPassed) VALUES(2016008,3,66,0);
INSERT INTO Scores(SId,CId,Grades,IsPassed) VALUES(2016009,1,97,1);
INSERT INTO Scores(SId,CId,Grades,IsPassed) VALUES(2016009,2,104,1);
INSERT INTO Scores(SId,CId,Grades,IsPassed) VALUES(2016009,3,68,1);

簡單查詢


簡單查詢只需要SELECTFROMWHERE3個關鍵字即可實現。

SELECT * FROM Students;
SELECT * FROM Students WHERE Class='一班';
SELECT * FROM Students WHERE Class='一班' AND Age = 20;

簡單查詢結果

別名/更名


語法

SELECT 欄位名1 [AS] 別名 [,欄位名1 AS 別名]… FROM <表名>

AS可以省略
當別名中含有非字母和下劃線時或者是關鍵字時,需要加上單/雙引號

示例

SELECT Id AS '學號',Name '姓名',Class ClassName FROM Students;

別名/更名

子查詢(嵌套查詢)


子查詢也稱嵌套查詢,是指一個SELECT查詢語句可以嵌入另一個SELECT查詢語句之中。SQL中允許多級嵌套,子查詢在實際使用中非常多。
連接查詢:涉及兩個及以上的表查詢為連接查詢。

--查詢二班學生成績
SELECT * FROM Scores WHERE SId IN(SELECT Id FROM Students WHERE Class='二班')

子查詢

聚合函數查詢


聚合函數:是一個值的集合為輸入,返回單個值的函數。
SQL預定義了5個聚集函數:AVG(平均值)、MIN(最小值)、MAX(最大值)、SUM(求和)、COUNT(計數)。
具體的資料庫還會預定義一些其他常用的函數,比如字元串相聚合函數、時間聚合函數……。

SELECT AVG(Age),MAX(Age),MIN(Age),SUM(Age),COUNT(Id) FROM Students;

聚合函數查詢

分組查詢


使用GROUP BY子句可進行分組查詢
註意:分組查詢的時候要在GROUP BY子句後面跟上所有查詢欄位的列表

--根據班級分組查詢各班平均年齡、最大 年齡、最小年齡、年齡總和、班級人數
SELECT Class,AVG(Age),MAX(Age),MIN(Age),SUM(Age),COUNT(Id) FROM Students GROUP BY Class;

分組查詢

HAVING子句

如果需要在分組前的數據進行限制,可以使用HAVING子句
HAVING子句只能與GROUP BY搭配使用

--根據班級分組查詢各班平均年齡並且班級人數大於3人
SELECT Class,AVG(Age) FROM Students GROUP BY Class HAVING COUNT(Id)>3;

HAVING子句

HAVING子句和WHERE的區別

WHERE語句在GROUP BY語句之前,SQL會在分組之前計算WHERE語句;
HAVING語句在GROUP BY語句之後,SQL會在分組之後計算HAVING語句。

模糊查詢


語法

SELECT 欄位列表 FROM 表名 WHERE 欄位 LIKE '<通配符>'

模糊查詢是通過關鍵字LIKE和通配符實現的
_:任何單個字元(一個'_'只匹配一個字元,多個字元就使用多個_)
%:包含零個或更多字元的任意字元串(匹配任意內容)
[]:指定範圍的字元(只匹配[]內的字元)
[ ^]:不在指定範圍的字元(只匹配除[]內的字元)
SQL中通配符可以混合使用

  • 單個字元匹配

    SELECT * FROM Students WHERE Name LIKE '小_';
    SELECT * FROM Students WHERE Phone LIKE '188177166__';

    模糊查詢-單個字元匹配

  • 任意字元匹配

    SELECT * FROM Students WHERE Phone LIKE '188177166__';
    SELECT * FROM Students WHERE Phone LIKE '%';
    SELECT * FROM Students;

    這三條SQL語句查詢結果都相同只針對此表,原因是瞎貓碰上死耗子。(數據少,剛好查詢的結果是全部的內容)

模糊查詢-任意匹配

  • 範圍內查詢

    -- 查詢所有手機號碼結尾兩位包含1和2的信息
    SELECT * FROM Students WHERE Phone LIKE '188177166[12][12]';

模糊查詢-範圍內查詢

  • 不在範圍內查詢
-- 查詢所有手機號碼結尾兩位不包含1、3、5、7的信息
SELECT * FROM Students WHERE Phone LIKE '188177166[^1357][^1357]';

模糊查詢-不在範圍內查詢

關於SQL查詢就到這裡告一段落,後面會更新相關內容。
如果你覺得有問題,歡迎和你一起探討。


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

-Advertisement-
Play Games
更多相關文章
  • 開發者設計界面時候往往不會使用系統自帶的標題欄,因為不美觀,所以需要自己設置標題欄。 1.根據需求在xml文件中設置標題佈局 2.在values的styles中將以上標題設置成自己的style 3.在醒目清單文件中用到該主題的activity的標簽中加入 android:theme="@style/ ...
  • 項目做多了之後,會發現其實 ScrollView嵌套ListVew或者GridView等很常用,但是你也會發現各種奇怪問題產生。根據個人經驗現在列出常見問題以及代碼最少最簡單的解決方法。 問題一 : 嵌套在 ScrollView的 ListVew數據顯示不全,我遇到的是最多只顯示兩條已有的數據。 解 ...
  • 初始化是為了使用某個類、結構體或枚舉類型的實例而進行的準備過程。這個過程包括為每個存儲的屬性設置一個初始值,然後執行新實例所需的任何其他設置或初始化。 初始化是通過定義構造器(Initializers)來實現的,這些構造器可以看做是用來創建特定類型實例的特殊方法。與 Objective-C 中的構造 ...
  • Handler背景理解: Handler被最多的使用在了更新UI線程中,但是,這個方法具體是什麼樣的呢?我在這篇博文中先領著大家認識一下什麼是handler以及它是怎麼樣使用在程式中,起著什麼樣的作用。 示例說明: 首先先建立兩個按鈕:一個是start按鈕,作用是開啟整個程式。另一個是終止按鈕end ...
  • MySQL伺服器的主從配置,本來是一件很簡單的事情,無奈不是從零開始,總是在別人已經安裝好的mysql伺服器之上 ,這就會牽扯到,mysql的版本,啟動文件,等一些問題。 http://www.cnblogs.com/roucheng/p/phpmysql.html 不過沒關係,先問清楚兩點 1、m ...
  • 無論何時對基礎數據執行插入、更新或刪除操作,SQL Server 資料庫引擎都會自動維護索引。隨著時間的推移,這些修改可能會導致索引中的信息分散在資料庫中(含有碎片)。當索引包含的頁中的邏輯排序(基於鍵值)與數據文件中的物理排序不匹配時,就存在碎片。碎片非常多的索引可能會降低查詢性能,導致應用程式響 ...
  • 同事在Toad裡面執行SQL語句時,突然無線網路中斷了,讓我檢查一下具體情況,如下所示(有些信息,用xxx替換,因為是在處理那些歷史歸檔數據,使用的一個特殊用戶,所以可以用下麵SQL找到對應的會話信息): SQL> SELECT B.USERNAME , 2 B.SID , 3 B.SERIAL# ... ...
  • Redis是一個開源的使用ANSI C語言編寫、支持網路、可基於記憶體亦可持久化的日誌型、Key-Value資料庫,並提供多種語言的API redis是一個key-value存儲系統。和Memcached類似,它支持存儲的value類型相對更多,包括string(字元串)、list(鏈表)、set(集 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...