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 CONSTRAINTFK_gradeid
FOREIGN KEY(gradeid
) REFERENCESgrade
(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;