1. 程式人生 > 實用技巧 >MySql學習筆記--詳細整理--上

MySql學習筆記--詳細整理--上

目錄

MySql

MySql安裝

  • 壓縮包安裝,解壓後放入指定的環境目錄中

  • 新增環境變數,我的電腦--屬性--高階設定--環境變數;將MySq的bin目錄的路徑放入Path中。

  • 在MySql下新建配置檔案my.ini,新增以下內容,date目錄會自動生成。

    [mysql]
    # 設定mysql客戶端預設字符集
    default-character-set=utf8 
    [mysqld]
    #設定3306埠
    port = 3306 
    # 設定mysql的安裝目錄
    basedir=D:\Environments\mysql-5.7.31\mysql-5.7.31\
    # 設定mysql資料庫的資料的存放目錄
    datadir=D:\Environments\mysql-5.7.31\mysql-5.7.31\data\
    # 允許最大連線數
    max_connections=200
    # 服務端使用的字符集預設為8位元編碼的latin1字符集
    character-set-server=utf8
    # 建立新表時將使用的預設儲存引擎
    default-storage-engine=INNODB
    #第一次跳過密碼驗證
    skip-grant-tablesini
    
  • 啟動管理員模式下的CMD,將路徑切換到MySql的bin目錄下,輸入mysqld -install(安裝mysql)。

  • 輸入mysqld --initialize-lnsecure --user=mysql 初始化資料檔案。

  • 輸入net start mysql啟動mysql服務,再輸入mysql -u root -p進入mysql管理介面,按兩次回車。

  • 輸入update mysql .user set authentication string=password('123456') where user='root' and Host = 'localhost'; 後回車。

  • flush privileges重新整理許可權。

  • 刪除my.ini最後一句skip-grant-tablesini。

  • 啟動:net start mysql;關閉:net stop mysql。

連線資料庫

CMD命令列連線:mysql -u root -p123456

檢視所有的資料庫:show databases;

切換資料庫:use school; (use 資料庫名)

檢視資料庫中所有的表:show tables;

查看錶中的所有資訊:describe student;

建立資料庫:create database west;

sql的註釋: --

操作資料庫

建立資料庫:creat database (if not exists) west;

刪除資料庫:drop database(if exists) west;

使用資料庫:use school;如果表名或者欄位名是一個特殊字元,需要帶``。

檢視所有的資料庫:show databases;

資料庫的列型別

數值

  • tinyint 十分小的資料 一個位元組
  • smallint 較小的資料 兩個位元組
  • mediumint 中等大小 三個位元組
  • int 標準的整數 四個位元組 常用的
  • bigint 較大的資料 八個位元組
  • float 浮點數 四個位元組
  • double 浮點數 八個位元組
  • decimal 字串形式的浮點數 金融計算的時候使用

字串

  • char 字串 固定大小的 0-255
  • varchar 可變字串 0-65535 常用的
  • tinytext 微型文字 2^8-1
  • text 文字串 2^16-1

時間日期

  • date YYYY-MM-DD 日期格式
  • time HH:mm:ss 時間格式
  • datetime YYYY-MM-DD HH:mm:ss 常用的
  • timestamp 時間戳 1970.1.1到現在的毫秒數
  • year 年份表示

null:沒有值,未知 。

資料庫的欄位屬性

Unsigned:無符號

  • 無符號的整數
  • 不能宣告為負數

zerofill:零填充

  • 不足的位數使用0來填充

自增:自動在上一條記錄的基礎上加1(預設)

  • 通常用來設計唯一的主鍵,必須是整數型別的
  • 可以自定義設定主鍵自增的起始值和步長

Null和not null

  • 如果設定為not null如果不給它賦值就會報錯
  • Null:如果不賦值,預設就是NUll

建立資料庫

--目標:建立一個studens資料庫
--表的名字和欄位儘量使用``括起來
--字串使用單引號括起來
--語句後面加,(英文的),最後一行不加
--PRIMARY KEY設定主鍵,一般一個表只有一個唯一的主鍵
CREATE TABLE IF NOT EXISTS `students` (
    `id` INT ( 4 ) NOT NULL AUTO_INCREMENT COMMENT '學號',
	`name` VARCHAR ( 20 ) NOT NULL DEFAULT '匿名' COMMENT '姓名',
	`pwd` VARCHAR ( 20 ) NOT NULL DEFAULT '123456' COMMENT '密碼',
	`sex` VARCHAR ( 2 ) NOT NULL DEFAULT '女' COMMENT '性別',
	`birthday` DATETIME DEFAULT NULL COMMENT '出生日期',
	`addresws` VARCHAR ( 50 ) DEFAULT NULL COMMENT '地址',
	`email` VARCHAR ( 30 ) DEFAULT NULL COMMENT '郵箱',
	PRIMARY KEY ( `id` ) 
)ENGINE INNODB DEFAULT Charset = utf8

格式

CREATE TABLE IF NOT EXISTS] '表名'(
	'欄位名' 列的型別[長度] [屬性] [索引] [註釋],
    '欄位名' 列的型別[長度] [屬性] [索引] [註釋],
    '欄位名' 列的型別[長度] [屬性] [索引] [註釋],
    ...
    '欄位名' 列的型別[長度] [屬性] [索引] [註釋]
)[表型別][字符集][註釋]

檢視建立資料庫的語句

show create database school;

檢視建立表的語句

show create table students;

查看錶的結構

desc students;

資料庫引擎engine

INNODB:預設使用

MYISAM:以前使用

INNODB MYISAM
事務支援 支援 不支援
資料行鎖定 支援 不支援
外來鍵 支援 不支援
全文索引 不支援 支援
表空間大小 較大 較小

常規使用操作:

  • MYISAM:節約空間,速度較快
  • INNODB:安全性高,事物的處理,多表多使用者操作

所有的資料庫檔案都在date目錄下,本質還是檔案的儲存!

MySQL引擎在物理檔案上的區別:

  • INNODB:在資料庫中只有一個**.frm檔案,以及上級目錄下的ibdata1檔案
  • MYISAM:對應的檔案
    • *.frm表結構的定義檔案
    • *.MYD資料檔案 (data)
    • *.MYI索引檔案 (index)

設定資料庫表的字符集編碼

CHARSET=utf8

不設定的話是MySQL的預設字符集編碼(不支援中文)。

在my.ini中配置預設的編碼

charter-set-server=utf8

修改刪除表

修改表名:ALTER TABLE 舊錶名 RENAME AS 新表名

  • ALTER TABLE student RENAME AS student1;

增加欄位:ALTER TABLE 表名 ADD 欄位 列屬性

  • ALTER TABLE student1 ADD phone int(11);

修改表的欄位

  • 重新命名:ALTER TABLE 表名 CHANGE 舊欄位名 新欄位名
    • ALTER TABLE student1 CHANGE phone phone1
  • 修改約束:ALTER TABLE 表名 MODIFY 欄位名 屬性
    • ALTER TABLE student1 MODIFY phone VARCHAR(11)

刪除表的欄位:ALTER TABLE DROP 欄位名

  • ALTER TABLE student1 DROP phone1

刪除表:DROP TABLE (if exists) student1

所有的建立和刪除操作儘量加上判斷是否存在(if exists),以免報錯。

資料管理

外來鍵

外來鍵(瞭解即可):1.在建立表的時候增加約束

CREATE TABLE `grade`(
`gradeid` INT(10) NOT NULL AUTO_INCREMENT COMMENT '年級ID',
`gradename` VARCHAR(10) NOT null COMMENT '年級名稱',
primary KEY(`gradeid`)
)ENGINE INNODB DEFAULT CHARSET=utf8

------------------------------------------------------------------------------------------------------------
CREATE TABLE `student` (
  `id` int(4) NOT NULL AUTO_INCREMENT COMMENT '學號',
  `name` varchar(20) NOT NULL DEFAULT '匿名' COMMENT '姓名',
  `pwd` varchar(20) NOT NULL DEFAULT '123456' COMMENT '密碼',
  `sex` varchar(2) NOT NULL DEFAULT '女' COMMENT '性別',
  `birthday` datetime DEFAULT NULL COMMENT '出生日期',
	`gradeid` INT(10) NOT NULL COMMENT'學生年級',
  `addresws` varchar(50) DEFAULT NULL COMMENT '地址',
  `email` varchar(30) DEFAULT NULL COMMENT '郵箱',
  PRIMARY KEY (`id`),
	KEY `FK_gradeid` (`gradeid`),
	CONSTRAINT `FK_gradeid` FOREIGN KEY (`gradeid`) REFERENCES `grade` (`gradeid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

刪除有外來鍵關係的表的時候,必須先刪除引用別人的表(從表),再刪除被引用的表(主表)。

2.修改表新增外來鍵約束

  • ALTER TABLE 表 ADD CONSTRAINT 約束名 FOREIGN KEY(作為外來鍵的列) REFERENCES 哪個表(哪個欄位)

  • ALTER TABLE student ADD CONSTRAINT FK_gradeid FOREIGN KEY(gradeid) REFERENCES grade (gradeid);

以上都是物理外來鍵,資料庫級別的外來鍵,不建議使用。(避免資料庫過多造成困擾)

最佳辦法:資料庫就是單純的表,只用來存資料,只有行(資料)和列(欄位)。如果想使用多張表,用程式去實現(不用外來鍵)

DML語言

DML語言

DML語言:資料操作語言。

新增

語法格式:INSERT INTO 表名(欄位1,欄位2,欄位3...)VALUES ('值1','值2','值3'...),('值1','值2','值3'...),('值1','值2','值3'...)

--新增 一定要保證資料和欄位一一對應!!!!
INSERT INTO 表名(欄位1,欄位2,欄位3...)VALUES ('值1','值2','值3'...)

--由於主鍵自增可以省略(如果不寫表的欄位,它就會一一匹配)
INSERT INTO `grade`(`gradename`) VALUES ('大一')

--插入多條資料
INSERT INTO `grade`(`gradename`) VALUES ('大二'),('大三'),('大四')

INSERT INTO `students`(`name`) VALUES ('張三')

INSERT INTO `students`(`name`,`pwd`,`sex`) 
VALUES ('張三','bbbbb','男'),('李四','bbbbb','男'),('王五','bbbbb','男')

--省略欄位
INSERT INTO `students` values ('5','麻子','wwww','男','2010-01-01','武漢','email')

注意

  • 欄位和欄位之間用英文逗號隔開
  • 欄位是可以省略的,但是插入的值必須一一對應
  • 可以同時插入多條資料,每一條資料用(),隔開

修改

語法格式:update 表名 set 欄位=value , 欄位=value where 欄位 = ?

--修改學生的名字
UPDATE `students` SET `name`='周' WHERE id = 1

--不指定條件會改動表中所有的名字
UPDATE `students` SET `name`='周'

--修改多個條件
UPDATE `students` SET `name`='李',`pwd`='666666' WHERE id =2

--通過多個條件定位資料
UPDATE `students` SET `name`='王'  WHERE id=4 AND sex='男'

--變數
UPDATE `students` SET `birthday`=CURRENT_DATE  WHERE id=4 AND sex='男'

條件:where子句, id等於某個值 大於某個值 在某個區間

操作符 含義 範圍 結果
= 等於 5=6 false
<>或!= 不等於 5<>6 true
> 大於
< 小於
<= 小於等於
.>= 大於等於
BETWEEN....and... 在什麼什麼之間
AND &&
OR ||或

注意

  • 欄位是資料庫的列,儘量帶上``
  • where後面是篩選的條件,如果沒有指定則會修改所有的列
  • value是一個具體的值也可以是變數(比如時間,日期)
  • 多個設定屬性之間用英文的逗號隔開

刪除

語法格式:delete from 表名 where 條件

--刪除資料
DELETE FROM `students` WHERE id=7

--刪除所有資料(避免)  表的自增列不會重置
DELETE FROM `students`

TRUNCATE:完全清空一個數據庫表的資料,表的結構和索引約束不變。

TRUNCATE TABLE 表名;清空表後表的自增列也會重置,計數器歸0,而且不會影響事物。

CREATE TABLE `test`(
	`id` INT(4) NOT NULL AUTO_INCREMENT,
	`coll` VARCHAR(8) NOT NULL,
	PRIMARY KEY (`id`)
)ENGINE INNODB DEFAULT CHARSET=utf8

INSERT INTO `test`(`coll`) VALUES('1'),('2'),('3') 
--不影響自增
DELETE FROM `test`
--自增歸0
TRUNCATE TABLE `test`

瞭解:delete刪除的時候,重啟資料庫

  • innoDB 自增列會從1開始(存在記憶體中的 斷電即失)
  • MYISAM 繼續從上一個自增兩開始(存在檔案中的 不會消失)

DQL查詢資料(重點)

data query language:資料查詢語言

  • 所有的查詢操作都用它 select
  • 簡單的查詢,複雜的查詢都能做
  • 資料庫最核心的語言

查詢

查詢語法:SELECT 欄位 FROM 表

--查詢全部的學生   SELECT 欄位 FROM 表
SELECT * FROM student1

--查詢指定欄位
SELECT `StudentNo`,`StudentName` FROM student1

--給列起別名(也可以給表起別名)
SELECT `StudentNo` AS '學號',`StudentName` AS '姓名' FROM student1

--函式 Concat(a,b)
SELECT CONCAT('姓名:',StudentName) AS 新名字 FROM student1

去重

去重:distinct(去除查詢結果中重複的資料)

--查詢哪些同學參加了考試 有成績
SELECT * FROM `result` --查詢全部考試的成績

SELECT `studentno` FROM `result` --查詢哪些同學參加了考試
--發現重複資料 去重
SELECT DISTINCT `studentno` FROM `result`

資料庫的列(表示式)

--查詢系統的版本(函式)
SELECT VERSION()
--計算結果
SELECT 100*3-5 AS --計算結果
--查詢自增的步長(變數)
SELECT @@AUTO_INCREMENT_INCREMENT

--學生的成績 +1
SELECT `studentno`,`studentresult`+1 AS '提1分' FROM `result`

where條件子句

作用:檢索資料中符合符合條件的值

SELECT `studentno`,`studentresult` FROM `result`

--查詢成績在80-100中間的  and   &&
SELECT `studentno`,`studentresult` FROM `result` WHERE `studentresult`>=80 AND `studentresult` <=100
SELECT `studentno`,`studentresult` FROM `result` WHERE `studentresult`>=80 && `studentresult` <=100

--模糊查詢(區間)
SELECT `studentno`,`studentresult` FROM `result` WHERE studentresult BETWEEN 80 AND 100

--查詢學號不為1000的學生成績   !=   not
SELECT `studentno`,`studentresult` FROM `result` WHERE studentno != 1000
SELECT `studentno`,`studentresult` FROM `result` WHERE NOT studentno = 1000

模糊查詢

模糊查詢:比較運算子

運算子 語法 描述
IS NULL a is null 如果為null 則結果為真
IS NOT NULL a is not null 如果為not null 則結果為真
BETWEEN a between b and c a在b和c之間則結果為真
LIKE a like b SQL匹配
in a in(a1,a2,a3...) 假設a在a1,a2....中
==========================================模糊查詢======================================================

--查詢姓張的同學
--like結合 %(代表0到任意個字元) _(一個字元)
SELECT `studentno`,`studentname` FROM `student1` WHERE studentname LIKE '張%'

--查詢姓趙的同學 姓後面有一個字的
SELECT `studentno`,`studentname` FROM `student1` WHERE studentname LIKE '趙_'

--查詢名字中帶有強字的   %強%
SELECT `studentno`,`studentname` FROM `student1` WHERE studentname LIKE '%強%'

=========in=============
--查詢1001,1000學生資訊
SELECT `studentno`,`studentname` FROM `student1` WHERE studentno in (1000,1001)

--查詢在北京的學生
SELECT `studentno`,`studentname` FROM `student1` WHERE address IN ('北京')

===========null  not null===============

--查詢生日為空的學生 
SELECT `studentno`,`studentname` FROM `student1` WHERE borndate IS NULL OR borndate=''
address
--查詢地址不為空的學生 
SELECT `studentno`,`studentname` FROM `student1` WHERE address IS NOT NULL 

連表查詢

join:

==================================連表查詢join===============================================
--查詢參加了考試的同學(學號 姓名 科目編號 分數)
SELECT r.studentno,`studentname`,`subjectno`,`studentresult` 
FROM `result` AS r 
INNER JOIN `student1` AS s 
WHERE r.studentno = s.studentno

-- INNER JOIN語句中用ON和where都可以
--where在left和right語句中不能使用

--join on 連線查詢
--where 等值查詢

=====RIGHT JOIN=======
SELECT s.studentno,`studentname`,`subjectno`,`studentresult` 
FROM `student1` s
RIGHT JOIN `result` r
ON s.studentno=r.studentno


=====LEFT JOIN=======
SELECT s.studentno,`studentname`,`subjectno`,`studentresult` 
FROM `student1` s
LEFT JOIN `result` r
ON s.studentno=r.studentno

--查詢缺考的同學
SELECT s.studentno,`studentname`,`subjectno`,`studentresult` 
FROM `student1` s
LEFT JOIN `result` r
ON s.studentno=r.studentno
WHERE studentresult IS NULL

--查詢參加考試的同學的資訊(學號,姓名,科目名,分數)
SELECT r.studentno,`studentname`,`subjectname`,`studentresult` 
FROM `student1` s
RIGHT JOIN `result` r
ON r.studentno=s.studentno
INNER JOIN `subject` sub
ON r.subjectno=sub.subjectno

--查詢學生所屬的年級(學號,學生姓名,年級名稱)
SELECT s.studentno,studentname,gradename
FROM student1 s
INNER JOIN `grade` g
ON s.gradeid=g.gradeid

--查詢科目所屬的年級(科目名稱,年級名稱)
SELECT subjectname, gradename
FROM `grade` g
INNER JOIN `subject` s
ON g.gradeid=s.gradeid

--查詢參加了C語言-1考試的同學(學號 姓名 科目 分數)
SELECT s.studentno,studentname,subjectname,studentresult
FROM student1 s
INNER JOIN `result` r
ON s.studentno=r.studentno
INNER JOIN `subject` sub
on r.subjectno=sub.subjectno
where subjectname='C語言-1'

操作 描述
inner join 如果表中至少有一個人匹配,就返回行
left join 會從左表中返回所有的值,即使右表中沒有匹配
right join 會從右表中返回所有的值,即使左表中沒有匹配

自連線(瞭解)

自連線:把一張表拆成兩張一樣的表

--查詢父子資訊  把一張表分為兩個一樣的表
SELECT a.`categoryName`AS '父欄目',b.`categoryName` AS 子欄目
FROM `category` AS a,`category` AS b
WHERE a.`categoryid`=b.`pid`

分頁和排序

排序:

====================分頁 limit  排序 order by=====================================
--排序: 升序asc 降序desc
--根據成績排序
--LIMIT 0,5  1-5  從第幾個開始一頁顯示幾個
--limit 1,5  2-6
SELECT r.studentno,`studentname`,`subjectname`,`studentresult` 
FROM `student1` s
RIGHT JOIN `result` r
ON r.studentno=s.studentno
INNER JOIN `subject` sub
ON r.subjectno=sub.subjectno
ORDER BY studentresult DESC
LIMIT 0,5

--第一頁	limit 0,5
--第二頁	limit	5,5
--第三頁	limit	10,5
--第n頁		limit (n-1)*5,5
--[pagesize 頁面大小]
--[(n-1)*pagesize 起始值]
--[n  當前頁]
--[資料總數/頁面大小=總頁數]

--分頁  緩解資料庫壓力 體驗更好    不分頁的叫瀑布流 

--查詢C語言排名前三並且分數大於80的學生資訊(學號,姓名,課程名,分數)
SELECT s.studentno,`studentname`,`subjectname`,`studentresult` 
FROM student1 s
INNER JOIN result r
ON s.studentno=r.studentno
INNER JOIN `subject` sub
ON r.subjectno=sub.subjectno
WHERE subjectname LIKE 'C語言%' AND studentresult>80
ORDER BY studentresult desc
LIMIT 0,3

語法:limit 查詢起始下標 pagesize

子查詢

where (計算出來的值);本質是在where後面巢狀一個查詢語句。

=============================where===========================================
--查詢C語言-1的所有的考試結果(學號,科目名,科目編號,成績)降序排列
--方式一,使用連線查詢
SELECT studentno,subjectname,r.subjectno,studentresult
FROM result r
INNER JOIN `subject` sub
on r.subjectno=sub.subjectno
WHERE subjectname='C語言-1'
ORDER BY studentresult DESC

--查詢C語言-1的所有的考試結果(學號,科目編號,成績)降序排列
--方式二,使用子查詢(由裡及外)
SELECT studentno,subjectno,studentresult
FROM result
WHERE subjectno = (SELECT subjectno
		FROM `subject` 
		WHERE subjectname='C語言-1'
)ORDER BY studentresult desc

--查詢C語言-1的學生學號
SELECT subjectno FROM `subject` WHERE subjectname='C語言-1'

--分數不小於80分的學生的學號和姓名
SELECT DISTINCT s.studentno,studentname
FROM student1 s
INNER JOIN result r
ON s.studentno=r.studentno
WHERE studentresult >=80

--在這個基礎上增加一個科目 高等數學-2
--查詢科目為 高等數學-2且分數不小於8分的學生的學號和姓名
SELECT s.studentno,studentname
FROM student1 s
INNER JOIN result r
ON s.studentno=r.studentno
INNER JOIN `subject` sub
ON r.subjectno=sub.subjectno
WHERE studentresult >=80 AND subjectname = '高等數學-2'
ORDER BY  studentresult DESC

--子查詢
SELECT DISTINCT s.studentno,studentname
FROM student1 s
INNER JOIN result r
ON s.studentno=r.studentno
WHERE studentresult >=80 AND subjectno = (SELECT subjectno FROM `subject` WHERE subjectname = '高等數學-2')

--查詢高等數學-2的編號
SELECT subjectno FROM `subject` WHERE subjectname = '高等數學-2'


--再改造
SELECT studentno,studentname FROM student1
WHERE studentno IN (SELECT studentno FROM result WHERE studentresult>=80 
AND subjectno = (SELECT subjectno FROM `subject` where subjectname = '高等數學-2'))

--查詢C語言-1 的同學的資訊(學號,姓名,分數)
SELECT s.studentno,studentname,studentresult
FROM student1 s
INNER JOIN result r
on s.studentno=r.studentno
WHERE subjectno = (SELECT subjectno FROM `subject` WHERE subjectname = 'C語言-1' )

MySQL函式

常用函式

=========================常用函式======================================
--數學運算
SELECT ABS(-8)		--絕對值
SELECT CEILING(9.4)		--向上取整
SELECT FLOOR(9.4)		--向下取整
SELECT RAND()		--隨機數
SELECT SIGN(2)		--判斷一個數的符號 負數返回-1 正數返回1

--字串函式
SELECT CHARACTER_LENGTH('中國')		--字串長度
SELECT CONCAT('我','是')		--拼接字串
SELECT INSERT('我愛helloword',1,2,'超級')	--查詢 替換 從某個位置替換某個長度
SELECT LOWER('asdsAAAAadwa')	--轉小寫
SELECT UPPER('aaFDSFSDdxd')	--轉大寫
SELECT INSTR('kuang','u')	--返回第一次出現字元的索引
SELECT REPLACE('堅持才能成功','堅持','努力')		--替換字串
SELECT SUBSTR('堅持才能成功',4,6)	--擷取字串
SELECT REVERSE('堅持才能成功')	--反轉字串

--時間和日期函式
SELECT CURRENT_DATE() --	獲取當前日期
SELECT CURDATE()  --	獲取當前日期
SELECT NOW() 	--獲取當前時間
SELECT LOCALTIME() 	--本地時間
SELECT SYSDATE()	--系統時間

SELECT YEAR(NOW())
SELECT MONTH(NOW())
SELECT DAY(NOW())
SELECT HOUR(NOW())
SELECT MINUTE(NOW())
SELECT SECOND(NOW())

--系統
SELECT SYSTEM_USER()	--當前使用者
SELECT USER()	--當前使用者
SELECT VERSION()	--版本

聚合函式(常用)

函式名稱 描述
COUNT() 計數
SUM() 求和
AVG() 平均值
MAX() 最大值
MIN() 最小值
....
===============聚合函式================
--都能夠統計表中的資料
SELECT COUNT(studentname) FROM `student1`	--指定列  會忽略所有的null值
SELECT COUNT(*) FROM `student1`	--不會忽略null值
SELECT COUNT(1) FROM `student1`	--不會忽略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

--查詢不同課程的最高分,最低分,平均分
--核心	不同的課程分組
SELECT subjectname,AVG(studentresult) AS 平均分,MAX(studentresult),MIN(studentresult) 
FROM result r
INNER JOIN `subject` sub
ON r.subjectno=sub.subjectno
GROUP BY r.subjectno	#通過什麼分組
HAVING 平均分>=80

select語法:

--順序很重要
SELECT 去重 要查詢的欄位 FROM 表 (表和欄位可以起別名)
***JOIN 要連線的表 ON 等值判斷
WHERE (具體的值,子查詢語句)
GROUP BY (通過哪個欄位分組)
HAVING (過濾分組後的資訊,條件和where一樣的,位置不同)
ORDER BY (通過哪個欄位排序 ASC/DESC)
LIMIT startindex pagesize(分頁)

資料庫級別的MD5加密

主要增強演算法的複雜度和不可逆性。

MD5不可逆,具體值加密後是一樣的。

MD5破解網站的原理,後臺有一個字典,儲存加密前的值和加密後的值。

========================測試MD5加密==========================
CREATE TABLE `testmd5`(
		`id` INT(4) NOT NULL,
		`name` VARCHAR(20) NOT NULL,
		`pwd` VARCHAR(100) NOT NULL,
		PRIMARY KEY(`id`)
)ENGINE INNODB DEFAULT CHARSET=utf8

--明文密碼
INSERT INTO `testmd5` VALUES(1,'zhangsan','123456'),(2,'lisi','123456'),(3,'wangwu','123456')

--加密
UPDATE  testmd5 SET pwd=MD5(pwd) WHERE id=1

--插入的時候加密
INSERT INTO `testmd5` VALUES(4,'xiaoming',MD5('123456'))

--如何校驗 將使用者傳進來的密碼加密 然後與資料庫儲存的比較
SELECT * FROM testmd5 WHERE `name` = 'xiaoming' AND pwd=MD5('123456')

事務

什麼是事物:要么都成功,要麼都失敗

事物原則:ACID原則--->> 原子性,一致性,隔離性,永續性 (髒讀,幻讀.....)

  • 原子性(Atomicity):要麼都成功,要麼都失敗
  • 一致性(Consistency):事務前後的資料完整性要保持一致
  • 永續性(Durability):事物一旦提交就不可逆,被持久化到資料庫中
  • 隔離性(Isolation):多個使用者併發訪問資料庫時,資料庫為每一個使用者開啟的事務,不會被其他事務的操作干擾

隔離產生的一些問題:

  • 髒讀:指一個事務讀取了另一個事務未提交的資料
  • 不可重複讀:在一個事務內讀取表中的某一行資料,多次讀取結果不同(不一定是錯誤,只是某些場合不對)
  • 虛讀(幻讀):指在一個事務內讀取到了別的事物插入的資料,導致前後讀取不一致
===============事物=======================
MySQL是預設開啟事務自動提交的
SET AUTOCOMMIT = 0	/*關閉自動提交*/
SET AUTOCOMMIT = 1	/*開啟自動提交(預設)*/

-手動處理事務
SET AUTOCOMMIT = 0	--關閉自動提交
--事務開啟
START TRANSACTION	--標記一個事務的開始 從這個開始的sql都在一個事務內

--提交,持久化(成功)
COMMIT

--回滾,回到原來的樣子(失敗)
ROLLBACK

--事務結束
SET AUTOCOMMIT = 1	--開啟事務提交

--瞭解
SAVEPOINT	--設定事務的一個儲存點名
ROLLBACK SAVEPOINT	--回滾到儲存點
RELEASE SAVEPOINT	--撤銷儲存點

模擬轉賬事務

--轉賬
CREATE DATABASE shop CHARACTER SET utf8 COLLATE utf8_general_ci
USE shop

CREATE TABLE `account` (
		`id` INT(4) NOT NULL AUTO_INCREMENT,
		`name` VARCHAR(20) NOT NULL,
		`money`DECIMAL(8,2) NOT NULL,
		PRIMARY KEY (`id`)
)ENGINE INNODB DEFAULT CHARSET=utf8

INSERT INTO `count`(`name`,`money`) VALUES('a',2000.00),('b',10000.00)

--模擬轉賬  事務 一行一行執行
SET autocommit = 0;	
START TRANSACTION;
UPDATE account SET money=money-500 WHERE `name` = 'a';
UPDATE account SET money=money+500 WHERE `name` = 'b';

COMMIT;
ROLLBACK;
SET autocommit = 1;