7種SQL的進階用法

1.自定義排序(ORDER BY FIELD)

在MySQL中ORDER BY排序除了可以用ASC和DESC之外,還可以使用自定義排序方式來實現。

CREATE TABLE movies (  id INT PRIMARY KEY AUTO_INCREMENT,  movie_name VARCHAR(255),  actors VARCHAR(255),  price DECIMAL(10, 2) DEFAULT 50,  release_date DATE  
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;INSERT INTO movies (movie_name, actors, price, release_date) VALUES
('咱們結婚吧', '靳東', 43.2, '2013-04-12'),
('四大名捕', '劉亦菲', 62.5, '2013-12-21'),
('獵場', '靳東', 68.5, '2017-11-03'),
('芳華', '范冰冰', 55.0, '2017-09-15'),
('功夫瑜伽', '成龍', 91.8, '2017-01-28'),
('驚天解密', '靳東', 96.9, '2019-08-13'),
('銅雀臺', null, 65, '2025-12-16'),
('天下無賊', '劉亦菲', 44.9, '2004-12-16'),
('建國大業', '范冰冰', 70.5, '2009-09-21'),
('賽爾號4:瘋狂機器城', '范冰冰', 58.9, '2021-07-30'),
('花木蘭', '劉亦菲', 89.0, '2020-09-11'),
('警察故事', '成龍', 68.0, '1985-12-14'),
('神話', '成龍', 86.5, '2005-12-22');

用法如下:

select * from movies order by movie_name asc;select * from movies ORDER BY FIELD(movie_name,'神話','獵場','芳華','花木蘭',
'銅雀臺','警察故事','天下無賊','四大名捕','驚天解密','建國大業',
'功夫瑜伽','咱們結婚吧','賽爾號4:瘋狂機器城');

在這里插入圖片描述

2.空值NULL排序(ORDER BY IF(ISNULL))

在MySQL中使用ORDER BY關鍵字加上我們需要排序的字段名稱就可以完成該字段的排序。如果字段中存在NULL值就會對我們的排序結果造成影響。
這時候我們可以使用 ORDER BY IF(ISNULL(字段), 0, 1) 語法將NULL值轉換成0或1,實現NULL值數據排序到數據集前面還是后面。

select * from movies ORDER BY actors, price desc;select * from movies ORDER BY if(ISNULL(actors),0,1), actors, price;

在這里插入圖片描述

3.CASE表達式(CASE···WHEN)

在實際開發中我們經常會寫很多if ··· else if ··· else,這時候我們可以使用CASE···WHEN表達式解決這個問題。
以學生成績舉例。比如說:學生90分以上評為優秀,分數80-90評為良好,分數60-80評為一般,分數低于60評為“較差”。那么我們可以使用下面這種查詢方式:

CREATE TABLE student (student_id varchar(10) NOT NULL COMMENT '學號',sname varchar(20) DEFAULT NULL COMMENT '姓名',sex char(2) DEFAULT NULL COMMENT '性別',age int(11) DEFAULT NULL COMMENT '年齡',score float DEFAULT NULL COMMENT '成績',PRIMARY KEY (student_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='學生表';INSERT INTO student (student_id, sname, sex, age , score)
VALUES ('001', '張三', '男', 20,  95),('002', '李四', '女', 22,  88),('003', '王五', '男', 21,  90),('004', '趙六', '女', 20,  74),('005', '陳七', '女', 19,  92),('006', '楊八', '男', 23,  78),('007', '周九', '女', 20,  55),('008', '吳十', '男', 22,  91),('009', '劉一', '女', 21,  87),('010', '孫二', '男', 19,  60);
select *,case when score > 90 then '優秀'when score > 80 then '良好'when score > 60 then '一般'else '較差' end level
from student;

在這里插入圖片描述

4.分組連接函數(GROUP_CONCAT)

分組連接函數可以在分組后指定字段的字符串連接方式,并且還可以指定排序邏輯;連接字符串默認為英文逗號。
比如說根據演員進行分組,并將相應的電影名稱按照票價進行降序排列,而且電影名稱之間通過“_”拼接。用法如下:

select actors,
GROUP_CONCAT(movie_name),
GROUP_CONCAT(price) from movies GROUP BY actors;select actors,
GROUP_CONCAT(movie_name order by price desc SEPARATOR '_'),
GROUP_CONCAT(price order by price desc SEPARATOR '_') 
from movies GROUP BY actors;

在這里插入圖片描述

5.分組統計數據后再進行統計匯總(with rollup)

在MySql中可以使用 with rollup在分組統計數據的基礎上再進行數據統計匯總,即將分組后的數據進行匯總。

SELECT actors, SUM(price) FROM movies GROUP BY actors;SELECT actors, SUM(price) FROM movies GROUP BY actors WITH ROLLUP;

在這里插入圖片描述

6.子查詢提取(with as)

如果一整句查詢中多個子查詢都需要使用同一個子查詢的結果,那么就可以用with as將共用的子查詢提取出來并取一個別名。后面查詢語句可以直接用,對于大量復雜的SQL語句起到了很好的優化作用。
需求:獲取演員劉亦菲票價大于50且小于65的數據。

with m1 as (select * from movies where price > 50),m2 as (select * from movies where price >= 65)
select * from m1 where m1.id not in (select m2.id from m2) and m1.actors = '劉亦菲';

在這里插入圖片描述

7.優雅處理數據插入、更新時主鍵、唯一鍵重復

在MySql中插入、更新數據有時會遇到主鍵重復的場景,通常的做法就是先進行刪除在插入達到可重復執行的效果,但是這種方法有時候會錯誤刪除數據。
1.插入數據時我們可以使用IGNORE,它的作用是插入的值遇到主鍵或者唯一鍵重復時自動忽略重復的數據,不影響后面數據的插入,即有則忽略,無則插入。示例如下:

select * from movies where id >= 13;INSERT INTO movies (id, movie_name, actors, price, release_date) VALUES
(13, '神話', '成龍', 100, '2005-12-22');INSERT IGNORE INTO movies (id, movie_name, actors, price, release_date) VALUES
(13, '神話', '成龍', 100, '2005-12-22');INSERT IGNORE INTO movies (id, movie_name, actors, price, release_date) VALUES
(14, '神話2', '成龍', 114, '2005-12-22');

2.還可以使用REPLACE關鍵字,當插入的記錄遇到主鍵或者唯一鍵重復時先刪除表中重復的記錄行再插入,即有則刪除+插入,無則插入,示例如下:

REPLACE INTO movies (id, movie_name, actors, price, release_date) VALUES
(14, '神話2', '成龍', 100, '2005-12-22');REPLACE INTO movies (id, movie_name, actors, price, release_date) VALUES
(15, '神話3', '成龍', 115, '2005-12-22');

在這里插入圖片描述

3.更新數據時使用on duplicate key update。它的作用就是當插入的記錄遇到主鍵或者唯一鍵重復時,會執行后面定義的UPDATE操作。相當于先執行Insert 操作,再根據主鍵或者唯一鍵執行update操作,即有就更新,沒有就插入。示例如下:


INSERT INTO movies (id, movie_name, actors, price, release_date) VALUES
(15, '神話3', '成龍', 115, '2005-12-22') on duplicate key update price = price + 10;INSERT INTO movies (id, movie_name, actors, price, release_date) VALUES
(16, '神話4', '成龍', 75, '2005-12-22') on duplicate key update price = price + 10;

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/160432.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/160432.shtml
英文地址,請注明出處:http://en.pswp.cn/news/160432.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基于鵜鶘算法優化概率神經網絡PNN的分類預測 - 附代碼

基于鵜鶘算法優化概率神經網絡PNN的分類預測 - 附代碼 文章目錄 基于鵜鶘算法優化概率神經網絡PNN的分類預測 - 附代碼1.PNN網絡概述2.變壓器故障診街系統相關背景2.1 模型建立 3.基于鵜鶘優化的PNN網絡5.測試結果6.參考文獻7.Matlab代碼 摘要:針對PNN神經網絡的光滑…

基于向量加權平均算法優化概率神經網絡PNN的分類預測 - 附代碼

基于向量加權平均算法優化概率神經網絡PNN的分類預測 - 附代碼 文章目錄 基于向量加權平均算法優化概率神經網絡PNN的分類預測 - 附代碼1.PNN網絡概述2.變壓器故障診街系統相關背景2.1 模型建立 3.基于向量加權平均優化的PNN網絡5.測試結果6.參考文獻7.Matlab代碼 摘要&#xf…

win10系統中,任務欄卡住,鼠標移動到任務欄轉圈加載中

原因: 1.系統更新導致的問題 2.任務欄的“資訊與興趣導致” 解決: 方法一:重新啟動資源管理器任務 1.快捷鍵調出任務管理器:ctrlshiftesc,或ctrlaltdel 1.1.找到“windows資源管理器,鼠標右鍵,選擇重…

邊云協同架構設計

文章目錄 一. "邊云協同"是什么?二. "邊云協同"主要包括6種協同2.1 資源協同2.2 數據協同2.3 智能協同2.4 應用管理協同2.5 業務管理協同2.6 服務協同 三. "邊云協同"的優勢 其它相關推薦: 系統架構之微服務架構 系統架構…

python文本

文本 除了數字 Python 還可以操作文本(由 str 類型表示,稱為“字符串”)。 這包括字符 "!", 單詞 "rabbit", 名稱 "Paris", 句子 "Got your back." 等等. "Yay! :)"。 它們可以用成對的單…

【JS】Chapter15-高階技巧

站在巨人的肩膀上 黑馬程序員前端JavaScript入門到精通全套視頻教程,javascript核心進階ES6語法、API、js高級等基礎知識和實戰教程 (十五)高階技巧 1. 深淺拷貝 開發中我們經常需要復制一個對象。如果直接用賦值會有下面問題:/…

微信訂房功能怎么做_公眾號里怎么實現在線訂房系統

微信公眾號在線訂房系統:一鍵解決您的住宿問題 在當今數字化時代,微信公眾號已經成為人們生活中不可或缺的一部分。它提供了各種各樣的功能和服務,讓我們的生活變得更加便捷和高效。而如今,微信公眾號也實現了在線訂房功能&#…

什么是應急演練腳本?其設計原則是什么?

應急演練腳本是一種系統性、有計劃的模擬性文件,旨在測試和評估組織在緊急情況下的應對能力。這種腳本提供了一系列步驟和場景,以確保團隊能夠高效、協調地應對各種緊急事件。以下將詳細探討應急演練腳本的定義、設計原則以及實施過程。 一、應急演練腳本…

常見面試題-Redis持久化策略

談談Redis 的持久化策略? 參考文章: Redis 持久化機制演進與百度智能云的實踐 Redis的確是將數據存儲在內存的,但是也會有相關的持久化機制將內存持久化備份到磁盤,以便于重啟時數據能夠重新恢復到內存中,避免數據丟…

【Python 千題 —— 基礎篇】奇數列表

題目描述 題目描述 創建奇數列表。使用 for 循環創建一個包含 20 以內奇數的列表。 輸入描述 無輸入。 輸出描述 輸出創建的列表。 示例 示例 ① 輸出: 創建的奇數列表為: [1, 3, 5, 7, 9, 11, 13, 15, 17, 19]代碼講解 下面是本題的代碼: #…

9. 回文數 --力扣 --JAVA

題目 給你一個整數 x ,如果 x 是一個回文整數,返回 true ;否則,返回 false 。 回文數是指正序(從左向右)和倒序(從右向左)讀都是一樣的整數。 例如,121 是回文&#xff0…

二、爬蟲-爬取肯德基在北京的店鋪地址

1、算法框架解釋 針對這個案例,現在對爬蟲的基礎使用做總結如下: 1、算法框架 (1)設定傳入參數 ~url: 當前整個頁面的url:當前頁面的網址 當前頁面某個局部的url:打開檢查 ~data:需要爬取數據的關鍵字&…

DB2中實現數據字段的拼接(LISTAGG() 與 xml2clob、xmlagg)

DB2中實現數據字段拼接(LISTAGG 與 xml2clob、xmlagg) 1. 使用函數LISTAGG()1.1 同oracle實現方式1.2 DB2中使用LISTAGG()1.2.1 關于DB2版本1.2.2 數據準備1.2.3 代碼實現 2 解決DB2中關于 LISTAGG() 超長問題2.1 使用xmlagg xmlelement2.2 將xml標簽去…

數據結構與算法編程題11

已知兩個鏈表A和B分別表示兩個集合&#xff0c;其元素遞增排列。 請設計算法求出A與B的交集&#xff0c;并存放于A鏈表中。 a: 1, 2, 2, 4, 5, 7, 8, 9, 10 b: 1, 2, 3, 6, 7, 8 #include <iostream> using namespace std;typedef int Elemtype; #define ERROR 0; #defin…

【iOS】實現評論區展開效果

文章目錄 前言實現行高自適應實現評論展開效果解決cell中的buttom的復用問題 前言 在知乎日報的評論區中&#xff0c;用到了Masonry行高自適應來實現評論的展開&#xff0c;這里設計許多控件的約束問題&#xff0c;當時困擾了筆者許久&#xff0c;特此撰寫博客記錄 實現行高自…

如何構建更簡潔的前端架構?

目錄 為什么需要前端架構&#xff1f; 那么&#xff0c;前端架構是什么樣的呢&#xff1f; 使用了哪些層&#xff1f; 那么&#xff0c;這種架構會出什么問題呢&#xff1f; 我們應該如何避免這些錯誤&#xff1f; 哪些原則應適用于組件&#xff1f; Anti-Patterns 反模…

小程序存在優惠卷遍歷,但是歪了

進入小程序&#xff0c;因為是一個小商城&#xff0c;所以照例先查看收貨地址是否存在越權&#xff0c;以及能否未授權訪問&#xff0c;但是發現不存在這些問題&#xff0c;所以去查看優惠卷 進入領券中心&#xff0c;點擊領取優惠券時抓包 發現數據包&#xff0c;存在敏感參數…

數據庫的級聯刪除

級聯刪除是指在數據庫中刪除一個對象時&#xff0c;與該對象有關的其他對象也被自動刪除。在 Django 中&#xff0c;級聯刪除通常通過在模型中定義外鍵時使用 on_delete 參數來實現。以下是一些常見的 on_delete 選項&#xff1a; 1.models.CASCADE: 當關聯的對象被刪除時&…

CentOS 7 使用Fmt庫

安裝 fmt Git下載地址&#xff1a;https://github.com/fmtlib/fmt 步驟1&#xff1a;首先&#xff0c;你需要下載fmt的源代碼。你可以從https://github.com/fmtlib/fmt或者源代碼官方網站下載。并上傳至/usr/local/source_code/ ? 步驟2&#xff1a;下載完成后&#xff…

【Docker】Docker安裝Nginx配置靜態資源

1.下載鏡像 2.創建nginx配置文件 3.創建nginx容器運行 4.配置nginx靜態資源 1.下載鏡像 Dockerhub官網&#xff1a;Docker docker pull nginx docker pull nginx下載最新版本 默認latest 下載指定版本docker pull nginx:xxx 2.創建nginx配置文件 啟動容器之前要創建nginx…