MySQL數據庫詳解(二)

緊跟上一篇文章,我們繼續學習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 保存點名 -- 撤銷保存點
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章