MySQL的基本查询(二)
生活随笔
收集整理的這篇文章主要介紹了
MySQL的基本查询(二)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
MySQL的基本查詢(二)
文章目錄
- MySQL的基本查詢(二)
- 3. Update
- 4. Delete
- 5. 插入查詢結果
- 6. 聚合函數
- 7. group by子句的使用
3. Update
語法:
UPDATE table_name SET column = expr [, column = expr ...] [WHERE ...] [ORDER BY ...] [LIMIT ...]對查詢到的結果進行列值更新
案例:
3.1 將孫悟空同學的數學成績變更為 80 分:
-- 更新值為具體值 -- 查看原數據 SELECT name, shuxue FROM exam_result WHERE name = '孫悟空'; +-----------+--------+ | name | shuxue | +-----------+--------+ | 孫悟空 | 78 | +-----------+--------+ 1 row in set (0.00 sec)-- 數據更新 UPDATE exam_result SET shuxue = 80 WHERE name = '孫悟空'; Query OK, 1 row affected (0.04 sec) Rows matched: 1 Changed: 1 Warnings: 0-- 查看更新后數據 SELECT name, shuxue FROM exam_result WHERE name = '孫悟空'; +-----------+--------+ | name | shuxue | +-----------+--------+ | 孫悟空 | 80 | +-----------+--------+ 1 row in set (0.00 sec)3.2 將曹孟德同學的數學成績變更為 60 分,語文成績變更為 70 分:
-- 一次更新多個列 -- 查看原數據 SELECT name, shuxue, yuwen FROM exam_result WHERE name = '曹孟德'; +-----------+--------+-------+ | name | shuxue | yuwen | +-----------+--------+-------+ | 曹孟德 | 84 | 82 | +-----------+--------+-------+ 1 row in set (0.00 sec)-- 數據更新 UPDATE exam_result SET shuxue = 60, yuwen = 70 WHERE name = '曹孟德'; Query OK, 1 row affected (0.14 sec) Rows matched: 1 Changed: 1 Warnings: 0-- 查看更新后數據 SELECT name, shuxue, yuwen FROM exam_result WHERE name = '曹孟德'; +-----------+--------+-------+ | name | shuxue | yuwen | +-----------+--------+-------+ | 曹孟德 | 60 | 70 | +-----------+--------+-------+ 1 row in set (0.00 sec)3.3 將總成績倒數前三的 3 位同學的數學成績加上 30 分:
-- 更新值為原值基礎上變更 -- 查看原數據 SELECT name, shuxue, yuwen + shuxue + yingyu 總分 FROM exam_result ORDER BY 總分 LIMIT 3; +-----------+--------+--------+ | name | shuxue | 總分 | +-----------+--------+--------+ | 宋公明 | 65 | 170 | | 劉玄德 | 85 | 185 | | 曹孟德 | 60 | 197 | +-----------+--------+--------+ 3 rows in set (0.00 sec)-- 數據更新,不支持 shuxue += 30 這種語法 UPDATE exam_result SET shuxue = shuxue + 30 ORDER BY yuwen + shuxue + yingyu LIMIT 3;-- 查看更新后數據 -- 思考:這里還可以按總分升序排序取前 3 個么? SELECT name, shuxue, yuwen + shuxue + yingyu 總分 FROM exam_result WHERE name IN ('宋公明', '劉玄德', '曹孟德'); +-----------+--------+--------+ | name | shuxue | 總分 | +-----------+--------+--------+ | 曹孟德 | 90 | 227 | | 劉玄德 | 115 | 215 | | 宋公明 | 95 | 200 | +-----------+--------+--------+ 3 rows in set (0.00 sec)-- 按總成績排序后查詢結果 SELECT name, shuxue, yuwen + shuxue + yingyu 總分 FROM exam_result ORDER BY 總分 LIMIT 3; +-----------+--------+--------+ | name | shuxue | 總分 | +-----------+--------+--------+ | 宋公明 | 95 | 200 | | 劉玄德 | 115 | 215 | | 唐三藏 | 98 | 221 | +-----------+--------+--------+ 3 rows in set (0.00 sec)3.4 將所有同學的語文成績更新為原來的 2 倍:
注意:更新全表的語句慎用!
4. Delete
4.1 刪除數據:
語法:
DELETE FROM table_name [WHERE ...] [ORDER BY ...] [LIMIT ...]案例:
4.1.1 刪除孫悟空同學的考試成績:
-- 查看原數據 SELECT * FROM exam_result WHERE name = '孫悟空'; +----+-----------+-------+--------+--------+ | id | name | yuwen | shuxue | yingyu | +----+-----------+-------+--------+--------+ | 2 | 孫悟空 | 174 | 80 | 77 | +----+-----------+-------+--------+--------+ 1 row in set (0.00 sec)-- 刪除數據 DELETE FROM exam_result WHERE name = '孫悟空'; Query OK, 1 row affected (0.17 sec)-- 查看刪除結果 SELECT * FROM exam_result WHERE name = '孫悟空'; Empty set (0.00 sec)4.1.2 刪除整張表數據:
注意:刪除整表操作要慎用!
-- 準備測試表 CREATE TABLE for_delete ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(20) ); Query OK, 0 rows affected (0.16 sec)-- 插入測試數據 INSERT INTO for_delete (name) VALUES ('A'), ('B'), ('C'); Query OK, 3 rows affected (1.05 sec) Records: 3 Duplicates: 0 Warnings: 0-- 查看測試數據 SELECT * FROM for_delete; +----+------+ | id | name | +----+------+ | 1 | A | | 2 | B | | 3 | C | +----+------+ 3 rows in set (0.00 sec) -- 刪除整表數據 DELETE FROM for_delete; Query OK, 3 rows affected (0.00 sec) -- 查看刪除結果 SELECT * FROM for_delete; Empty set (0.00 sec) -- 再插入一條數據,自增 id 在原值上增長 INSERT INTO for_delete (name) VALUES ('D'); Query OK, 1 row affected (0.00 sec) -- 查看數據 SELECT * FROM for_delete; +----+------+ | id | name | +----+------+ | 4 | D | +----+------+ 1 row in set (0.00 sec)-- 查看表結構,會有 AUTO_INCREMENT=n 項 SHOW CREATE TABLE for_delete\G *************************** 1. row *************************** Table: for_delete Create Table: CREATE TABLE `for_delete` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(20) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 1 row in set (0.00 sec)4.2 截斷表:
語法:
TRUNCATE [TABLE] table_name注意:這個操作慎用
5. 插入查詢結果
語法:
INSERT INTO table_name [(column [, column ...])] SELECT ...案例:刪除表中的的重復復記錄,重復的數據只能有一份
-- 創建原數據表 CREATE TABLE duplicate_table (id int, name varchar(20)); Query OK, 0 rows affected (0.01 sec)-- 插入測試數據 INSERT INTO duplicate_table VALUES (100, 'aaa'), (100, 'aaa'), (200, 'bbb'), (200, 'bbb'), (200, 'bbb'), (300, 'ccc'); Query OK, 6 rows affected (0.00 sec) Records: 6 Duplicates: 0 Warnings: 0思路:
-- 創建一張空表 no_duplicate_table,結構和 duplicate_table 一樣 CREATE TABLE no_duplicate_table LIKE duplicate_table; Query OK, 0 rows affected (0.00 sec)-- 將 duplicate_table 的去重數據插入到 no_duplicate_table INSERT INTO no_duplicate_table SELECT DISTINCT * FROM duplicate_table; Query OK, 3 rows affected (0.00 sec) Records: 3 Duplicates: 0 Warnings: 0-- 通過重命名表,實現原子的去重操作 RENAME TABLE duplicate_table TO old_duplicate_table, no_duplicate_table TO duplicate_table; Query OK, 0 rows affected (0.00 sec)-- 查看最終結果 SELECT * FROM duplicate_table; +------+------+ | id | name | +------+------+ | 100 | aaa | | 200 | bbb | | 300 | ccc | +------+------+ 3 rows in set (0.00 sec)6. 聚合函數
案例:
6.1 統計班級共有多少同學:
-- 使用 * 做統計,不受 NULL 影響 SELECT COUNT(*) FROM students; +----------+ | COUNT(*) | +----------+ | 4 | +----------+ 1 row in set (0.00 sec)-- 使用表達式做統計 SELECT COUNT(1) FROM students; +----------+ | COUNT(1) | +----------+ | 4 | +----------+ 1 row in set (0.00 sec)6.2 統計班級收集的 qq 號有多少:
-- NULL 不會計入結果 SELECT COUNT(qq) FROM students; +-----------+ | COUNT(qq) | +-----------+ | 1 | +-----------+ 1 row in set (0.00 sec)6.3 統計本次考試的數學成績分數個數:
-- COUNT(shuxue) 統計的是全部成績 SELECT COUNT(shuxue) FROM exam_result; +---------------+ | COUNT(shuxue) | +---------------+ | 6 | +---------------+ 1 row in set (0.00 sec)-- COUNT(DISTINCT shuxue) 統計的是去重成績數量 SELECT COUNT(DISTINCT shuxue) FROM exam_result; +------------------------+ | COUNT(DISTINCT shuxue) | +------------------------+ | 5 | +------------------------+ 1 row in set (0.00 sec)6.4 統計數學成績總分:
SELECT SUM(shuxue) FROM exam_result; +-------------+ | SUM(shuxue) | +-------------+ | 569 | +-------------+ 1 row in set (0.00 sec)-- 不及格 < 60 的總分,沒有結果,返回 NULL SELECT SUM(shuxue) FROM exam_result WHERE shuxue < 60; +-------------+ | SUM(shuxue) | +-------------+ | NULL | +-------------+ 1 row in set (0.00 sec)6.4 統計平均總分:
SELECT AVG(yuwen + shuxue + yingyu) 平均總分 FROM exam_result; +--------------+ | 平均總分 | +--------------+ | 297.5 | +--------------+6.5 返回英語最高分:
SELECT MAX(yingyu) FROM exam_result; +-------------+ | MAX(yingyu) | +-------------+ | 90 | +-------------+ 1 row in set (0.00 sec)6.6 返回 > 70 分以上的數學最低分:
SELECT MIN(shuxue) FROM exam_result WHERE shuxue > 70; +-------------+ | MIN(shuxue) | +-------------+ | 73 | +-------------+ 1 row in set (0.00 sec)7. group by子句的使用
在select中使用group by 子句可以對指定列進行分組查詢
select column1, column2, .. from table group by column;案例:
- 準備工作,創建一個雇員信息表
- EMP員工表
- DEPT部門表
- SALGRADE工資等級表
- 如何顯示每個部門的平均工資和最高工資???
- 顯示每個部門的每種崗位的平均工資和最低工資
- 顯示平均工資低于2000的部門和它的平均工資
- 統計各個部門的平均工資
- having和group by配合使用,對group by結果進行過濾
SQL查詢中各個關鍵字的執行先后順序 from > on> join > where > group by > with > having >select > distinct > order by > limit
總結
以上是生活随笔為你收集整理的MySQL的基本查询(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL的基本查询(一)
- 下一篇: MySQL的内置函数