日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

MySQL的基本查询(二)

發布時間:2024/4/11 数据库 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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

注意:這個操作慎用

  • 只能對整表操作,不能像 DELETE 一樣針對部分數據操作;
  • 實際上 MySQL 不對數據操作,所以比 DELETE 更快
  • 會重置 AUTO_INCREMENT 項
  • -- 準備測試表 CREATE TABLE for_truncate ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(20) ); Query OK, 0 rows affected (0.16 sec)-- 插入測試數據 INSERT INTO for_truncate (name) VALUES ('A'), ('B'), ('C'); Query OK, 3 rows affected (1.05 sec) Records: 3 Duplicates: 0 Warnings: 0-- 查看測試數據 SELECT * FROM for_truncate; +----+------+ | id | name | +----+------+ | 1 | A | | 2 | B | | 3 | C | +----+------+ 3 rows in set (0.00 sec) -- 截斷整表數據,注意影響行數是 0,所以實際上沒有對數據真正操作 TRUNCATE for_truncate; Query OK, 0 rows affected (0.10 sec)-- 查看刪除結果 SELECT * FROM for_truncate; Empty set (0.00 sec) -- 再插入一條數據,自增 id 在重新增長 INSERT INTO for_truncate (name) VALUES ('D'); Query OK, 1 row affected (0.00 sec) -- 查看數據 SELECT * FROM for_truncate; +----+------+ | id | name | +----+------+ | 1 | D | +----+------+ 1 row in set (0.00 sec)-- 查看表結構,會有 AUTO_INCREMENT=2 項 SHOW CREATE TABLE for_truncate\G *************************** 1. row *************************** Table: for_truncate Create Table: CREATE TABLE `for_truncate` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(20) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 1 row in set (0.00 sec)

    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工資等級表
    • 如何顯示每個部門的平均工資和最高工資???
    select deptno,avg(sal),max(sal) from EMP group by deptno;
    • 顯示每個部門的每種崗位的平均工資和最低工資
    select avg(sal),min(sal),job, deptno from EMP group by deptno, job;
    • 顯示平均工資低于2000的部門和它的平均工資
    • 統計各個部門的平均工資
    select avg(sal) from EMP group by deptno
    • having和group by配合使用,對group by結果進行過濾
    select avg(sal) as myavg from EMP group by deptno having myavg<2000;

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

    總結

    以上是生活随笔為你收集整理的MySQL的基本查询(二)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。