關係資料庫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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...