1. 程式人生 > 實用技巧 >MySQL高階SQL語句

MySQL高階SQL語句

MySQL資料庫有一些SQL語句的高階使用方法,其對資料庫相關的工作可以可提供不少幫助。

這裡先建立一個數據庫資訊表用於後面的例子:
mysql -uroot -p123123(進入資料庫,並且將密碼直接在後面輸入好,這樣可以省事)
show databases; (檢視現有的資料庫)
create database school;(建立一個名為school的資料庫)
use school;(進入名為school的資料庫)
show tables;(在當前資料庫中檢視現有的資料表)
create table info (id int(4) not null primary key auto_increment,name varchar(10) not null ,score decimal(5,2),hobby int(4) not null);(建立一個名為info的資料表,定義欄位id為整型4個位元組不為空,設定為主鍵,自增;定義欄位name為長字元型10個位元組,不為空;定義欄位score為浮點型長度為5,小數點末尾2位並且小數點不算在長度內;定義欄位為hobby為整型4個位元組,不為空)

desc info;(檢視info的表結構)
在這裡插入圖片描述

insert into info (name,score,hobby) values (‘zhangsan’,88,1),(‘lisi’,77,2),(‘wangwu’,66,1),(‘zhaoliu’,66,3),(‘tianqi’,90,2);(在info表中插入資料,分別在欄位name,score,hobby中插入這些資料,要插入的資料與前面的欄位位置對應即可)
select * from info;(檢視info表中的資料)
在這裡插入圖片描述

這樣一個名為school資料庫下的名為info資料表就建立好了,並且在裡面添加了資料。






常用查詢

1.按關鍵字排序


·使用ORDER BY語句實現
·排序可針對一個或多個欄位
·ASC (升序排序,也是mysql預設的排序方式)
·DESC(降序排序)
·ORDER BY的語法結構:
SELECT column1,column2,… FROM table_name ORDER BY column1,column2,… ASC/DESC;
解釋:select 欄位 from 表名 order by 欄位 asc或者desc;

例:
查詢info表中按照score欄位降序排序的結果:
select * from info order by score desc;

在這裡插入圖片描述
注:mysql中的預設排序方式是ASC升序排序,不加DESC的話會按照升序排序的結果輸出。


查詢info表中id,hobby欄位,按照hobby降序排序後,再按照id降序排序:
select id,hobby from info order by hobby desc,id desc;
在這裡插入圖片描述
注:當第一個欄位出現相同時,第二個欄位才有意義,否則第二個欄位是沒有意義的。




2.對結果進行分組
·使用GROUP BY實現分組
·通常結合聚合函式一起使用
·可以按一個或多個欄位對結果進行分組
·GROUP BY的語法結構:
SELECT aggregate_function(column_name) FROM table_name WHERE column_name operator value GROUP BY column_name;
解釋:
select 聚合函式(欄位名) from 表名 where(條件) 欄位名 條件句 group by 欄位名

例:
統計info表中欄位名為name的個數按照欄位名為hobby進行分組(預設是升序排序,在後面加上desc會變成降序排序):
select count(name),hobby from info group by hobby;
在這裡插入圖片描述


現在插入一條記錄:
insert into info (name,score,hobby) values (‘wangba’,50,2);
在這裡插入圖片描述


將group by 與 order by 結合使用:
例:
統計info表中欄位名為name的個數按照欄位名為hobby進行分組,並且將統計的結果按照統計name的數量進行降序排序:
select count(name),hobby from info group by hobby order by count(name) desc;
在這裡插入圖片描述




3.限制結果條目
·只返回SELECT查詢結果的第一行或前幾行
·使用LIMIT語句限制條目
·LIMIT的語法結構:
SELECT column1,column2,… FROM table_name LIMIT [offset,] number;
解釋:
select 欄位 from 表名 limit [位置偏移量,從0開始] 返回記錄行的最大數目

例:
查詢info表中按照score降序排序的前三行,並且輸出id、name、score記錄:
select id,name,score from info order by score desc limit 3;
在這裡插入圖片描述


查詢info表中按照score降序排序,輸出id、name、score記錄,從第三個開始的三行記錄:
select id,name,score from info order by score desc limit 2,3;
(下圖中作了對比)
在這裡插入圖片描述




4.設定別名
·當表的名字較長或者表內某些欄位較長時,為了省事以便多次使用相同的表時,可以給欄位列或表設定別名,使其簡潔明瞭。
·AS的語法結構:
SELECT column_name As alias_name FROM table_name;
解釋:
select 欄位名 as 別名 from 表名
(AS作為設定別名時可以省略,比如可以直接select 欄位名 別名 from 表名)

例:
輸出info表中hobby欄位的記錄並將hobby設定別名為hb:
select hobby as hb from info;
在這裡插入圖片描述


例:
將info表中name設定別名為姓名,score設定別名為分數,輸出查詢結果:
select name as 姓名,score as 分數 from info;
在這裡插入圖片描述

當然,修改的欄位的別名不會改變欄位的原名:
在這裡插入圖片描述

例:
對info表設定別名為i並對其中的name、score欄位分別設定姓名、成績別名,輸出查詢結果:
在這裡插入圖片描述



·AS作為連線語句:
create table tmp as select * from info;
解釋:
建立一個數據表名為tmp,匯入info表的記錄,匯入的表結構、資料型別相同,但不會匯入擴充套件屬性。

例:
建立一個名為tmp的資料表並匯入info表中score大於等於80的記錄;
在這裡插入圖片描述
可以看到沒有匯入主鍵和附加項(自增)。




根據條件從info匯入tmp表內的記錄:
在這裡插入圖片描述




5.萬用字元
·用於替換字串中的部分字元
·通常配合LIKE(模糊查詢時用到)一起使用,並協同WHERE完成查詢
·常用萬用字元:
%表示零個、一個或多個
_表示單個字元
·兩者可結合使用

例:
查詢info表中name欄位以z開頭的所有記錄:
select * from info where name like ‘z%’;
在這裡插入圖片描述

例:
查詢info表中name欄位四個位元組,四個位元組中第一位是l,第三位是s的所有記錄:
select * from info where name like ‘l_s_’;
在這裡插入圖片描述

例:
查詢info表中name欄位中第一位為任意1個字元,第二位是h,第三位是a,後面為0個或多個的所有記錄:
select * from info where name like ‘_ha%’;
在這裡插入圖片描述



6.子查詢
·也稱作內查詢或者巢狀查詢
·先於主查詢被執行,其結果將作為外層主查詢的條件
·在增刪改查中都可以使用子查詢
·支援多層巢狀
·IN語句是用來判斷某個值是否在給定的結果集中

例:
查詢info表中score大於等於70的name、hobby欄位的記錄:
select name,hobby from info where id in (select id from info where score>=70);
在這裡插入圖片描述解析:
(1)括號中子查詢:查詢info表中score大於等於70的結果
(2)這個結果作為查詢條件
(3)輸出這些結果的name、hobby的記錄




例:
truncate table tmp;(清除tmp表內所有記錄)
將info表中score大於等於70的所有資訊插入tmp表;
insert into tmp select * from info where id in (select id from info where score>=70);
在這裡插入圖片描述

例:
修改為tmp表設定別名為a並查詢表中score大於等於70的結果,並修改score欄位的所有記錄,每個記錄減少10:
update tmp set score = score - 10 where id in (select a.id from (select id from tmp where score>=70)a); (這裡設定別名a時省略了AS)
在這裡插入圖片描述

例:
為tmp表設定別名為a,查詢tmp表中score為80的記錄並將其刪除:
delete from tmp where id in (select a.id from (select id from tmp where score=80)a);
在這裡插入圖片描述

例:
查詢tmp中name為lisi的id欄位的記錄,如果name中存在lisi,則輸出tmp表中id數量的查詢結果(EXISTS是存在的意思,其作用是如果後面的結果為真,則滿足這個條件):
select count(*) as id from tmp where EXISTS (select id from tmp where name=‘lisi’);
在這裡插入圖片描述

例:
查詢info表中zhangsan的id如果與tmp表中的zhangsan的id相同,則輸出tmp中zhangsan的id、name、score欄位的記錄:
select id,name,score from tmp where id = (select id from info where name=’zhangsan’);
在這裡插入圖片描述

例:
子查詢間count(*)與exists結合使用,exists看後面的結果是否為真,如果為真,輸出前面的查詢結果;如果exists後面的結果為假,則不執行前面的語句。
在這裡插入圖片描述






7.NULL值
·表示缺失的值
·與數字0或空白(spaces)是不同的
·使用IS NULL或IS NOT NULL進行判斷
·NULL值和空值的區別:
(1)空值長度為0,不佔空間;NULL值的長度為NULL,佔用空間
(2)IS NULL無法判斷空值
(3)空值使用“=”或“<>”處理
(4)COUNT()計算時,NULL會忽略,空值會加入計算


例:
在info表中新增名為addr的欄位並且設定為NULL:
在這裡插入圖片描述
例:
查詢在info表中向id為1、2、3的記錄中新增addr欄位的內容為IT的記錄,然後統計addr欄位的記錄數:
在這裡插入圖片描述
從結果中可以看到,六條記錄中有三條是NULL,而這三條沒有被統計到addr的記錄數量中。



例:
查詢info表中addr欄位為NULL的所有記錄,然後查詢info表中addr欄位不是NULL的所有記錄:
在這裡插入圖片描述






8.正則表示式
·根據指定的模式匹配記錄中符合要求的特殊字元
·使用REGEXP關鍵字指定匹配模式
·常用匹配模式:
在這裡插入圖片描述

例:
查詢info表中匹配name欄位以z為開頭的所有記錄:
select * from info where name regexp ‘^z’;
在這裡插入圖片描述







ASCII
ASCII ((American Standard Code for Information Interchange): 美國資訊交換標準程式碼)是基於拉丁字母的一套電腦編碼系統,主要用於顯示現代英語和其他西歐語言。它是最通用的資訊交換標準,並等同於國際標準ISO/IEC 646。ASCII第一次以規範標準的型別發表是在1967年,最後一次更新則是在1986年,到目前為止共定義了128個字元。
例:
a的ASCII碼是97,b的ASCII碼是98,…
A的ASCII碼是65,B的ASCII碼是66,…
數字0的ASCII碼是48







9.運算子
·對記錄中的欄位值進行運算
·MySQL的運算子共有四種:算術運算子、比較運算子、邏輯運算子、位運算子

(1)算數運算子
+ 加法
- 減法
* 乘法
\ 除法
% 取餘


(2)比較運算子
在這裡插入圖片描述

(3)邏輯運算子
在這裡插入圖片描述

(4)位運算子
在這裡插入圖片描述





例:
在這裡插入圖片描述

·在除法運算和取餘運算中,除數不能為0,若除數為0,返回的結果為NULL
·如果有多個運算子,按照先乘除後加減的優先順序進行運算,相同優先順序的運算子沒有先後順序
·某些字串型別的欄位儲存的數字型字串,在進行算數運算時會被動轉換為ASCII碼
·字元與數字混合的字串在無法轉換為數字時會被轉換為0




例:
在這裡插入圖片描述
·如果兩者都是整數,則按照整數值進行比較
·如果一個整數一個字串,則會自動將字串轉換為數字進行比較
·如果兩者都是字串,則按照字串進行比較
·如果兩者中至少有一個值是NULL,則比較的結果是NULL




例:
在這裡插入圖片描述

例:
在這裡插入圖片描述

例:
在這裡插入圖片描述




例:
在這裡插入圖片描述
·IS NULL判斷一個值是否為NULL,如果為NULL返回1,否則返回0
·IS NOT NULL 判斷一個值是否不為NULL,如果不為NULL返回1,否則返回0




例:
在這裡插入圖片描述
·BETWEEN AND 比較運算通常用於判斷一個值是否在某個區間,如果大於等於這個區間的最小值且小於等於這個區間的最大值,則返回1,否則返回0




例:
在這裡插入圖片描述
·LEAST:當有兩個或者多個引數時,返回其中的最小值。如果其中一個值為 NULL,則返回結果為 NULL
·GREATEST:當有兩個或者多個引數時,返回其中的最大值。如果其中一個值為 NULL, 則返回結果為 NULL




例:
在這裡插入圖片描述
·IN:判斷一個值是否在對應的列表中,如果是返回 1,否則返回 0
·NOT IN:判斷一個值是否不在對應的列表中,如果不是返回 1,否則返回 0




例:
在這裡插入圖片描述
·LIKE:用來匹配字串,如果匹配成功則返回 1,反之返回 0
·NOT LIKE 與 LIKE 相反,如果沒有匹配成功則返回 1,反之返回 0
·LIKE 支援兩種萬用字元:’%’ 用於匹配任意數目的字元,而’_’只能匹配一個字元




一些其他的注意點:
在這裡插入圖片描述

在這裡插入圖片描述

在這裡插入圖片描述

在這裡插入圖片描述







10.連線查詢
MySQL 的連線查詢,通常都是將來自兩個或多個表結合起來,基於這些表之間的共同欄位,進行資料的拼接。首先,要確定一個主表作為結果集,然後將其他表有選擇性的連線到選定的主表結果集上。使用較多的連線查詢包括:內連線、左連線和右連線。



(1)內連線
·兩張或多張表中同時符合某種條件的資料記錄組合
·如果沒有匹配項,則不會輸出結果
·FROM子句中使用INNER JOIN關鍵字連線多張表,並使用ON設定連線條件
·是系統預設的表連線方式,可以省略INNER關鍵字
·多表支援連續使用INNER JOIN,建議不超過三個表
·語法結構:
SELECT column_name(s) FROM table1 INNER JOIN table2 ON table1.column_name = table2.column_name;
解釋:
select 欄位名 from 表1 inner join 表2 on 表1.欄位名 = 表2.欄位名;



例:
這裡有兩張表分別是info表和hob表,它們的hobby欄位的記錄相同,現在將他們做內連線:
在這裡插入圖片描述

select info.id,info.name,hob.hob_name from info inner join hob on info.hobby=hob.hobby;
在這裡插入圖片描述



(2)左連線
·又稱為左外連線
·在FROM子句中使用LEFT JOIN關鍵字來表示
·匹配左表中所有行及右表中符合條件的行
·原理:
在這裡插入圖片描述


例:
將info與hob表連線起來,顯示info表符合查詢條件的記錄,同時一起顯示hob表中符合查詢條件的記錄,拼成一張表顯示,(name和score是info表的,hob_name是hob表的):
在這裡插入圖片描述



(3)右連線
·也被稱為右外連線
·在FROM子句中使用RIGHT JOIN關鍵字來表示
·匹配右表中所有行及左表中符合條件的行
·實現原理:
在這裡插入圖片描述



例:
將info與hob表連線起來,顯示hob表符合查詢條件的記錄,同時一起顯示info表中符合查詢條件的記錄,拼成一張表顯示(這裡就不新建表了):
在這裡插入圖片描述






資料庫函式

常用的函式分類:
·數學函式
·聚合函式
·字串函式
·日期時間函式

(1)數學函式
在這裡插入圖片描述

例:
在這裡插入圖片描述

在這裡插入圖片描述

例:
在這裡插入圖片描述

例:
在這裡插入圖片描述



(2)聚合函式
·對錶中的資料記錄進行集中概括
·常用的聚合函式:
在這裡插入圖片描述


例:
在這裡插入圖片描述



(4)字串函式
·常用的字串函式:
在這裡插入圖片描述

例:
在這裡插入圖片描述
在這裡插入圖片描述

在這裡插入圖片描述

在這裡插入圖片描述

在這裡插入圖片描述

在這裡插入圖片描述
在這裡插入圖片描述

在這裡插入圖片描述

在這裡插入圖片描述

在這裡插入圖片描述
在這裡插入圖片描述

在這裡插入圖片描述

(5)日期時間函式
·常用的日期時間函式:

在這裡插入圖片描述

例:
在這裡插入圖片描述

在這裡插入圖片描述

在這裡插入圖片描述
在這裡插入圖片描述

在這裡插入圖片描述
在這裡插入圖片描述

在這裡插入圖片描述






儲存過程
·是一組為了完成特定功能的SQL語句集合
·比傳統SQL速度更快、執行效率更高
·儲存過程的優點:
(1)執行一次後,會將生成的二進位制程式碼駐留緩衝區,提高執行效率
(2)SQL語句加上控制語句的集合,靈活性高
(3)在伺服器端儲存,客戶端呼叫時,降低網路負載
(4)可多次重複被呼叫,可隨時修改,不影響客戶端呼叫
(5)可完成所有的資料庫操作,也可控制資料庫的資訊訪問許可權




建立儲存過程
·使用CREATE PROCEDURE語句建立儲存過程
·建立儲存過程的語法結構:
CREATE PROCEDURE <過程名> ([過程引數[,…]]) <過程體> [過程引數[,…]] 格式 [ IN|OUT|INOUT] <引數名> <型別>
·引數分為:
(1)輸入引數:IN
(2)輸出引數:OUT
(3)輸入/輸出引數:INOUT
·儲存過程的主題部分,被稱為過程體
·以BEGIN開始,以END結束,若只有一條SQL語句,則可以省略BEGIN-END
·以DELIMITER開始和結束
格式:
DELIMITER$$ ($$是使用者自定義的結束符)
(中間過程)
DELIMITER ; (分號前面有空格)



·不帶引數的儲存過程:
在這裡插入圖片描述




修改儲存過程
·儲存過程的修改分為特徵修改和內容修改
·特徵修改的方法:
ALTER PROCEDURE <過程名> [<特徵> …]
·內容修改可先刪除原有儲存過程,之後再建立的方法



刪除儲存過程
·刪除儲存過程的語法
DROP { PROCEDURE | FUNCTION } [ IF EXISTS ] <過程名>
·刪除的具體用法
DROP PROCEDURE PlayerRole;
(提示資訊:Query OK,0 rows affected (0.00 sec))
CALL Playerole;
(提示資訊:ERROR 1305(42000):PROCEDURE test.PlayerRole does not exist)