緊跟上一篇文章,我們繼續學習MySQL數據庫。
數據庫意義:數據存儲,數據管理
DML語言:數據操作語言
- Insert
- update
- delete
1.添加Insert
語法:insert into 表名([字段名1,字段2,字段3])values('值1'),('值2'),('值3',....)
舉例:
-- 插入語句(添加) -- insert into 表名([字段名1,字段2,字段3])values('值1'),('值2'),
INSERT INTO `grade`(`gradename`) VALUES('大四')
-- 由於主鍵自增我們可以省略 (如果不寫表的字段,他就會一一匹配)
INSERT INTO `grade` VALUES('大三')
-- 插入多個字段
INSERT INTO `grade`(`gradename`) VALUES('大二'),('大一')
INSERT INTO `student`(`name`,`pwd`,`sex`) VALUES ('張三','aaaaaa','男')
注意:
1. 字段和字段之間使用 英文逗號 隔開
2. 字段是可以省略的,但是後面的值必須要要一一對應,不能少
3. 可以同時插入多條數據,VALUES 後面的值,需要使用,隔開即可 VALUES(),(),....
2.修改update
語法:UPDATE 表名 set colnum_name = value,[colnum_name = value,....] where [條 件]
舉例:
-- 修改學員名字,帶了簡介
UPDATE `student` SET `name`='哥哥' WHERE id = 1;
-- 不指定條件的情況下,會改動所有表!
UPDATE `student` SET `name`='長江7號'
-- 修改多個屬性,逗號隔開
UPDATE `student` SET `name`='爸爸',`email`='[email protected]' WHERE id = 1;
注意:
1.colnum_name 是數據庫的列,儘量帶上``
2.條件,篩選的條件,如果沒有指定,則會修改所有的列
3.value,是一個具體的值,也可以是一個變量
4.多個設置的屬性之間,使用英文逗號隔開
3.刪除
(1)delete命令
語法:delete from 表名 [where 條件]
舉例:
-- 刪除數據 (避免這樣寫,會全部刪除)
DELETE FROM `student`
-- 刪除指定數據
DELETE FROM `student`WHERE id = 1;
(2)TRUNCATE 命令
作用:完全清空一個數據庫表,表的結構和索引約束不會變!
-- 清空 student 表
TRUNCATE `student`
(3)兩者間的區別:
-
相同點:都能刪除數據,都不會刪除表結構
-
不同:
- TRUNCATE 重新設置 自增列 計數器會歸零
- TRUNCATE 不會影響事務注意: DELETE刪除的問題 ,重啓數據庫,現象
InnoDB 自增列會重1開始 (存在內存當中的,斷電即失) MyISAM 繼續從上一個自增量開始 (存在文件中的,不會丟失
DQL語言:(Data Query LANGUAGE : 數據查詢語言)
- 所有的查詢操作都用 Select
- 數據庫中最核心的語言,最重要的語句
- 使用頻率最高的語句
1.Select完整的語法:按照順序
2.指定查詢字段
語法:SELECT 字段,... FROM 表
-- 查詢全部的學生 SELECT 字段 FROM 表
SELECT * FROM student
-- 查詢指定字段
SELECT `StudentNo`,`StudentName` FROM student
-- 別名,給結果起一個名字 AS 可以給字段起別名,也可以給表起別名
SELECT `StudentNo` AS 學號,`StudentName` AS 學生姓名 FROM student AS s
-- 函數 Concat(a,b) 將兩個字符串連接起來
SELECT CONCAT('姓名:',StudentName) AS 新名字 FROM student
-- 發現重複數據,去重
SELECT DISTINCT `StudentNo` FROM result
SELECT VERSION() -- 查詢系統版本 (函數)
SELECT 100*3-1 AS 計算結果 -- 用來計算 (表達式)
SELECT @@auto_increment_increment -- 查詢自增的步長 (變量)
-- 學員考試成績 + 1分查看
SELECT `StudentNo`,`StudentResult`+1 AS '提分後' FROM result
3.where 條件子句
作用:檢索數據中 符合條件 的值,搜索的條件由一個或者多個表達式組成!結果 布爾值
(1)邏輯運算符
舉例:
-- and &&
SELECT studentNo,`StudentResult` FROM result WHERE StudentResult>=95 && StudentResult<=100
-- != not
SELECT studentNo,`StudentResult` FROM result WHERE NOT studentNo = 1000
(2)比較運算符(模擬查詢)
舉例:
-- like結合 %(代表0到任意個字符) _(一個字符)
SELECT `StudentNo`,`StudentName` FROM `student` WHERE StudentName LIKE '劉_'-- 查詢姓劉的同學,名字後面只有一個字的
SELECT `StudentNo`,`StudentName` FROM `student` WHERE StudentName LIKE '%嘉%'-- 查詢名字中間有嘉字的同學 %嘉%
-- in (具體的一個或者多個值)
SELECT `StudentNo`,`StudentName` FROM `student` WHERE `Address` IN ('安徽','河南洛陽');
-- null not null
SELECT `StudentNo`,`StudentName` FROM `student` WHERE address='' OR address IS NULL
4.聯表查詢 :關鍵字:JOIN
- join (連接的表) on(判斷的條件) 連接查詢 -
- where 等值查詢
七種方式:
主要的三種方式的區別:
操作 | 描述 |
---|---|
Inner join | 如果表中至少有一個匹配,就返回行 |
left join | 會從左表中返回所有的值,即使右表中沒有匹配 |
right join | 會從右表中返回所有的值,即使左表中沒有匹配 |
舉例說明:
-- 查詢參加了考試的同學(學號,姓名,科目編號,分數)
SELECT * FROM student S
ELECT * FROM result
/* 思路
1. 分析需求,分析查詢的字段來自哪些表,(連接查詢)
2. 確定使用哪種連接查詢? 7種 確定交叉點(這兩個表中哪個數據是相同的)
3. 判斷的條件 : 學生表的中 studentNo = 成績表 studentNo */
SELECT s.studentNO,studentName,SubjectNo,StudentResult FROM student AS s
INNER JOIN result AS r
ON s.studentNO = r.studentNO
-- Right Join
SELECT s.studentNO,studentName,SubjectNo,StudentResult FROM student s
RIGHT JOIN result r
ON s.studentNO = r.studentNO
-- Left Join
SELECT s.studentNO,studentName,SubjectNo,StudentResult FROM student s
LEFT JOIN result r
ON s.studentNO = r.studentNO
5.自連接:自己的表和自己的表連接,核心:一張表拆爲兩張一樣的表即可
CREATE TABLE `category` (
`categoryid` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主題id',
`pid` INT(10) NOT NULL COMMENT '父id',
`categoryName` VARCHAR(50) NOT NULL COMMENT '主題名字',
PRIMARY KEY (`categoryid`)
) ENGINE=INNODB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8
INSERT INTO `category` (`categoryid`, `pid`, `categoryName`) VALUES('2','1','信息技術'), ('3','1','軟件開發'), ('4','3','數據庫'), ('5','1','美術設計'), ('6','3','web開發'), ('7','5','ps技術'), ('8','2','辦公信息');
-- 查詢父子信息: 把一張表看爲兩個一模一樣的表
SELECT a.`categoryName` AS '父欄目',b.`categoryName` AS '子欄目'
FROM `category` AS a,`category` AS b
WHERE a.`categoryid` = b.`pid`
6.分頁和排序
(1)排序
-- 排序 : 升序 ASC , 降序DESC
-- ORDER BY 通過那個字段排序,怎麼排
ORDER BY StudentResult ASC
ORDER BY StudentResult DESC
(2)分頁
-- 語法: limit 起始值,頁面的大小
-- 第一頁 limit 0,5 (1-1)*5
-- 第二頁 limit 5,5 (2-1)*5
-- 第N頁 limit 0,5 (n-1)* pageSize,pageSize
-- 【pageSize:頁面大小】
-- 【(n-1)* pageSize:起始值】
-- 【n :當前頁 】
-- 【數據總數/頁面大小 = 總頁數】
7.子查詢(由裏及外)
本質 : 在where語句中嵌套一個子查詢語句
-- 查詢所有數據庫結構-1 的學生學號
SELECT `StudentNo`,`SubjectNo`,`StudentResult` FROM `result`
WHERE SubjectNo = (
SELECT SubjectNo FROM `subject`
WHERE SubjectName = '數據庫結構-1'
) ORDER BY StudentResult DESC
8.分組和過濾
-- 查詢不同課程的平均分,高分,低分,平均分大於80 -- 核心: (根據不同的課程分組)
SELECT SubjectName, AVG(StudentResult) AS 平均分,MAX(StudentResult) AS 高 分,MIN(StudentResult) AS 低分 FROM result r
INNER JOIN `subject` sub
ON r.`SubjectNo` = sub.`SubjectNo`
GROUP BY r.SubjectNo 分組
HAVING 平均分>80 過濾
MySQL函數
官網:https://dev.mysql.com/doc/refman/5.7/en/func-op-summary-ref.html
1.常用函數
-- 數學運算
SELECT ABS(-8)
-- 絕對值
SELECT CEILING(9.4)
-- 向上取整
SELECT FLOOR(9.4)
-- 向下取整
SELECT RAND()
-- 返回一個 0~1 之間的隨機數
SELECT SIGN(10) -- 判斷一個數的符號 0-0 負數返回-1,正數返回 1
-- 字符串函數
SELECT CHAR_LENGTH('即使再小的帆也能遠航') -- 字符串長度
SELECT CONCAT('我','愛','你們') -- 拼接字符串
SELECT INSERT('我愛編程helloworld',1,2,'超級熱愛') -- 查詢,從某個位置開始替換某個長 度 SELECT LOWER('KuangShen') -- 小寫字母
SELECT UPPER('KuangShen') -- 大寫字母
SELECT INSTR('kuangshen','h') -- 返回第一次出現的子串的索引
SELECT REPLACE('堅持就能成功','堅持','努力') -- 替換出現的指定字符串
SELECT SUBSTR('堅持就能成功',4,6) -- 返回指定的子字符串 (源字符串,截取的位置,截 取的長度)
SELECT REVERSE('清晨我上馬') -- 反轉
-- 查詢姓 周的同學,替代名字 鄒
SELECT REPLACE(studentname,'周','鄒') FROM student WHERE studentname LIKE '周%'
-- 時間和日期函數 (記住)
SELECT CURRENT_DATE() -- 獲取當前日期
SELECT CURDATE() -- 獲取當前日期
SELECT NOW() -- 獲取當前的時間
SELECT LOCALTIME() -- 本地時間
SELECT SYSDATE() -- 系統時間
-- 系統
SELECT SYSTEM_USER()
SELECT USER()
SELECT VERSION()
2.聚合函數
函數名稱 | 描述 |
---|---|
COUNT() | 計數 |
SUM() | 求和 |
AVG() | 平均值 |
MAX() | 最大值 |
MIN() | 最小值 |
-- 都能夠統計 表中的數據 ( 想查詢一個表中有多少個記錄,就使用這個count() )
SELECT COUNT(`BornDate`) FROM student; -- Count(字段),會忽略所有的 null 值
SELECT COUNT(*) FROM student; -- Count(*),不會忽略 null 值, 本質 計算行數
SELECT COUNT(1) FROM result; -- Count(1),不會忽略忽略所有的 null 值 本質 計算 行數
SELECT SUM(`StudentResult`) AS 總和 FROM result
SELECT AVG(`StudentResult`) AS 平均分 FROM result
SELECT MAX(`StudentResult`) AS 高分 FROM result
SELECT MIN(`StudentResult`) AS 低分 FROM result
索引
MySQL官方對索引的定義爲:索引(Index)是幫助MySQL高效獲取數據的數據結構。
1.索引的分類
- 主鍵索引 (PRIMARY KEY ) :唯一的標識,主鍵不可重複,只能有一個列作爲主鍵
- 唯一索引 (UNIQUE KEY) :避免重複的列出現,唯一索引可以重複,多個列都可以標識位 唯一索引
- 常規索引 (KEY/INDEX) 默認的, index。key 關鍵字來設置
- 全文索引 (FullText)
– 在特定的數據庫引擎下才有,MyISAM
– 快速定位數據
2.索引的基本語法
-- 顯示所有的索引信息
SHOW INDEX FROM student
-- 增加一個全文索引 (索引名) 列名
ALTER TABLE school.student ADD FULLTEXT INDEX `studentName`(`studentName`);
-- EXPLAIN 分析sql執行的狀況
EXPLAIN SELECT * FROM student; -- 非全文索引
EXPLAIN SELECT * FROM student WHERE MATCH(studentName) AGAINST('劉');
3.索引的原則
- 索引不是越多越好
- 不要對進程變動數據加索引
- 小數據量的表不需要加索引
- 索引一般加在常用來查詢的字段上!
事務:要麼都成功,要麼都失敗
1.事務的原則
- 原子性(Atomicity):要麼都成功,要麼都失敗
- 一致性(Consistency):事務前後的數據完整性要保證一致
- 持久性(Durability)— 事務提交:事務一旦提交則不可逆,被持久化到數據庫中!
- 隔離性(Isolation)
事務的隔離性是多個用戶併發訪問數據庫時,數據庫爲每一個用戶開啓的事務,不能被其他事務的操作 數據所幹擾,多個併發事務之間要相互隔離。
2.事務執行
-- mysql 是默認開啓事務自動提交的
SET autocommit = 0 /* 關閉 */
SET autocommit = 1 /* 開啓(默認的) */
-- 手動處理事務
SET autocommit = 0 -- 關閉自動提交
-- 事務開啓
START TRANSACTION -- 標記一個事務的開始,從這個之後的 sql 都在同一個事務內
INSERT xx
INSERT xx
-- 提交: 持久化 (成功!) COMMIT
-- 回滾: 回到的原來的樣子 (失敗!) ROLLBACK
-- 事務結束
SET autocommit = 1 -- 開啓自動提交
-- 瞭解
SAVEPOINT 保存點名 -- 設置一個事務的保存點
ROLLBACK TO SAVEPOINT 保存點名 -- 回滾到保存點
RELEASE SAVEPOINT 保存點名 -- 撤銷保存點