【MySQL篇】MySQL基本查詢詳解

目錄

前言:?

1,Create

1.1,單行數據+全列插入?

1.2,單行數據+指定列插入?

?1.3,多行數據+全列插入

1.4,多行數據+指定列插入?

1.5,插入否則更新?

1.6,替換

2,Retrieve (讀取)

2.1,全列查詢

2.2,指定列查詢

2.3,查詢字段為表達式

?2.4,為查詢結果指定別名

2.5,結果去重?

2.6,where條件?

2.7,結果排序?

?2.8,篩選分頁結果

3,Update?

4,Delete?

4.1,刪除數據

?4.2,刪除整張表

?4.3,截斷表

5, 插入查詢結果

6,聚合函數?

7,group by子句的使用?

?結語:


前言:?

本篇主要講述對于表內容的增刪查改及相關查詢語句:
CRUD : Create(創建), Retrieve(讀取)Update(更新)Delete(刪除)


1,Create

語法:

insert into 表名? (指定列)?values? (values1,values2,...)

示例:

  • ?創建一張學生表

mysql> create table students(
? ? -> id int unsigned primary key auto_increment,
? ? -> sn int not null unique comment '學號',
? ? -> name varchar(20) not null,
? ? -> qq varchar(20) unique);

1.1,單行數據+全列插入?

  • 插入數據

注意在這里插入的時候也可以不指明id,因為我們定義了auto_increment屬性,mysql會使用默認的值自增。

mysql> insert into students values (1,101,'張三',1111);

mysql> insert into students values (2,102,'李四',11222);

  • 查看插入結果?

select * from students;

1.2,單行數據+指定列插入?

  • ?指定列插入數據

mysql> insert into students ?(sn,name,qq) values (103,'李四',11333);
mysql> insert into students (id,sn,name) values (10,104,'王五');

?1.3,多行數據+全列插入

mysql> insert into students values (20,105,'趙六',2222) ,(21,106,'田七',3333);

1.4,多行數據+指定列插入?

mysql> insert into students (sn,name) values (116,'北京'),(117,'上海');

1.5,插入否則更新?

在插入數據的時候,由于主鍵和唯一鍵的存在,可能導致插入的數據已經存在而插入失敗。

如果需要更新,可以進行更新操作。也就是在插入數據時,如果不存在就直接插入,如果存在,發生沖突了,就將原來的數據更新為插入的數據。這個和STL中的unordered_map類似,在使用[ ]的時候,如果存在就更新,如果不存在就插入。

語法:

insert? ......? on duplicate key update? column=value[......]

示例:

mysql> insert into students values (1,101,'張三',55555) on duplicate key update id=1,sn=101,name='張三',qq=55555;

在更新的時候也要保證不和其他值沖突。?

1.6,替換

替換replace與上面的插入更新類似,如果數據存在就替換,如果數據不存在就直接插入。

mysql> replace into students (sn,name) values (120,'廣州');//不存在直接插入

mysql> replace into students (id,sn,name,qq) ?values (1,101,'蘇州',99999);//數據已經存在,則替換掉原數據

2,Retrieve (讀取)

首先創建一張學生成績表,作為示例

mysql> create table exam_result(
? ? -> id int unsigned primary key auto_increment,
? ? -> name varchar(20),
? ? -> chinese int,
? ? -> math int,
? ? -> english int);

向表中插入一些數據:

?mysql> insert into exam_result (name,chinese,math,english) values ('孫悟空',87,78,77);
?

mysql> insert into exam_result (name,chinese,math,english) values ('豬悟能',88,98,90);
?

mysql> insert into exam_result (name,chinese,math,english) values ('曹孟德',82,84,67);
?

mysql> insert into exam_result (name,chinese,math,english) values ('劉玄德',55,85,45);
?

mysql> insert into exam_result (name,chinese,math,english) values ('孫權',70,73,78);
?

mysql> insert into exam_result (name,chinese,math,english) values ('宋公明',75,65,30);?

2.1,全列查詢

?mysql> select * from exam_result;

通常情況 下不建議使用 * 進行全列查詢?

  • 查詢的列越多意味著需要傳輸的數據量越大;
  • 可能會影響到索引的作用。(索引在后面更新)

2.2,指定列查詢

select 篩選的列名稱 from 表名

示例:

mysql> select id,name,math from exam_result;
mysql> select id,name,chinese ?from exam_result;?

2.3,查詢字段為表達式

  • ?表達式不包含字段

mysql> select id,name,math,10 from exam_result;
mysql> select id,name,math,10+10 from exam_result;

?

  • 表達式中包含一個字段?

mysql> select id,name,math+10 from exam_result;

  • 表達式中包含多個字段?

mysql> select id,name,math+chinese+english from exam_result;

?2.4,為查詢結果指定別名

select? column? [as] 別名 from 表名;

示例:?

mysql> select id,name,math+chinese+english as total from exam_result;
mysql> select id,name,math+chinese+english ?'總分'? from exam_result;

2.5,結果去重?

math列中的數據98重復了。

?去重,需要使用distinct

mysql> select distinct math from exam_result;

2.6,where條件?

前面講的select 用法,是用來篩選出哪些列,而接下來的這部分內容where條件,是篩選出滿足條件的行。?

比較運算符

  • >,>=,<,<=:大于,大于等于,小于,小于等于
  • =:等于,比較null值時不安全,比如null=null返回的結果是null
  • <=>:等于,比較null值時是安全的,比如null=null返回的結果是1
  • !=,<>:不等于
  • between a0? and? a1:范圍匹配,[a0,a1],如果a0<=values<=a1,返回true(1)
  • in(option...):如果是option中的任意一個,返回true(1)
  • is null:是空
  • is not null:不是空
  • like:模糊匹配。%表示任意多個字符(包括0個),_表示任意一個字符

邏輯運算符?

  • and:多個條件必須都為true,結果才為true
  • or:只要有一個條件為true,結果就為true
  • not:如果條件為true(1),結果就為false(0)?

null和null的比較,=和<=>的比較:

?

使用案例:?

  • 英語成績不及格的同學及英語成績(<60)

mysql> select name,english from exam_result where english<60;

  • ?語文成績在[80,90]的同學及語文成績

mysql> select name,chinese from exam_result where chinese>=80 and chinese<=90;
mysql> select name,chinese from exam_result where chinese between 80 and 90;

  • 數學成績是58或者59或者98或者99的同學及數學成績?

mysql> select name,math from exam_result where math=58 or math=59 or math=98 or math=99;
mysql> select name,math from exam_result where math in (58,59,98,99);

?

  • 姓孫的同學

mysql> select name from exam_result where name like '孫%';

  • 孫某同學?

mysql> select name from exam_result where name like '孫_';

  • 語文成績好于英語成績的同學?

//where條件中比較運算符兩側都是字段

mysql> select name,chinese,english from exam_result where chinese>english;

  • 總分在200分以下的同學?

mysql> select name,math+chinese+english from exam_result where math+chinese+english<200;

?

前面在select內容部分,我們可以為查詢結果math+chinese+english取別名。但在where子句中是否可以使用別名呢?

可以看到是不能使用的。這和mysql的執行順序有關。?

?總結:先確定操作哪張表,再根據where子句的條件篩選出我們想要的數據,最后再顯示出來。

?所以在where子句中不能使用別名,但在select中仍然可以使用。

  • ?語文成績>80并且不姓孫的同學

mysql> select name,chinese from exam_result where chinese>80 and name not like '孫%';

  • 孫某同學,或者總成績>200并且語文成績<數學成績并且英語成績>80

mysql> select name,chinese,math,english,chinese+math+english '總分' from exam_result where name like '孫_' or (chinese+math+english>200 and chinese<math and english>80);

2.7,結果排序?

語法:

---ASC?升序(從小到大)

---DESC 降序(從大到小)

---默認為ASC

select ...... from table_name [where...]? order by column [ASC|DESC];

注意:null視為比任何值都小?

案例:

  • 查詢同學及數學成績,數學成績按照升序顯示

mysql> select name,math from exam_result order by math;

  • 查詢同學各門成績,依次按數學降序,英語升序,語文升序的方式顯示

mysql> select name,math,english,chinese from exam_result order by math desc,english,chinese;

?

  • 查詢同學及總分, 由高到低

mysql> select name,math+chinese+english from exam_result order by chinese+math+english desc;

?

order by 子句可以使用別名?

mysql> select name,math+chinese+english '總分' from exam_result order by 總分?desc;

?

在這里為什么可以使用別名了呢?同樣這和mysql的子句執行順序有關。

總結:首先我們需要確定操作哪張表,如果第二步就執行排序,其實表中有一部分數據是不需要進行排序的,?這樣做太浪費時間和空間了。所以先確定操作哪張表,再根據where子句條件篩選出來我們要的數據,這時的數據一定是被篩選出來的有價值的數據,這時我們只是選出來數據了,不給顯示出來,最后經過排序,再將數據顯示出來。

因此執行ordere by時,別名已經定義了,所以可以使用。

?2.8,篩選分頁結果

語法:

----起始下標從0開始

---從0開始,篩選n條結果

select ......from table_name [where...]? [order by...] limit n;

---從s開始,篩選n條結果

select ......from table_name [where...]? [order by...] limit s,n;

---從s開始,篩選n條結果,和第二種方法表示一樣

select ......from table_name [where...]? [order by...] limit n offset s;

注意:limit的執行順序比order by還要靠后?

?按id進行分頁,分別顯示第1,2,3頁

3,Update?

語法:

update table_name set column=expr [column=expr...]? [where...] [order by...] [limit...]

案例:?

  • 將孫悟空同學的數學成績變更為80

mysql> update exam_result set math=80 where name='孫悟空';

  • 將曹孟德同學的數學成績變更為60,語文成績變更為70?

mysql> update exam_result set math=60,chinese=70 where name='曹孟德';

  • 將總成績倒數前 3的同學的數學成績加上30分?

mysql> select name,math,chinese+math+english 總分 from exam_result order by 總分 limit 3;

?

4,Delete?

4.1,刪除數據

語法:

delete from table_name [where...] [order by...] [limit ...]

注意:如果delete from 表名,會將表的內容清空?

案例:

  • ?刪除孫悟空同學的考試成績

mysql> delete from exam_result where name='孫悟空';

?

?4.2,刪除整張表

  • 準備測試表

mysql> create table for_delete(
? ? -> id int primary key auto_increment,
? ? -> name varchar(20));

其中id有自增屬性。

  • 插入測試數據?

mysql> insert into for_delete values (1,'A'),(2,'B'),(3,'C');

  • 查看測試數據?

  • 刪除整張表 ,查看刪除結果

mysql> delete from for_delete;

mysql> select * from for_delete;

?

  • 刪除表之前id自增到3,現在插入一條新數據。?

mysql> insert into for_delete (name) values ('D');

可以發現在清空表后,id的自增值沒有變為0。可以通過show查看表結構。

mysql> show create table for_delete\G

?4.3,截斷表

語法:

truncate [table] table_name

注意:這個 操作慎用

1,這個操作只能對整張表使用,不能向delete一樣針對部分數據操作

2,不對數據操作,所以比delete快,但是truncate 在刪除數據的時候,并不經過正真的事務,所以無法回滾?

3,該操作與delete相比,它會重置auto_increment項

案例:

  • 準備測試表(和for_delete表屬性一樣)

mysql> create table for_truncate like for_delete;

  • 插入測試數據 ,查看測試數據?

mysql> insert into for_truncate values (1,'A'),(2,'B'),(3,'C');

mysql> select * from for_truncate;

?

  • 截斷整表數據,注意影響行數是0,所以實際上沒有對表真正操作

mysql> truncate table for_truncate;

  • ?查看刪除結果

mysql> select * from for_truncate;

  • 再插入 一條數據,自增id重新開始增長??

mysql> insert into for_truncate (name) values ('D');

  • 查看表結構?

mysql> show create table for_truncate \G

5, 插入查詢結果

語法:

insert into table_name [column...]? select ...

案例:刪除表中的重復記錄,重復數據只能有一份

  • ?創建原數據表

mysql> create table duplicate_table(
? ? -> id int,
? ? -> name varchar(20));

  • 插入測試數據?

mysql> insert into duplicate_table values ?(100,'aaa'), (100,'aaa'), (200,'bbb'), (200,'bbb'), (200,'bbb'), (300,'ccc');

思路:?

  • 創建一張空表no_duplicate_table,結構和duplicate_table一樣

mysql> create table no_duplicate_table like duplicate_table;

  • 將 duplicate_table數據去重插入到no_duolicate_table表中?

mysql> insert into no_duplicate_table select distinct * from duplicate_table;?

  • 通過重命名,做到原子的去重操作?

mysql> rename table duplicate_table to old_duplicate_table;

mysql> rename table no_duplicate_table to duplicate_table;

  • 查看最終結果?

6,聚合函數?

count():返回查詢到的數據的數量

sum():返回查詢到的數據的總和,不是數字沒有意義

avg():返回查詢到的數據的平均值,不是數字沒有意義

max():返回查詢到的數據的最大值,不是數字沒有意義

min():返回查詢到的數據的最小值,不是數字沒有意義

案例:

  • 統計班級共有多少學生

//使用*做統計

mysql> select count(*) from exam_result;

?

//使用表達式統計

mysql> select count(1) from exam_result;?

  • ?統計數學成績總分

mysql> select sum(math) from exam_result;

  • 統計平均總分?

?mysql> select avg(chinese+math+english) 平均總分 from exam_result;

  • ?統計數學成績中不重復的成績個數

mysql> select count(distinct math) 不重復的個數 from exam_result;

  • 返回英語最高分?

mysql> select max(english) from exam_result;

?

  • 返回>70分以上的最低分

?mysql> select min(math) from exam_result where math>70;

7,group by子句的使用?

在select 中使用group by子句可以對指定列進行分組查詢

select column1 column2... from table group by column

案例:

?準備工作,創建一個雇員信息數據庫:

  • emp員工表
  • dept部門表
  • salgrade工作等級表

  • 如何顯示每個部門的平均工資和最高工資?

mysql> select deptno,avg(sal),max(sal) from emp group by deptno;

總結:

分組,可以理解為把一張表按照條件在邏輯上分成了很多子表,然后分別對各自的子表進行聚合統計。

?分組聚合結果:

  • 顯示每個部門的每種崗位的 平均工資和最低工資

mysql> select job,deptno,avg(sal),min(sal) from emp ?group by job,deptno;

  • 顯示平均工資低于2000的部門和它的平均工資?

首先統計各個部門的平均工資

mysql> select deptno,avg(sal) from emp group by deptno;

having和group by配合使用,對group by的結果進行過濾

mysql> select deptno,avg(sal) 平均工資 from emp group by deptno having 平均工資<2000;?

having經常和group by搭配使用,作用是對分組進行篩選,作用有些像where?

?

?結語:

最后在這里再加曾經的一道面試題:

SQL查詢中各個關鍵字的執行順序:from>on>join>where>group by>with>having>select>distinct>order by>limit

下篇博主會再更新一些相關的實戰OJ題

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

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

相關文章

【Python入門】一篇掌握Python中的字典(創建、訪問、修改、字典方法)【詳細版】

&#x1f308; 個人主頁&#xff1a;十二月的貓-CSDN博客 &#x1f525; 系列專欄&#xff1a; &#x1f3c0;《Python/PyTorch極簡課》_十二月的貓的博客-CSDN博客 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻擋不了春天的腳步&#xff0c;十二點的黑夜遮蔽不住黎明的曙光 目…

每日一題——兩數相加

兩數相加 問題描述問題分析解題思路代碼實現代碼解析注意事項示例運行總結 問題描述 給定兩個非空鏈表&#xff0c;表示兩個非負整數。鏈表中的每個節點存儲一個數字&#xff0c;數字的存儲順序為逆序&#xff08;即個位在鏈表頭部&#xff09;。要求將這兩個數字相加&#xff…

制作自定義鏡像

1. 確定軟件包 確定自己的環境都需要哪些命令&#xff0c;然后&#xff0c;從鏡像文件或者yum源下載響應的安裝包。 bash基本是必選的 &#xff08;bash-5.1.8-10.oe2203sp2.aarch64.rpm&#xff09; vim也是有必要的 &#xff08;vim-enhanced-9.0-15.oe2203sp2.aarch64.rpm…

WHAT - 前端性能指標

目錄 核心 Web Vitals&#xff08;Core Web Vitals&#xff09;加載性能指標網絡相關指標交互和響應性能指標內存與效率指標推薦的監控工具優化策略與建議推薦學習路線 作為前端開發者&#xff0c;理解并掌握關鍵的性能指標對優化 Web 應用至關重要。 以下是前端性能優化中常見…

C++20 模塊:告別頭文件,迎接現代化的模塊系統

文章目錄 引言一、C20模塊簡介1.1 傳統頭文件的局限性1.2 模塊的出現 二、模塊的基本概念2.1 模塊聲明2.2 模塊接口單元2.3 模塊實現單元 三、模塊的優勢3.1 編譯時間大幅減少3.2 更好的依賴管理3.3 命名空間隔離 四、如何使用C20模塊4.1 編譯器支持4.2 示例項目4.3 編譯和運行…

Apache Hudi 性能測試報告

一、測試背景 數據湖作為一個集中化的數據存儲倉庫,支持結構化、半結構化以及非結構化等多種數據格式,數據來源包含數據庫數據、增量數據、日志數據以及數倉上的存量數據等。數據湖能夠將這些不同來源、不同格式的數據集中存儲和管理在高性價比的分布式存儲系統中,對外提供…

sql靶場5-6關(報錯注入)保姆級教程

目錄 sql靶場5-6關&#xff08;報錯注入&#xff09;保姆級教程 1.第五關 1.步驟一&#xff08;閉合&#xff09; 2.步驟二&#xff08;列數&#xff09; 3.報錯注入深解 4.報錯注入格式 5.步驟三&#xff08;數據庫表名&#xff09; 6.常用函數 7.步驟四&#xff08;表…

OSPF-單區域的配置

一、單區域概念&#xff1a; 單區域OSPF中&#xff0c;整個網絡被視為一個區域&#xff0c;區域ID通常為0&#xff08;骨干區域&#xff09;。所有的路由器都在這個區域內交換鏈路狀態信息。 補充知識點&#xff1a; OSPF為何需要loopback接口&#xff1a; 1.Loopback接口的…

LeetCode100之二叉樹的直徑(543)--Java

1.問題描述 給你一棵二叉樹的根節點&#xff0c;返回該樹的 直徑 。 二叉樹的 直徑 是指樹中任意兩個節點之間最長路徑的 長度 。這條路徑可能經過也可能不經過根節點 root 。 兩節點之間路徑的 長度 由它們之間邊數表示。 示例1 輸入&#xff1a;root [1,2,3,4,5] 輸出&#…

C語言每日一練——day_4

引言 針對初學者&#xff0c;每日練習幾個題&#xff0c;快速上手C語言。第四天。&#xff08;連續更新中&#xff09; 采用在線OJ的形式 什么是在線OJ&#xff1f; 在線判題系統&#xff08;英語&#xff1a;Online Judge&#xff0c;縮寫OJ&#xff09;是一種在編程競賽中用…

工作流編排利器:Prefect 全流程解析

工作流編排利器&#xff1a;Prefect 全流程解析 本文系統講解了Prefect工作流編排工具&#xff0c;從基礎入門到高級應用&#xff0c;涵蓋任務與流程管理、數據處理、執行器配置、監控調試、性能優化及與其他工具集成等內容&#xff0c;文末項目實戰示例&#xff0c;幫助讀者全…

Web Workers 客戶端 + 服務端應用

一. Web Workers 客戶端應用 使用 JavaScript 創建 Web Worker 的步驟如下&#xff1a; 1.創建一個新的 JavaScript 文件&#xff0c;其中包含要在工作線程中運行的代碼&#xff08;耗時任務&#xff09;。該文件不應包含對 DOM 的引用&#xff0c;因為在工作線程中無法訪問 …

大模型工具Ollama存在安全風險

國家網絡安全通報中心&#xff1a;大模型工具Ollama存在安全風險 來源&#xff1a;國家網絡與信息安全信息通報中心 3月3日&#xff0c;國家網絡安全通報中心發布關于大模型工具Ollama存在安全風險的情況通報&#xff0c;內容如下&#xff1a; 據清華大學網絡空間測繪聯合研…

LINUX系統安裝+添加共享目錄

一、前言 Windows或mac系統中創建Linux工作環境是基于VMware和SL(Scientific Linux)&#xff0c;下面分別安裝二者。 二、VMware軟件安裝及注冊 1、雙擊VMware安裝包 2、點擊下一步 3、 勾選接受許可&#xff0c;并點擊下一步 4、更改路徑&#xff08;建議更改為容易找到的路…

BI 工具響應慢?可能是 OLAP 層拖了后腿

在數據驅動決策的時代&#xff0c;BI 已成為企業洞察業務、輔助決策的必備工具。然而&#xff0c;隨著數據量激增和分析需求復雜化&#xff0c;BI 系統“卡”、“響應慢”的問題日益突出&#xff0c;嚴重影響分析效率和用戶體驗。 本文將深入 BI 性能問題的根源&#xff0c;并…

基于SSM+Vue的汽車維修保養預約系統+LW示例

1.項目介紹 系統角色&#xff1a;管理員、員工、用戶功能模塊&#xff1a;用戶管理、員工管理、汽車類型管理、項目類型管理、維修/預約訂單管理、系統管理、公告管理等技術選型&#xff1a;SSM&#xff0c;vue&#xff08;后端管理web&#xff09;&#xff0c;Layui&#xff…

在rocklinux里面批量部署安裝rocklinx9

部署三臺Rockylinux9服務器 實驗要求 1. 自動安裝ubuntu server20以上版本 2. 自動部署三臺Rockylinux9服務器&#xff0c;最小化安裝&#xff0c;安裝基礎包&#xff0c;并設定國內源&#xff0c;設靜態IP 實驗步驟 安裝軟件 # yum源必須有epel源 # dnf install -y epel-re…

Oxidized收集H3C交換機網絡配置報錯,not matching configured prompt (?-mix:^(<CD>)$)

背景&#xff1a;問題如上標題&#xff0c;H3C所有交換機配置的model都是comware 解決方案&#xff1a; 1、找到compare.rb [rootoxidized model]# pwd /usr/local/lib/ruby/gems/3.1.0/gems/oxidized-0.29.1/lib/oxidized/model [rootoxidized model]# ll comware.rb -rw-r--…

mac本地安裝運行Redis-單機

記錄一下我以前用的連接服務器的跨平臺SSH客戶端。 因為還要準備畢設...... 服務器又過期了&#xff0c;只能把redis安裝下載到本地了。 目錄 1.github下載Redis 2.安裝homebrew 3.更新GCC 4.自行安裝Redis 5.通過 Homebrew 安裝 Redis 安裝地址&#xff1a;https://git…

C++學習之格斗小游戲綜合案例

C格斗游戲效果視頻 1.案例簡介 #include "broadSword.h" //構造函數 BroadSword::BroadSword() { FileManager fm; map<string, map<string, string>> mWeapon; fm.loadCSVData("Weapons.csv", mWeapon); //武器id string id …