【MySQL系列】表內容的基本操作(增刪查改)

「前言」文章內容大致是對MySQL表內容的基本操作,即增刪查改。

「歸屬專欄」MySQL

「主頁鏈接」個人主頁

「筆者」楓葉先生(fy)

MySQL

目錄

  • 一、MySQL表內容的增刪查改
    • 1.1 Create
      • 1.1.1 單行數據+全列插入
      • 1.1.2 多行數據+指定列插入
      • 1.1.3 插入否則更新
      • 1.1.4 數據替換
    • 1.2 Retrieve
      • 1.2.1 SELECT列
      • 1.2.2 SELECT查詢加WHERE條件
      • 1.2.3 對查詢結果排序
      • 1.2.4 篩選分頁結果
    • 1.3 Update
    • 1.4 Delete
      • 1.4.1 刪除數據
      • 1.4.2 截斷表
    • 1.5 插入查詢結果
    • 1.6 聚合函數
    • 1.7 group by子句的使用(分組查詢)

一、MySQL表內容的增刪查改

  • 表內容的增刪查改簡稱CRUDCreate(新增),Retrieve(查找),Update(修改),Delete(刪除)
  • DML【data manipulation language】數據操縱語言,用來對數據進行操作代表指令:insert,delete、update
  • DML中又單獨分了一個DQL【Data Query Language】,數據查詢語言,代表指令:select

1.1 Create

create是用于新增數據,新增數據的SQL語法如下:

INSERT [INTO] table_name [(column [, column] ...)] VALUES (value_list) [, (value_list)] ...
  • 大寫的表示關鍵字,[] 是可選項,可以選擇不寫
  • table_name是表的名字
  • column列,用于指定每個value_list中的值應該插入到表中的哪一列
  • value_lis的值與column一一對應

語法到下面再一一解釋

1.1.1 單行數據+全列插入

先創建一個學生表,表當中包含自增長的主鍵id、學號、姓名和QQ號。

mysql> create table if not exists student(-> id int unsigned primary key auto_increment,-> stu_id int unsigned not null unique comment '學號',-> name varchar(20) not null,-> qq varchar(20)-> );

在這里插入圖片描述
面使用insert語句向學生表中插入記錄,每次向表中插入一條記錄,并且插入記錄時不指定column列,表示按照表中默認的列順序進行全列插入,因此插入的每條記錄中的列值需要按表列順序依次列出(全列插入)

-- 全列插入
mysql> insert into student values (1, 10001, '張三', 222222);
mysql> insert into student values (2, 10002, '李四', 222223);

注意value_list數量必須和定義表的列的數量及順序一致
在這里插入圖片描述
注:into也可以省略,不過為了符號插入語義,一般都寫出來。

1.1.2 多行數據+指定列插入

插入的時候,也可以不用指定id(這時候就需要明確插入數據到那些列了,即指定列插入),對于表中的ID來說,mysql會使用默認的值進行自增

insert into student (stu_id, name, qq) values (10003, '王五', 222224);

在這里插入圖片描述
insert語句也可以一次向表中插入多條記錄,插入的多條記錄之間使用逗號隔開,并且插入記錄時可以只指定某些列進行插入。

mysql> insert into student (stu_id, name, qq) values (10004, '趙六', null), (10005, '田七', null);

在這里插入圖片描述
注意:不允許為空一列,必須插入值,否則報錯。

1.1.3 插入否則更新

向表中插入記錄時,如果待插入記錄中的主鍵或唯一鍵已經存在,那么就會因為主鍵沖突或唯一鍵沖突導致插入失敗。

主鍵沖突

在這里插入圖片描述

唯一鍵沖突
在這里插入圖片描述
這時可以選擇性的進行同步更新操作,語法:

INSERT ... ON DUPLICATE UPDATE column1=value1 [, column2=value2] ...;

注:

  • 大寫的表示關鍵字,[ ]中代表的是可選項
  • ON DUPLICATE KEY 當發生重復key的時候,就執行后面的語句
  • UPDATE后面的column=value,表示當插入記錄出現沖突時需要更新的列值

規則:

  • 如果表中沒有沖突數據,則直接插入數據
  • 如果表中有沖突數據,則將表中的數據進行更新

例如,插入的值主鍵發生沖突,則將表中沖突的列進行更新

mysql> insert into student (id, stu_id, name) values (1, 10001, '孫悟空')-> on duplicate key update stu_id = 10011, name = '孫悟空';
Query OK, 2 rows affected (0.00 sec)

在這里插入圖片描述
執行插入否則更新的語句,可以通過受影響的數據行數來判斷本次數據的插入情況:

  • 0 rows affected:表中有沖突數據,但沖突數據的值和指定更新的值相同
  • 1 row affected:表中沒有沖突數據,數據直接被插入
  • 2 rows affected:表中有沖突數據,并且數據已經被更新

在這里插入圖片描述
也可以通過 MySQL 函數獲取受到影響的數據行數

SELECT ROW_COUNT();

1.1.4 數據替換

  • 如果表中沒有沖突數據,則直接插入數據
  • 如果表中有沖突數據,則先將表中的沖突數據刪除,然后再插入數據

語法:只需要在插入數據時將SQL語句中的INSERT改為REPLACE即可,其他相同

例如:主鍵或者唯一鍵如果沖突,則刪除后再插入

mysql> replace into student (stu_id, name) values (10002, '唐三藏');
Query OK, 2 rows affected (0.00 sec)

在這里插入圖片描述
執行該語句后,也可以通過受影響的數據行數來判斷本次數據的插入情況:

  • 1 row affected:表中沒有沖突數據,數據直接被插入
  • 2 rows affected:表中有沖突數據,沖突數據被刪除后重新插入

1.2 Retrieve

查找數據的SQL語法如下:

SELECT
[DISTINCT] {* | {column [, column] ...}
[FROM table_name]
[WHERE ...]
[ORDER BY column [ASC | DESC], ...]
LIMIT ...

說明:

  • 大寫的表示關鍵字,[ ]中代表的是可選項
  • { }中的 | 代表可以選擇左側的語句或右側的語句

接下來創建表結構,用于測試

CREATE TABLE exam_result (
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20) NOT NULL COMMENT '同學姓名',
chinese float DEFAULT 0.0 COMMENT '語文成績',
math float DEFAULT 0.0 COMMENT '數學成績',
english float DEFAULT 0.0 COMMENT '英語成績'
);

插入測試數據

INSERT INTO exam_result (name, chinese, math, english) VALUES
('唐三藏', 67, 98, 56),
('孫悟空', 87, 78, 77),
('豬悟能', 88, 98, 90),
('曹孟德', 82, 84, 67),
('劉玄德', 55, 85, 45),
('孫權', 70, 73, 78),
('宋公明', 75, 65, 30);

在這里插入圖片描述

1.2.1 SELECT列

全列查詢

查詢數據時直接用*代替column列表,表示進行全列查詢,這時將會顯示被篩選出來的記錄的所有列信息

mysql> select * from exam_result;

在這里插入圖片描述
注意:通常情況下不建議使用*進行全列查詢,查詢的列越多,意味著需要傳輸的數據量越大,可能會影響到索引的使用

指定列查詢

在查詢數據時也可以只對指定的列進行查詢,這時將需要查詢的列在column列表列出即可

注意:指定列的順序不需要按定義表的順序來

mysql> select id, name from student;

在這里插入圖片描述

查詢字段為表達式

select不僅能夠用來查詢數據,還可以用來計算某些表達式或執行某些函數
在這里插入圖片描述
在查詢數據時,column列表中除了能羅列表中存在的列名外,也可以將表達式羅列到column列表中

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

在這里插入圖片描述
如果將表達式添加到column列表,那么每當一條記錄被篩選出來時就會執行這個表達式,然后將表達式的計算結果作為這條記錄的一個列值進行顯示
在這里插入圖片描述
注意:存儲的數據依舊沒有發生改變

column列表中的表達式中也可以包含多個表中已有的字段
在這里插入圖片描述

為查詢結果指定別名

語法:

SELECT column [AS] alias_name [...] FROM table_name;

說明:

  • 大寫的表示關鍵字,[ ]中代表的是可選項

查詢結果列名太長了,可以對列名進行重命名
在這里插入圖片描述
進行對結果重命名

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

在這里插入圖片描述
as也可以省略

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

在這里插入圖片描述

對查詢結果去重

如果想要對查詢結果進行去重操作,可以在SQL中的select后面帶上distinct關鍵字

mysql> select distinct math from exam_result;

在這里插入圖片描述

1.2.2 SELECT查詢加WHERE條件

  • 如果在查詢數據時沒有指定where子句,那么會直接將表中某一列所有的記錄都顯示出來
  • 如果在查詢數據時指定了where子句,那么在查詢數據時會先根據where子句篩選出符合條件的記錄,查詢結果只會顯示符合條件的記錄

where子句中可以指明一個或多個篩選條件,各個篩選條件之間用邏輯運算符AND或OR進行關聯,下面給出了where子句中常用的比較運算符和邏輯運算符。

比較運算符

在這里插入圖片描述

邏輯運算符

在這里插入圖片描述

注意:MySQL里面比較相等使用的是一個=,不使用兩個等號,與C/C++里面的不一樣

測試案例

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

在where子句中指明篩選條件為英語成績小于60

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

在這里插入圖片描述

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

在where子句中指明篩選條件為語文成績大于等于80并且小于等于90,使用and進行并列條件

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

在這里插入圖片描述

此外,這里也可以使用BETWEEN a0 AND a1來指明語文成績的的所在區間

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

在這里插入圖片描述

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

在where子句中使用 or 進行條件連接

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

在這里插入圖片描述
此外,也可以通過IN (option, ...)的方式來判斷數學成績是否符合篩選要求

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

在這里插入圖片描述

姓孫的同學

通過模糊匹配來判斷當前同學是否姓孫(需要用到%來匹配任意多個字符),使用到關鍵字like

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

在這里插入圖片描述

孫某同學

通過模糊匹配來判斷當前同學是否為孫某(需要用到_來嚴格匹配任意單個字符),使用到關鍵字like

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

在這里插入圖片描述

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

按照條件使用where子句查詢即可

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

在這里插入圖片描述

總分在 200 分以下的同學

在select的column列表中添加表達式查詢,查詢的表達式為語文、數學和英語成績之和,為了方便觀察可以將表達式對應的列指定別名為“總分”,在where子句中指明篩選條件為三科成績之和小于200

mysql> select id, name, chinese+english+math as 總分 from exam_result where chinese+english+math < 200;

在這里插入圖片描述
需要注意的是,在where子句中不能使用select中指定的別名:

  • 查詢數據時是先根據where子句篩選出符合條件的記錄。
  • 然后再將符合條件的記錄作為數據源來再依次執行select語句。

也就說說語句的執行順序是where子句先執行,在執行select語句
在這里插入圖片描述
所以在where子句中不能使用別名select的別名,如果在where子句中使用別名,那么在查詢數據時就會產生報錯
在這里插入圖片描述

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

where子句要使用ANDNOT的關鍵字和通過模糊匹配like

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

在這里插入圖片描述

孫某同學,否則要求總成績 > 200 并且 語文成績 < 數學成績 并且 英語成績 > 80

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

在這里插入圖片描述

NULL的查詢

使用的測試表是上面的student表
在這里插入圖片描述

查詢qq號已知的同學姓名

mysql> select name, qq from student where qq is not null;

在這里插入圖片描述

查詢QQ號未知的同學

mysql> select name, qq from student where qq is null;

在這里插入圖片描述
需要注意的是,在與NULL值作比較的時候應該使用<=>運算符,使用=運算符無法得到正確的查詢結果,不過都不怎么使用<=>運算符,判斷為空或者不為空常使用is nullis not null
在這里插入圖片描述
=運算符是NULL不安全的,使用=運算符將任何值與NULL作比較,得到的結果都是NULL
在這里插入圖片描述
<=>運算符是NULL安全的,使用<=>運算符將NULL和NULL作比較得到的結果為TRUE(1),將非NULL值與NULL作比較得到的結果為FALSE(0)
在這里插入圖片描述

1.2.3 對查詢結果排序

排序語法:

-- ASC 為升序(從小到大)
-- DESC 為降序(從大到小)
-- 默認為 ASC
SELECT ... FROM table_name [WHERE ...] ORDER BY column [ASC|DESC], [...];

說明:

  • 大寫的表示關鍵字,[ ]中代表的是可選項

注意:沒有ORDER BY子句的查詢,返回的順序是未定義的,永遠不要依賴這個順序

查詢所有同學及數學成績,按數學成績升序顯示

下面使用的測試表是上面的exam_result

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

在這里插入圖片描述

查詢所有同學及 qq 號,按 qq 號排序按升序顯示

使用的測試表是上面的student表

mysql> select name, qq from student order by qq asc;

在這里插入圖片描述
注意: NULL值視為比任何值都小,因此排升序時出現在最上面。

查詢所有同學及 qq 號,按 qq 號排序按降序顯示

mysql> select name, qq from student order by qq desc;

在這里插入圖片描述
注意: NULL值視為比任何值都小,因此降序時出現在最下面。

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

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

在這里插入圖片描述
這里說明一下,首先排序的是數學,數學成績進行降序排序的,只有滿足了數學降序,然后才到英語升序排序

比如,當兩條記錄的數學成績相同時就會按照英語成績進行排序,如果這兩條記錄的英語成績也相同就會繼續按照語文成績進行排序,以此類推
在這里插入圖片描述

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

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

在這里插入圖片描述
需要注意的是,在order by子句中可以使用select中指定的別名:

  • 查詢數據時是先根據where子句篩選出符合條件的記錄(如果有where子句)
  • 然后再將符合條件的記錄作為數據源來依次執行select語句
  • 最后再通過order by子句對select語句的執行結果進行排序

也就是說,order by子句的執行是在select語句之后的,所以在order by子句中可以使用別名

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

在這里插入圖片描述

查詢姓孫的同學或者姓曹的同學數學成績,結果按數學成績由高到低顯示

mysql> select name, math from exam_result where name like '孫%' or name like '曹%' order by math desc;

在這里插入圖片描述

1.2.4 篩選分頁結果

語法如下:

-- 起始下標為 0-- 從 s 開始,篩選 n 條結果
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT s, n;-- 從 0 開始,篩選 n 條結果
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT n;-- 從 s 開始,篩選 n 條結果,比第二種用法更明確,建議使用
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT n OFFSET s;

說明:

  • 大寫的表示關鍵字,[ ]中代表的是可選項
  • 查詢SQL中各語句的執行順序為:where、select、order by、limit
  • limit子句在篩選記錄時,不加限制,記錄的下標從0開始

注意:對未知表進行查詢時,最好加一條 LIMIT 1,避免因為表中數據過大,查詢全表數據導致數據庫卡死

按 id 進行分頁,每頁 3 條記錄,分別顯示 第 1、2、3 頁

mysql> select id, name, math, chinese, english from exam_result-> order by id limit 3 offset 0;

在這里插入圖片描述
從第3條記錄開始,向后篩選出3條記錄

mysql> select id, name, math, chinese, english from exam_result order by id limit 3 offset 3;

在這里插入圖片描述

從第6條記錄開始,向后篩選出3條記錄(如果結果不足 3 個,不會有影響)

select id, name, math, chinese, english from exam_result order by id limit 3 offset 6;

在這里插入圖片描述

1.3 Update

修改表中數據語法如下:

UPDATE table_name SET column = expr [, column = expr ...]
[WHERE ...] [ORDER BY ...] [LIMIT ...]

說明:

  • 大寫的表示關鍵字,[ ]中代表的是可選項
  • column=expr,表示將記錄中列名為column的值修改為expr
  • 在修改數據之前需要先找到待修改的記錄,update語句中的where、order by和limit就是用來定位數據的,不進行條件限制,表中一列數據都會被修改
  • 所以要慎用該命令

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

先查看原數據,再進行修改,最后再查詢是否已修改

mysql> update exam_result set math = 80 where name = '孫悟空';
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0

在這里插入圖片描述

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

也是如此,先查看原數據,再進行修改,最后再查詢是否已修改

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

在這里插入圖片描述

將總成績倒數前三的 3 位同學的數學成績加上 30 分

先查看原數據

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

在這里插入圖片描述

再進行修改,在update語句中指明要將篩選出來的記錄的數學成績加上30分,最后再查詢是否已修改

mysql> update exam_result set math = math+30 order by math+chinese+english asc limit 3;

在這里插入圖片描述
需要注意的是,MySQL中不支持+=這種復合賦值運算符,此外,這里在查看更新后的數據時不能查看總成績倒數前三的3位同學,因為之前總成績倒數前三的3位同學,數學成績加上30分后可能就不再是倒數前三了

mysql> select name, math, math+chinese+english as 總分 from exam_result where name in('宋公明', '劉玄德', '曹孟德');

在這里插入圖片描述

將所有同學的語文成績更新為原來的 2 倍

查看原始數據
在這里插入圖片描述
在update語句中指明要將篩選出來的記錄的語文成績變為原來的2倍,并在修改后再次查看數據確保數據成功被修改

mysql> update exam_result set chinese = chinese*2;

在這里插入圖片描述
注意:更新全表的語句慎用,沒有條件限制,則會更新全表

1.4 Delete

1.4.1 刪除數據

刪除數據語法:

DELETE FROM table_name [WHERE ...] [ORDER BY ...] [LIMIT ...]

說明:

  • 大寫的表示關鍵字,[ ]中代表的是可選項
  • 在刪除數據之前需要先找到待刪除的記錄,delete語句中的where、order by和limit就是用來定位數據的

刪除孫悟空同學的考試成

先查看原數據,再刪除數據,再查看數據是否存在
在這里插入圖片描述

刪除整張表數據

創建測試表

CREATE TABLE for_delete (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20)
);

插入測試數據

INSERT INTO for_delete (name) VALUES ('A'), ('B'), ('C');

在這里插入圖片描述
在delete語句中只指明要刪除數據的表名,而不通過where、order by和limit指明篩選條件,這時將會刪除整張表的數據。

mysql> delete from for_delete;

在這里插入圖片描述
再向表中插入一些數據,在插入數據時不指明自增長字段的值,這時會發現插入數據對應的自增長id值是在之前的基礎上繼續增長的

在這里插入圖片描述
查看創建表時的相關信息時可以看到,有一個AUTO_INCREMENT=n的字段,當通過delete語句刪除整表數據時,不會重置AUTO_INCREMENT=n字段,因此刪除整表數據后插入數據對應的自增長id值會在原來的基礎上繼續增長。
在這里插入圖片描述

注意: 刪除整表操作要慎用!

1.4.2 截斷表

截斷表語法如下:

TRUNCATE [TABLE] table_name

說明:

  • 大寫的表示關鍵字,[ ]中代表的是可選項
  • truncate只能對整表操作,不能像delete一樣針對部分數據操作
  • truncate實際上不對數據操作,所以比delete更快
  • 但是truncate在刪除數據的時候,并不經過真正的事物,所以無法回滾
  • truncate會重置AUTO_INCREMENT=n字段

創建一張測試表

CREATE TABLE for_truncate (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20)-- 插入測試數據
INSERT INTO for_truncate (name) VALUES ('A'), ('B'), ('C');
);

在這里插入圖片描述
在truncate語句中只指明要刪除數據的表名,這時便會刪除整張表的數據,但由于truncate實際不對數據操作,因此執行truncate語句后看到影響行數為0

mysql> truncate table for_truncate;
Query OK, 0 rows affected (0.01 sec)

在這里插入圖片描述
再向表中插入一些數據,在插入數據時不指明自增長字段的值,這時會發現插入數據對應的自增長id值是重新從1開始增長的
在這里插入圖片描述
注意: 截斷表操作要慎用

1.5 插入查詢結果

語法:

INSERT INTO table_name [(column [, column ...])] SELECT ...

說明:

  • 大寫的表示關鍵字,[ ]中代表的是可選項
  • 該SQL的作用是將篩選出來的記錄插入到指定的表當中

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

-- 創建原數據表
CREATE TABLE duplicate_table (id int, name varchar(20));
-- 插入測試數據
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_duplicate_table
mysql> insert into no_duplicate_table select distinct * from duplicate_table;-- 通過重命名表,實現原子的去重操作
mysql> rename table duplicate_table to old_duplicate_table, -> no_duplicate_table to duplicate_table;

臨時表的結構與測試表相同,因此在創建臨時表的時候可以借助like進行創建
在這里插入圖片描述
通過插入查詢語句將去重查詢后的結果插入到臨時表中,由于臨時表和測試表的結構相同,并且select進行的是全列查詢,因此在插入時不用在表名后指明column列表
在這里插入圖片描述
將測試表重命名為其他名字(相當于對去重前的數據進行備份),將臨時表重命名為測試表的名字,這時便完成了表中數據的去重操作
在這里插入圖片描述

1.6 聚合函數

聚合函數對一組值執行計算并返回單一的值,常用的聚合函數如下:

函數說明
COUNT([DISTINCT] expr)返回查詢到的數據的數量
SUM([DISTINCT] expr)返回查詢到的數據的總和,不是數字沒有意義
AVG([DISTINCT] expr)返回查詢到的數據的平均值,不是數字沒有意義
MAX([DISTINCT] expr)返回查詢到的數據的最大值,不是數字沒有意義
MIN([DISTINCT] expr)返回查詢到的數據的最小值,不是數字沒有意義

注意:聚合函數可以在select語句中使用,此時select每處理一條記錄時都會將對應的參數傳遞給這些聚合函數

統計班級共有多少同學

這里用之前的student表來進行演示
在這里插入圖片描述
使用*做統計,不受 NULL 影響,將*作為參數傳遞給count函數,這時便能統計出表中的記錄條數

mysql> select count(*) from student;

在這里插入圖片描述
也可以使用表達式做統計,使用count函數,并將表達式作為參數傳遞給count函數,這時也可以統計出表中的記錄條數

mysql> select count(1) from student;

在這里插入圖片描述
這種寫法相當于在查詢表中數據時,自行新增了一列列名為特定表達式的列,我們就是在用count函數統計該列中有多少個數據,等價于統計表中有多少條記錄
在這里插入圖片描述

統計班級收集的 qq 號有多少

使用count函數統計qq列中數據的個數,NULL不會計入結果

mysql> select count(qq) from student;

在這里插入圖片描述

統計本次考試的數學成績分數個數

這里用之前的exam_result表來進行演示

先使用count函數統計math列中數據的個數(包含重復的)
在這里插入圖片描述
使用count函數時(包括其他聚合函數),在傳遞的參數之前加上distinct,這時便能統計出表中數學成績去重后的個數。

mysql> select count(distinct math) from exam_result;

在這里插入圖片描述

統計數學成績總分

可以使用sum函數統計math列中數據的總和

mysql> select sum(math) from exam_result;

在這里插入圖片描述

統計不及格的數學成績總分

使用where子句中指明篩選條件為數學成績小于60分

mysql> select sum(math) from exam_result where math < 60;

在這里插入圖片描述
注意:如果沒有結果,返回 NULL

統計平均總分

可以使用avg函數計算總分的平均值

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

在這里插入圖片描述

返回英語最高分

可以使用max函數查詢英語成績最高分

mysql> select max(english) as maxEnglish from exam_result;

在這里插入圖片描述

返回 > 70 分以上的數學最低分

使用where子句中指明篩選條件為英語成績大于70分,在select語句中使用min函數查詢英語成績最低分

mysql> select min(english) as minEnglish from exam_result where english > 70;

在這里插入圖片描述

1.7 group by子句的使用(分組查詢)

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

select column1, column2, .. from table group by column;

說明:

  • SQL中大寫的表示關鍵字,[ ]中代表的是可選項
  • 查詢SQL中各語句的執行順序為:where、group by、select、order by、limit
  • group by后面的列名,表示按照指定列進行分組查詢

準備工作,創建一個雇員信息表(來自oracle 9i的經典測試表)
雇員信息表中包含三張表,分別是員工表(emp)、部門表(dept)和工資等級表(salgrade)

員工表(emp)中包含如下字段:

  • 雇員編號(empno)
  • 雇員姓名(ename)
  • 雇員職位(job)
  • 雇員領導編號(mgr)
  • 雇傭時間(hiredate)
  • 工資月薪(sal)
  • 獎金(comm)
  • 部門編號(deptno)

部門表(dept)中包含如下字段:

  • 部門編號(deptno)
  • 部門名稱(dname)
  • 部門所在地點(loc)

工資等級表(salgrade)中包含如下字段:

  • 等級(grade)
  • 此等級最低工資(losal)
  • 此等級最高工資(hisal)

雇員信息表SQL代碼

已上傳至下載,主頁的資源頁面即可找到

然后上傳文件,在MySQL中使用source命令依次執行文件中的SQL

source SQL文件路徑
-- 例如
mysql> source /home/fy/mysql/scott_data.sql

在這里插入圖片描述
使用該數據庫
在這里插入圖片描述

部門表(dept)的表結構和表中的內容如下:
在這里插入圖片描述
員工表(emp)的表結構和表中的內容如下:
在這里插入圖片描述
工資等級表(salgrade)的表結構和表中的內容如下:
在這里插入圖片描述

顯示每個部門的平均工資和最高工資

在group by子句中指明按照部門號進行分組,在select語句中使用avg函數和max函數,分別查詢每個部門的平均工資和最高工資

mysql> select deptno, avg(sal) as 平均工資, max(sal) as 最高工資 from emp group by deptno;

在這里插入圖片描述
注意:是先執行分組語句,然后各自在組內做聚合查詢得到每個組的平均工資和最高工資

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

在group by子句中指明依次按照部門號和崗位進行分組,在select語句中使用avg函數和min函數,分別查詢每個部門的每種崗位的平均工資和最低工資

mysql> select deptno, job, avg(sal) 平均工資, min(sal) 最低工資 from emp group by deptno, job;

在這里插入圖片描述
注意:group by子句中可以指明按照多個字段進行分組,各個字段之間使用逗號隔開,分組優先級與書寫順序相同,比如,當兩條記錄的部門號相同時,將會繼續按照崗位進行分組。

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

這里要使用到HAVING條件,語法如下:

SELECT ... FROM table_name [WHERE ...] [GROUP BY ...] [HAVING ...] ...;

說明:

  • 大寫的表示關鍵字,[ ]中代表的是可選項
  • SQL中各語句的執行順序為:where、group by、select、having、order by、limit
  • having子句中可以指明一個或多個篩選條件
  • having經常和group by搭配使用,作用是對分組進行篩選,作用有些像where

先統計每個部門的平均工資,在group by子句中指明按照部門號進行分組

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

在這里插入圖片描述
然后通過having子句篩選出平均工資低于2000的部門

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

在這里插入圖片描述

having子句和where子句的區別

  • where子句放在表名后面,而having子句必須搭配group by子句使用,放在group by子句的后面
  • where子句是對整表的數據進行篩選,having子句是對分組后的數據進行篩選
  • where子句中不能使用聚合函數和別名,而having子句中可以使用聚合函數和別名

總結一下,SQL中各語句的執行順序

  1. 根據where子句篩選出符合條件的記錄
  2. 根據group by子句對數據進行分組
  3. 將分組后的數據依次執行select語句
  4. 根據having子句對分組后的數據進行進一步篩選
  5. 根據order by子句對數據進行排序
  6. 根據limit子句篩選若干條記錄進行顯示

--------------------- END ----------------------

「 作者 」 楓葉先生
「 更新 」 2023.8.18
「 聲明 」 余之才疏學淺,故所撰文疏漏難免,或有謬誤或不準確之處,敬請讀者批評指正。

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

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

相關文章

MS Word表格寬度自適應

x.1 問題&#xff1a; 你的表格可能并沒有占滿整行&#xff0c;且右對齊&#xff0c;例如如下&#xff0c; x.2 解決方式 這個時候你想右對齊&#xff0c;你可以這么操作&#xff0c;點左上角的十字全選表格&#xff0c; 在布局里選擇自動對齊&#xff0c; 對齊方式選擇居中右…

git日常操作-案例

文章目錄 查看tag對應版本tag一個版本切換到指定tag查看遠程有那些分支 查看tag對應版本 要查看 Git 倉庫中標簽&#xff08;tag&#xff09;對應的版本&#xff0c;可以使用以下命令&#xff1a; git show <tag>將 替換為你要查看的標簽名稱。該命令將顯示與標簽對應的…

springBoot是如何實現自動裝配的

目錄 1 什么是自動裝配 2 Spring自動裝配原理 2.1 SpringBootConfiguration ?編輯 2.2 EnableAutoConfiguration 2.2.1 AutoConfigurationPackage 2.2.2 Import({AutoConfigurationImportSelector.class}) 2.3 ComponentScan 1 什么是自動裝配 自動裝配就是將官方寫好的的…

vue-cli前端工程化——創建vue-cli工程 router版本的創建 目錄結構 案例初步

目錄 引出創建vue-cli前端工程vue-cli是什么自動構建創建vue-cli項目選擇Vue的版本號 手動安裝進行選擇創建成功 手動創建router版多了一個router 運行測試bug解決 Vue項目結構main.jspackage.jsonvue.config.js Vue項目初步hello案例 總結 引出 1.vue-cli是啥&#xff0c;創建…

Redis Geo 數據類型在移動互聯網中的應用

Redis Geo 數據類型在移動互聯網中的應用 一、簡介1 Redis2 數據類型 二、Geo 數據類型1 Geo 數據類型2 Geo 數據類型的存儲方式3 Geo 數據類型的常用命令 三、Geo 數據類型應用場景1 附近的人和地點功能2 出租車實時定位3 物流配送服務 四、Redis Geo 數據優化策略1 降低查詢延…

android手勢事件

與手勢事件有關的方法 dispatchTouchEvent()&#xff1a;該方法將觸摸事件分發給相應的視圖或視圖組。onInterceptTouchEvent()&#xff1a;該方法用于判斷是否需要攔截觸摸事件&#xff0c;如果需要攔截&#xff0c;則返回 true&#xff0c;否則返回 false。onTouchEvent()&a…

神經網絡基礎-神經網絡補充概念-36-dropout正則化

概念 Dropout 是一種常用的正則化技術&#xff0c;用于減少深度神經網絡中的過擬合問題。它在訓練過程中隨機地將一部分神經元的輸出置為零&#xff0c;從而強制模型在訓練過程中學習多個獨立的子模型&#xff0c;從而減少神經元之間的依賴關系&#xff0c;提高模型的泛化能力…

記一次項目內存優化--內存泄漏

需求–內存泄漏優化&#xff0c;PSS有所下降&#xff0c; OOM率減少 主要是與某個版本作基準進行對比&#xff08;一般是最新版本的前一個版本作原數據&#xff09;&#xff0c;優化后&#xff0c;PSS有所下降&#xff0c;線上OOM率減少&#xff08;Bugly版本對比&#xff09;…

程序員如何利用公網遠程訪問查詢本地硬盤【內網穿透】

&#x1f3ac; 鴿芷咕&#xff1a;個人主頁 &#x1f525; 個人專欄: 《高效編程技巧》《cpolar》 ??生活的理想&#xff0c;就是為了理想的生活! 公網遠程訪問本地硬盤文件【內網穿透】 文章目錄 公網遠程訪問本地硬盤文件【內網穿透】前言1. 下載cpolar和Everything軟件1.…

React 生態應用 - React Router(1)

目錄 擴展學習資料 安裝和導入 Route匹配 src/components/navbar.jsx src/App.js 擴展學習資料 資料名稱 鏈接 備注 閱讀react router組件文檔 https://react-router.docschina.org/web/guides/philosophy Introduction | React Router 中文文檔 擴展閱讀 路由鑒權 …

(stm32)低功耗模式

低功耗模式 執行哪個低功耗模式的程序判斷流程 標志位設置操作一定要在WFI/WFE之前&#xff0c;調用此指令后立即進入睡眠判斷流程 模式對比 睡眠模式 停止模式 待機模式

FLatten Transformer

FLatten Transformer: Vision Transformer using Focused Linear Attention ICCV 2023 聚焦式線性注意力模塊 關于Transformer 在Transformer模型應用于視覺領域的過程中&#xff0c;降低自注意力的計算復雜度是一個重要的研究方向。線性注意力通過兩個獨立的映射函數來近似S…

3 Python的數據類型

概述 在上一節&#xff0c;我們介紹了Python的基礎語法&#xff0c;包括&#xff1a;編碼格式、標識符、關鍵字、注釋、多行、空行、縮進、引號、輸入輸出、import、運算符、條件控制、循環等內容。Python是一種動態類型的編程語言&#xff0c;這意味著當你創建一個變量時&…

1.初識Web

文章目錄 1. 什么是Web?2.初始Web前端2.1.Web標準 1. 什么是Web? web:全球廣域網&#xff0c;也稱萬維網(www World Wide Web)&#xff0c;能夠通過瀏覽器訪問的網站。 2.初始Web前端 網頁有哪些部分組成&#xff1f; 文字、圖片、音頻、視頻、超鏈接… 我們看到的網頁&am…

react 生命周期方法

組件的生命周期 每個組件都包含 “生命周期方法”&#xff0c;你可以重寫這些方法&#xff0c;以便于在運行過程中特定的階段執行這些方法。你可以使用此生命周期圖譜作為速查表。在下述列表中&#xff0c;常用的生命周期方法會被加粗。其余生命周期函數的使用則相對罕見。 掛…

Windows Oracle21C與PLSQL Developer 15配置

1、下載Oracle21c并安裝 下載地址&#xff1a;https://www.oracle.com/database/technologies/oracle21c-windows-downloads.html 2、下載PLSQL Developer 15并安裝 下載地址&#xff1a;https://www.allroundautomations.com/products/pl-sql-developer/#pricing 3、配置O…

TypeScript教程(四)基本運算符

一、運算符 TypeScript包含以下幾種運算符&#xff1a; 1.算術運算符 2.邏輯運算符 3.關系運算符 4.按位運算符 5.賦值運算符 6.三元/條件運算符 7.字符串運算符 8.類型運算符 1.算術運算符 y5 運算符描述例子x 運算結果y 運算結果加法xy275-減法xy-235*乘法xy*2105…

在線課堂錄播直播管理系統SpringBoot+Vue

在線課堂錄播直播管理系統SpringBootVue 文章目錄 在線課堂錄播直播管理系統SpringBootVue共三個端&#xff1a;后端、后臺管理系統、前端&#xff0c;如要學習看評論區&#xff08;全部源碼、文檔、數據庫&#xff09;。內置功能一、前端二、后臺管理三、后端--代碼全有。四、…

數據結構—排序

8.排序 8.1排序的概念 什么是排序&#xff1f; 排序&#xff1a;將一組雜亂無章的數據按一定規律順序排列起來。即&#xff0c;將無序序列排成一個有序序列&#xff08;由小到大或由大到小&#xff09;的運算。 如果參加排序的數據結點包含多個數據域&#xff0c;那么排序往…

ElasticSearch刪除索引【真實案例】

文章目錄 背景分析解決遇到的問題 - 刪除超時報錯信息解決辦法1:調大超時時間解決辦法2:調大ES堆內存參考背景 項目中使用了ELK技術棧實現了日志管理,但是日志管理功能目前并沒有在生產上實際使用。 但ELK程序依然在運行,導致系統磁盤發生告警,剩余可用磁盤不足10%。 所以…