MySQL下對錶中資料的操作
阿新 • • 發佈:2019-01-08
新增
- 使用
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 BY 組 HAVING 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