1. 程式人生 > >MySQL下對錶中資料的操作

MySQL下對錶中資料的操作

新增

  • 使用INSERT語句進行新增
INSERT INTO <表名>(欄位1,欄位2) VALUES(資料1,資料2);

現在有如下student表:
這裡寫圖片描述

  • 執行INSERT INTO student(id,NAME) VALUES(1,'張三');
    這裡寫圖片描述

也可以批量新增:

INSERT INTO student(id,NAME) VALUES(2,'李四'),(3,'王五');
  • 這裡寫圖片描述

查詢

  • 使用SELECT從表中查詢資料,查詢結果被儲存在一個稱為結果集的表中。

    格式為:
SELECT <列名稱> FROM <表名稱>

1. 用於計算:

SELECT 1+2 FROM DUAL
//DUAL是一個虛擬表,在MySQL中因為FROM後面必須指定一張表,所以才設計的虛擬表以滿足SELECT語法格式

執行會顯示:

  • 這裡寫圖片描述

2. 查詢表中的一列:

SELECT NAME FROM student
  • 這裡寫圖片描述

3. 查詢表中的所有欄位:

  • 可以使用萬用字元*表示所有:
SELECT * FROM student
  • 這裡寫圖片描述

4. 按條件查詢:

使用

SELECT 欄位名 FROM 表名 WHERE 條件

查詢表中id等於3的內一行的全部欄位:

SELECT
* FROM student WHERE id=3
  • 這裡寫圖片描述

5.限制查詢的結果

使用 AND LIKE語句
現有如下表:這裡寫圖片描述
執行

SELECT * FROM student WHERE 組='B'

查詢結果:這裡寫圖片描述
顯示名字中帶有的:

select * from student where 組='B' and name like '%三'

這裡寫圖片描述
and後面是限制的欄位,like後面是限制的條件%是萬用字元.

6. 分組查詢:

現在有一張學生表:這裡寫圖片描述

統計每個組完成的任務總量:

SELECT 組 ,SUM(完成的量) AS 總量 FROM student GROUP
BY 組 //GROUP BY 分組顯示 //SUM() 求和

結果:這裡寫圖片描述

列出完成量小於3的人員:

SELECT NAME,完成的量 FROM student HAVING 完成的量<3
//HAVING    用於限制輸出結果

結果:這裡寫圖片描述

按完成的量從大到小排序:

SELECT * FROM student ORDER BY 完成的量 DESC
//ORDER BY  排序,預設從小到大
//DESC      從大到小
//ASC       從小到大

結果:這裡寫圖片描述

按完成的量從小到大排序,只顯示前3行:

SELECT * FROM student ORDER BY 完成的量 ASC LIMIT 3
//LIMIT     限制輸出的行數
//ASC       升序
//LIMIT     顯示的行數,也可以用2,3表示從第二行開始向下顯示3行(第一個數字的計數方式從0開始)

結果:這裡寫圖片描述

統計欄位中值出現的次數

SELECT 其他欄位,COUNT(*) AS 統計結果顯示的欄位 FROM 查詢的表 GROUP BY 統計的欄位

//其他欄位  查詢結果中需要顯示的其他欄位

已有表:
這裡寫圖片描述
顯示id中每個值出現的次數,執行:

SELECT id,COUNT(*) AS counts FROM test GROUP BY id

結果:
這裡寫圖片描述

查詢每個組中完成的量大於10的組

HAVING子句
- 在 SQL 中增加 HAVING 子句原因是,WHERE 關鍵字無法與合計函式一起使用。

SELECT 組,SUM(完成的量) FROM student GROUP BYHAVING SUM(完成的量)>10

結果:這裡寫圖片描述

子查詢

將一條查詢的結果作為另一個查詢的條件。

子查詢的語法:

select * from 表名 where 列名 > (子查詢)
  • 子查詢語句需要放在括號中
  • >這個是大於號,還可以使用別的比較運算子
  • 先執行子查詢部分,求出子查詢部分的值,再執行整個父查詢,返回最後的結果。
  • 還可以和update , insert , delete 一起使用。

    注意 :將子查詢作為比較運算子的條件時,需要保證子查詢返回的結果只有一條。

求完成的量大於平均數的人員**

對於下表:這裡寫圖片描述
執行:

SELECT * FROM student WHERE  完成的量 >(SELECT AVG(完成的量) FROM student)
  • AVG 求平均

結果:這裡寫圖片描述

ANY和ALL

  • ANY:表示任意一個。
  • ALL:表示所有。
    對於下表:這裡寫圖片描述

查詢B組中完成的量大於所有A組組員人:

SELECT * FROM student WHERE 組='B' AND 完成的量 > ALL (SELECT 完成的量 FROM student WHERE 組='A');

這裡寫圖片描述

查詢B組中完成的量大於任意A組的成員:

SELECT * FROM student WHERE 組='B' AND 完成的量 > ANY (SELECT 完成的量 FROM student WHERE 組='A');

這裡寫圖片描述

多列比較

第一列比較如果相等就繼續比較第二列,哪一列不同返回值就是比較那一列的結果:

  • 圖中第一列相等於是比較的就是第二列,2<3返回值就是1

這裡寫圖片描述

exists 和 not exists

  • EXISTS或者NOT EXISTS是把主查詢的欄位傳到後邊的查詢中作為條件,返回值是TRUE或者FALSE
    對於現有兩表:
    student:這裡寫圖片描述project:這裡寫圖片描述
SELECT * FROM project WHERE NOT EXISTS(SELECT * FROM student WHERE student.`組`=project.`P_id`)

查詢project表中p_id包含於student表中組的內容:
這裡寫圖片描述

SELECT * FROM project WHERE NOT EXISTS(SELECT * FROM student WHERE student.`組`=project.`P_id`)

查詢不包含的部分
這裡寫圖片描述

內連線

關鍵字:inner join on
拼合兩個表,只顯示滿足條件的行

舉例

現有a表:這裡寫圖片描述b表:這裡寫圖片描述

SELECT * FROM a INNER JOIN b ON a.`id`=b.`id`;

查詢a表和b表中id相同的部分:
這裡寫圖片描述

這條語句和下面這條效果相同:

SELECT * FROM a INNER JOIN b ON a.`id`=b.`id`;

表的別名

可以給 表起別名,表名後面可以定義表的別名用於後面的查詢表示式書寫

SELECT * FROM a student,b project WHERE student.`id`=project.`id`;
SELECT * FROM a student INNER JOIN b project ON student.`id`=project.`id`;

外連線

現有表a:這裡寫圖片描述表b:這裡寫圖片描述

笛卡爾積

SELECT * FROM a,b

這裡寫圖片描述
亮亮組合不重複的所有結果

左外連線

SELECT * FROM a LEFT JOIN b ON a.`id`=b.`id`;

第一個表全顯示,第二個表只顯示滿足條件的部分
這裡寫圖片描述

右外連線

SELECT * FROM a RIGHT JOIN b ON a.`id`=b.`id`;

第一個表只顯示滿足條件的第二個表全部顯示
這裡寫圖片描述

全外連線

將左外連線和右外連線的結果拼在一起

SELECT * FROM a LEFT JOIN b ON a.`id`=b.`id` UNION SELECT * FROM a RIGHT JOIN b ON a.`id`=b.`id`;

這裡寫圖片描述

SQL函式

函式 作用 語法格式 效果
AVG() 求平均 SELECT AVG(完成的量) FROM student 返回student表中完成的量的平均值
COUNT() 計算出現的個數 SELECT 組,COUNT(組) AS 人數 FROM student GROUP BY 組 統計student表中每個組的人數
SUM() 求和 SELECT SUM(完成的量) FROM student 返回student表中完成的量的總數
MAX() 最大值 SELECT MAX(完成的量) FROM student 返回student表中完成量的最大值
MIN() 最小值 SELECT MIN(完成的量) FROM student 返回student表中完成量的最小值
UCASE() 轉換為大寫 SELECT UCASE(name) FROM c 將表c中name列的值轉為大寫
LCASE() 轉換為小寫 SELECT LCASE(name) FROM c 將表c中name列的值轉為小寫
MID() 提取字串 SELECT MID(欄位,起始位置,擷取長度) FROM 表 從指定欄位中提取字串,擷取長度可選
LENGTH() 獲取字串長度 SELECT LENGTH(欄位) FROM 表 返回指定字元欄位中的字串的長度
ROUND() 保留小數位 SELECT ROUND(AVG(完成的量),3) FROM student 將平均值保留3位小數
NOW() 返回當前系統時間 SELECT NOW() FROM DUAL DUAL是虛擬表,返回結果是當前系統時間
MOD() 求餘 SELECT MOD(5,2) FROM DUAL 求餘數結果是1
CONCAT() 拼接字串 SELECT CONCAT('hello','java') FROM DUAL 返回值是hellojava
FORMAT() 格式化數字 SELECT FORMAT(1234567.4854,1) 結果:1,234,567f.5整數部分3位一分,小數部分保留並四捨五入,FORMAT第二個引數為保留的小數位數
CONCAT_WS() 使用指定連線符連結字串 SELECT CONCAT_WS('-','hello','word') 結果:hello-word

修改資料

使用UPDATE SET可以修改已有的資料

根據id號修改學生的姓名

UPDATE student SET NAME='王興' WHERE id=8

將id為偶數的學生的姓名改為大劉

UPDATE student SET NAME='大劉' WHERE MOD(id,2)=0;

效果:這裡寫圖片描述

同時修改多行多列

UPDATE student SET NAME='張龍',完成的量=6 WHERE id BETWEEN 1 AND 3

這裡寫圖片描述

刪除資料

刪除表a中id為4的內一行

DELETE FROM a WHERE id=4