MySql學習筆記
筆記內容學習來自B站狂神說java,狂神小迷弟一枚
課程鏈接: 快來點我,支持狂神.
文章目錄
1. 初識MySql
javeEE: 企業級java開發 Web
前端:頁面展示,數據
後端:連接點,連接數據庫JDBC,鏈接前端(控制,控制試圖跳轉,和給前端傳遞數據)
數據庫:存數據,txt,excel,word
除了基礎寫代碼+學好數據庫+操作系統+數據結構和算法=不錯的程序猿
再+408+編譯原理+實戰經驗 = 高級程序員
1.1 爲什麼學習數據庫
-
崗位需求
-
mysql處理小型數據,得數據庫者的天下
-
被迫需求:存數據
-
數據庫是所有軟件體系中最核心的存在 DBA (數據庫管理員)
1.2 什麼是數據庫
- 數據庫(DB DataBase)
- 概念:數據倉庫,軟件,安裝在操作系統(windows,Liunx,mac)之上,可以存儲大量數據500w以下
- 作用:存儲數據,管理數據
1.3數據庫分類
關係型數據庫
- MySql,Oracle,Sql Server
- 通過表和表之間,行和列之間的關係進行數據存儲。
非關係型數據庫 : {key:value}
- Redis,MongDB
- 非關係型數據庫,對象存儲,通過對象的自身屬性來決定。
DBMS(數據庫管理系統)
- 數據庫的管理軟件,科學有效的管理我們的數據。維護和獲取數據;
- MySql,數據庫管理系統
1.4 MySql
MySql 是 一個關係型數據庫管理系統,屬於Oracle旗下,是最好的RDBMS用用軟件之一,開源的數據庫軟件,體積小,速度快,總體擁有成本低,招人成本比較低。
5.7 比較穩定
8.0
MySql 儘可能使用壓縮包安裝。
1.5 MySql和Sqlyog安裝
- 面向百度
- 再安裝一個可視化數據庫的軟件Sqlyog
1.6MySql建表練習
-
練習創建一個數據庫
-
新建一個數據庫db_School
-
新建一張表student
-
字段: id,name,age
-
在一張表中添加一組數據
-
1.7鏈接數據庫
- 命令行連接
mysql -uroot -p密碼 --連接數據庫
uodate mysql.user set authentication_string=password('123456') where user='root' and Host = 'localhost'; --修改密碼
flush privileges; --刷新權限
---------------------------------------------------------------------
show database; --查看所有數據庫
mysql> use school; --切換數據庫use 數據庫名
Database changed
show table; --查看所有表
describe student; --顯示數據庫中所有的數據
----------------------------------------------------------------------
create database class; --創建一個數據庫
exit; --退出連接
CRUD 增刪改查
DDL , DML , DQL ,DCL
2. 操作數據庫
操作 數據庫>表>數據
MySql關鍵字不區分大小寫
2.1 操作數據庫(瞭解)
[ ]:中括號表示可選
1.新建數據庫
CREATE DATABASE [IF NOT EXISTS] CLASS;
2.刪除數據庫
DROP DATABASE CLASS;
3.使用數據庫
USE `school` --若表名或字段名是個特殊字符就需要帶``
4.查看數據庫
SHOW DATABASE
學習思路:
不會的操作看可視化軟件的歷史記錄
固定語法需要記憶
2.2 數據庫表中的列類型(重點)
數值
數據類型 | 描述 | 佔用字符 |
---|---|---|
tinyint | 十分小的整數 | 1個字節 |
smallint | 較小的整數 | 2個字節 |
int | 標準整數 | 4個字節 |
middleint | 中等大小的整數 | 3個字節 |
bigint | 較大的整數 | 8個字符 |
float | 浮點數 | 4個字節 |
double | 浮點數 | 8個字節 |
decimal | 字符串形式的浮點數(金融計算一般浮點數用decimal) |
字符串
- char 字符串固定大小 0 ~ 255
- varchar 可變字符串 0 ~ 65535 常用 String
- tinytext 微型文本 28 ~ 1 存放博客
- text 文本串 216 ~ 1 保存大文本
時間日期
- java.util.Date
- date YYYY-MM-DD , 📅 日期
- time HH:MM:SS ⏲ 時間日期
- datetime YYYY-MM-DD HH:MM:SS 最常用的時間格式
- timestamp 時間戳 1970.1.1到現在的毫秒數!也較爲常用
- year 年份表示
null
- 沒有值,未知
- 注意,不要使用NULL進行運算,計算結果一定爲NULL
2.3 數據庫表中的字段屬性(重點)
Unsigned
- 無符號 的整數
- 一旦鉤爲 無符號 就不能聲明爲負數
zerofill
- 零填充
- 不足的位數,使用0來填充
自增
- 通常理解爲自動遞增,自動在上一條記錄的基礎上+1(默認)
- 通常用來設計唯一的主鍵 index ,必須是整數
- 可以自定義自增的初始值
非空
- NULL /NOT NULL
- 假設設置位非空,如果不插入數據就會報錯
- NULL,如果不填值默認就是null !
默認
- 設置默認值
- gender 默認值爲男,
阿里巴巴手冊 (項目級別) 表示記錄存在的意義
-
每一個表都必須存在以下幾個字段
id --主鍵 `version` --樂觀鎖 is_delete --僞刪除 gmt_create --創建時間 gmt_update --修改時間
2.4 操作數據庫的表
1.在數據庫中用指令新建表
- 注意,使用英文括號,表的明字和字段儘量使用 `` 括起來
--AUTO_INCREMENT 自增
--字符串用單引號括起來
--所有的語句後面加,(英文的),最後一個不用加
--COMMENT 註釋
CREATE TABLE IF NOT EXISTS `student`(
`id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '',
`name` VARCHAR(30) NOT NULL DEFAULT '匿名' COMMENT '姓名',
`pwd` VARCHAR(20) NOT NULL DEFAULT '123456' COMMENT '密碼',
`gender` VARCHAR(2) NOT NULL DEFAULT '女' COMMENT '性別',
`birthday` DATETIME DEFAULT NULL COMMENT '出生日期',
`address` VARCHAR(100) DEFAULT NULL COMMENT '地址',
`email` VARCHAR(50) DEFAULT NULL COMMENT '郵箱',
PRIMARY KEY (`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8
- 創建結果
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-i4dCwe6H-1586686083472)(…/Typora%E5%9B%BE%E7%89%87%E7%BC%93%E5%AD%98/1586614249435.png)]
-
總結格式
-
CREATE TABLE [IF NOT EXISTS] `表名`( `字段名` 列類型 [屬性] [索引] [註釋], `字段名` 列類型 [屬性] [索引] [註釋], ..... `字段名` 列類型 [屬性] [索引] [註釋] )[表類型][字符集設置][註釋]
2.查看已創建數據庫的語句
SHOW CREATE DATABASE db_school_list --查看錶,已db_school_list數據庫爲例子
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-dxtIuXEd-1586686083474)(…/Typora%E5%9B%BE%E7%89%87%E7%BC%93%E5%AD%98/1586615202858.png)]
3.查看已創建表的定義
SHOW CREATE TABLE student --查看錶中定義的語句,已student表爲例子
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-jdV7DPGB-1586686083475)(…/Typora%E5%9B%BE%E7%89%87%E7%BC%93%E5%AD%98/1586615278473.png)]
4.顯示錶的結構
DESC student --查看錶的結構,已student表爲例子
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-cqISEzpg-1586686083477)(…/Typora%E5%9B%BE%E7%89%87%E7%BC%93%E5%AD%98/1586615159188.png)]
2.5 數據表的類型
- 關於數據庫引擎
- INNODB 默認使用
- MYISAM 5.5即以前的版本
INNODB和MYISAM的區別
區別 | MYISAM | INNODB |
---|---|---|
事務支持 | 不支持 | 支持 |
數據行鎖定 | 不支持 | 支持 |
外鍵約束 | 不支持 | 支持 |
全文索引 | 支持 | 不支持 |
表空間的大小 | 較小 | 較大,前者的兩倍 |
常規使用操作:
-
MYISAM 節約空間,速度較快 聚集索引
-
**INNODB 安全性高,書屋處理快,多表多用戶操作 ** 非聚集索引
物理空間的位置
- 所有的數據庫文件都存在在data文件下
- 數據庫本質還是文件存儲
MySql引擎在物理文件上的區別
- INNODB在數據庫表中只有一個 *.frm 文件,以及上級目錄下的ibdata1文件
- MYISAM對應的文件
- *.frm 表結構的定義文件
- *.MYD 數據文件(data)
- *.MYI 索引文件(index)
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-NhNLOIvF-1586686083481)(…/Typora%E5%9B%BE%E7%89%87%E7%BC%93%E5%AD%98/1586616183543.png)]
設置數據庫表的字符集編碼
- CHARSET=utf8 不設置話不支持中文
2.6 修改和刪除表
修改和刪除表和表中的字段
1. 修改表名
--ALTER TABLE 舊錶名 RENAME AS 新表名
ALTER TABLE teacher RENAME AS teacher00
2. 增加表的字段
--ALTER TABLE 表名 ADD 字段名 列屬性
ALTER TABLE teacher00 ADD age INT(11)
3. 修改表的字段(重命名 修改約束)
--ALTER TABLE 表名 MODIFY 字段名 列屬性
--ALTER TABLE 表名 CHANGE 字段名 列屬性
ALTER TABLE teacher00 MODIFY age VARCHAR(11) --修改約束
ALTER TABLE teacher00 CHANGE age age1 VARCHAR(11) --字段重命名
4. 刪除字段
--ALTER TABLE 表名 DROP 字段名
ALTER TABLE teacher00 DROP age1
5. 刪除表
--DROP TABLE [IF EXSITS] 表名
DROP TABLE IF EXSITS teacher00
所有的創建和刪除操作儘量都加上判斷,以免報錯
3. MySql數據管理
3.1 外鍵(瞭解)
外鍵
- 如圖,學生表的grade列 引用 年級表裏的id (約束)
方式一:在創建時設置外鍵
--創建年紀表
CREATE TABLE IF NOT EXISTS `grade`(
`gid` INT(10) NOT NULL AUTO_INCREMENT COMMENT '年級id',
`gname` VARCHAR(30) NOT NULL DEFAULT '匿名' COMMENT '年紀名稱',
PRIMARY KEY (`gid`)
)ENGINE=INNODB DEFAULT CHARSET=utf8
--包含外鍵的新student表
--定義外鍵
--給這個外鍵添加約束(執行引用)reference 引用
CREATE TABLE IF NOT EXISTS `student`(
`id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '',
`name` VARCHAR(30) NOT NULL DEFAULT '匿名' COMMENT '姓名',
`pwd` VARCHAR(20) NOT NULL DEFAULT '123456' COMMENT '密碼',
`gender` VARCHAR(2) NOT NULL DEFAULT '女' COMMENT '性別',
`gid` INT(10) NOT NULL COMMENT '學生年級',
`birthday` DATETIME DEFAULT NULL COMMENT '出生日期',
`address` VARCHAR(100) DEFAULT NULL COMMENT '地址',
`email` VARCHAR(50) DEFAULT NULL COMMENT '郵箱',
PRIMARY KEY (`id`),
KEY `FK_gid` (`gid`),
CONSTRAINT `FK_gid`FOREIGN KEY (`gid`) REFERENCES `grade`(`gid`)
)ENGINE=INNODB DEFAULT CHARSET=utf8
--注意在刪除引用外鍵關係的表時,要先刪除外鍵表 再刪除引用外間的表
方法二:創建表的時候沒有外鍵關係
/*
ALTER TABLE 表名
ADD CONSTRAINT 約束名 FOREIGN KEY (作爲外鍵的列) REFERENCES 那個表(哪個字段)
*/
ALTER TABLE `student`
ADD CONSTRAINT `FK_gid` FOREIGN KEY (`gid`) REFERENCES `grade`(`gid`)
以上的操作都是物理外鍵(既數據庫級別的外鍵),不建議使用!(避免數據庫過多造成困擾)
最佳實踐
- 數據庫就是單純的表,只用來存儲數據,只有行(數據)和列(字段)
- 我們想使用多張表的數據,想使用外鍵(用程序去實現)
3.2DML語言(全部記住)
**數據庫意義:**數據存儲,數據管理
**DML語言:**數據操作語言
- Insert
- Update
- Delete
3.3 添加
--插入語句
--insert into 表名([字段1,字段2,字段3,])values('值1'),('值2'),('值3'),...,()
--插入的值和前面的字段要一一對應
--可以插入多條數據,VALUES後面的值要用括號和逗號隔開
INSERT INTO `grade`('gname')VALUES('大一'),('大二'),('大三')
INSERT INTO `student`('gender','name','pwd')VALUES('男','張三','888888'),('男','趙雲','zy12345'),('女','胡八一','886688')
3.4 修改
-- 修改語句
-- 修改學員名字,帶條件
UPDATE `student` SET `name`='小迷弟' WHERE id = 1;
-- 在不指定條件的情況下,會改動所有表
UPDATE `student` SET `name`='小迷弟';
-- 語法:
-- UPDATE 表名 SET 列屬性=新值 WHERE 條件;
-- 修改多個屬性,逗號隔開
UPDATE `student` SET `name`='小迷弟',`email`='[email protected]' WHERE id = 1;
-- 語法:
-- UPDATE 表名 SET 列屬性1=新值[,列屬性2=新值] WHERE 條件;
條件:where 子句 運算符 id等於某個值
操作符 | 含義 | 範圍 | 結果 |
---|---|---|---|
= | 等於 | 5=6 | false |
<>或!= | 不等於 | 5<>6 | ture |
>= | 大於等於 | 5>=6 | false |
<= | 小於等於 | 5<=6 | ture |
> | 大於 | 5>6 | false |
< | 小於 | 5<6 | ture |
BETWEEN… AND… | 在某個範圍 | [5,6] | ture |
AND | && 與 | 5>6 and 1<2 | false |
OR | || 或 | 5>6 or 1<2 | ture |
注意總結:
- 數據庫的列儘量戴上``
- 條件,篩選的條件,如果沒有指定,則會修改左右變量
- value,是一個具體的值,也可以是一個變量
3.5 刪除
-- 刪除語句
--刪除指定數據
DELETE FROM `student` WHERE id=1
--不加條,刪除表的所有數據,避免這樣
DELETE FROM `student`
--清空表,採用這個更好
TRUNCATE `student`
Delete 和Truncate的區別
- 相同點: 都能刪除數據,都不會刪除表結構
- 不同點:
- TRUNCATE 重新設置 自增列 計數器會歸零
- TRUNCATE 不會影響事務
- 補充Delete的刪除問題,重啓數據庫的現象
- INNODB 自增序列會重1開始
- MYISAM 繼續從上一個自增量開始
4. DQL查詢語言(最重點)
4.1 DQL
(Data Query Language : 數據查詢語言)
-
所有的查詢操作都用它 關鍵詞是 select
-
簡單地查詢和複雜的查詢它都能做
-
它是數據庫中最核心的語言,最重要的語句
-
使用頻率最高的語句
4.2 查詢指定字段
--查詢所有學生
SELECT * FROM student
--查詢所有學生的成績
SELECT * FROM result
--查詢指定字段
--SELECT 字段名 FROM 表名
SELECT `StudentNo`,`StudentName` FROM student
--別名,給結果起一個名字 關鍵詞 AS 字段和表都可以起別名
SELECT `StudentNo` AS 學號,`StudentName` AS 學生姓名 FROM student
--函數 Concat(a,b) 鏈接字符串
SELECT CONCAT('姓名:',StudentName) AS 新名字 FROM student
--去重 distinct
SELECT DISTINCT `StudentNo` FROM result
--查詢版本
SELECT VERSION()
--計算
SELECT 100*3-1 AS 計算結果
--查詢自增步長
SELECT @@auto_increment_increment
--查詢所有學生的考試成績並+1分查看
SELECT `StudentNo`,`StudentResult`+1 AS '提分後' FROM result
語法: SELECT 字段名1[,字段名2……,字段名n] FROM 表名
別名: AS 字段和表都可以起別名
去重: distinct 去除SELECT查詢出來的結果中重複的值
數據庫中的表達式: 文本值 ,列,NULL,函數,計算表達式,系統變量…
語法升級: SELECT 表達式 FROM 表
4.3 where 條件子句
作用: 檢索數據中符合條件的值
邏輯運算符
運算符 | 語法 | 描述 |
---|---|---|
and && | x and y | 與 |
or || | x or y | 或 |
not ! | not x | 非 |
--where子句
--查詢成績在95-100之間的學生
--方法1
SELECT `StudentNo`,`StudentResult` FROM result
WHERE StudentResult>=95 AND StudentResult<=100
--方法2
SELECT `StudentNo`,`StudentResult` FROM result
WHERE StudentResult>=95 && StudentResult<=100
--方法3 模糊查詢(區間)
SELECT `StudentNo`,`StudentResult` FROM result
WHERE StudentResult BETWEEN 95 AND 100
--查詢除了學號爲1000號學生以外的同學的成績
--方法1
SELECT `StudentNo`,`StudentResult` FROM result
WHERE NOT StudentNo = 1000
--方法2
SELECT `StudentNo`,`StudentResult` FROM result
WHERE StudentNo != 1000
模糊查詢:比較運算符
運算符 | 語法 | 描述 |
---|---|---|
IS NULL | x is null | 爲null,結果爲真 |
IS NOT NULL | x is not null | 不爲nul,結果爲真 |
BETWEEN … AND … | BETWEEN 95 AND 100 | x在95-100之間,則爲真 |
LIKE | x like y | SQL匹配,若x匹配到y,則結果爲真 |
IN | x in y1,y2,… | 假設x在y1,y2…之中的某個值,則結果爲真 |
--模糊查詢
--查詢姓胡的同學
--like 結合 %(代表0到任意個字符) _(一個字符)
SELECT `StudentNo`,`StudentName` FROM student
WHERE StudentName LIKE '劉%'
--查詢姓胡的同學,只有兩個字的
SELECT `StudentNo`,`StudentName` FROM student
WHERE StudentName LIKE '劉_'
--查詢姓胡的同學,三個字的
SELECT `StudentNo`,`StudentName` FROM student
WHERE StudentName LIKE '劉__'
--查詢名字中間有'姿'字的同學
SELECT `StudentNo`,`StudentName` FROM student
WHERE StudentName LIKE '%姿%'
--in
--查詢1001,1002,1003號同學
SELECT `StudentNo`,`StudentName` FROM student
WHERE StudentNo IN (1001,1002,1003)
--查詢在浙江,重慶的同學
SELECT `StudentNo`,`StudentName`,`Address` FROM student
WHERE Address IN ('浙江','重慶')
--null / not null
--查詢地址爲空的學生null ''
SELECT `StudentNo`,`StudentName`,`Address` FROM student
WHERE Address='' OR Address IS NULL
注意:%和like聯用,不要亂用。
# 4. DQL查詢語言(最重點)
4.1 DQL
(Data Query Language : 數據查詢語言)
-
所有的查詢操作都用它 關鍵詞是 select
-
簡單地查詢和複雜的查詢它都能做
-
它是數據庫中最核心的語言,最重要的語句
-
使用頻率最高的語句
4.2 查詢指定字段
--查詢所有學生
SELECT * FROM student
--查詢所有學生的成績
SELECT * FROM result
--查詢指定字段
--SELECT 字段名 FROM 表名
SELECT `StudentNo`,`StudentName` FROM student
--別名,給結果起一個名字 關鍵詞 AS 字段和表都可以起別名
SELECT `StudentNo` AS 學號,`StudentName` AS 學生姓名 FROM student
--函數 Concat(a,b) 鏈接字符串
SELECT CONCAT('姓名:',StudentName) AS 新名字 FROM student
--去重 distinct
SELECT DISTINCT `StudentNo` FROM result
--查詢版本
SELECT VERSION()
--計算
SELECT 100*3-1 AS 計算結果
--查詢自增步長
SELECT @@auto_increment_increment
--查詢所有學生的考試成績並+1分查看
SELECT `StudentNo`,`StudentResult`+1 AS '提分後' FROM result
語法: SELECT 字段名1[,字段名2……,字段名n] FROM 表名
別名: AS 字段和表都可以起別名
去重: distinct 去除SELECT查詢出來的結果中重複的值
數據庫中的表達式: 文本值 ,列,NULL,函數,計算表達式,系統變量…
語法升級: SELECT 表達式 FROM 表
4.3 where 條件子句
作用: 檢索數據中符合條件的值
邏輯運算符
運算符 | 語法 | 描述 |
---|---|---|
and && | x and y | 與 |
or || | x or y | 或 |
not ! | not x | 非 |
--where子句
--查詢成績在95-100之間的學生
--方法1
SELECT `StudentNo`,`StudentResult` FROM result
WHERE StudentResult>=95 AND StudentResult<=100
--方法2
SELECT `StudentNo`,`StudentResult` FROM result
WHERE StudentResult>=95 && StudentResult<=100
--方法3 模糊查詢(區間)
SELECT `StudentNo`,`StudentResult` FROM result
WHERE StudentResult BETWEEN 95 AND 100
--查詢除了學號爲1000號學生以外的同學的成績
--方法1
SELECT `StudentNo`,`StudentResult` FROM result
WHERE NOT StudentNo = 1000
--方法2
SELECT `StudentNo`,`StudentResult` FROM result
WHERE StudentNo != 1000
模糊查詢:比較運算符
運算符 | 語法 | 描述 |
---|---|---|
IS NULL | x is null | 爲null,結果爲真 |
IS NOT NULL | x is not null | 不爲nul,結果爲真 |
BETWEEN … AND … | BETWEEN 95 AND 100 | x在95-100之間,則爲真 |
LIKE | x like y | SQL匹配,若x匹配到y,則結果爲真 |
IN | x in y1,y2,… | 假設x在y1,y2…之中的某個值,則結果爲真 |
--模糊查詢
--查詢姓胡的同學
--like 結合 %(代表0到任意個字符) _(一個字符)
SELECT `StudentNo`,`StudentName` FROM student
WHERE StudentName LIKE '劉%'
--查詢姓胡的同學,只有兩個字的
SELECT `StudentNo`,`StudentName` FROM student
WHERE StudentName LIKE '劉_'
--查詢姓胡的同學,三個字的
SELECT `StudentNo`,`StudentName` FROM student
WHERE StudentName LIKE '劉__'
--查詢名字中間有'姿'字的同學
SELECT `StudentNo`,`StudentName` FROM student
WHERE StudentName LIKE '%姿%'
--in
--查詢1001,1002,1003號同學
SELECT `StudentNo`,`StudentName` FROM student
WHERE StudentNo IN (1001,1002,1003)
--查詢在浙江,重慶的同學
SELECT `StudentNo`,`StudentName`,`Address` FROM student
WHERE Address IN ('浙江','重慶')
--null / not null
--查詢地址爲空的學生null ''
SELECT `StudentNo`,`StudentName`,`Address` FROM student
WHERE Address='' OR Address IS NULL
注意:%和like聯用,不要亂用。
4.4 聯表查詢
SQL中的七種JOINS理論詳解
LEFT JOIN , INNER JOIN , RIGHT JOIN
--查詢參加了考試的同學(學號,姓名,科普編號,分數)
SELECT * FROM student
SELECT * FROM result
/*
思路
1. 分析需求,分析查詢的字段來自那些表(連接查詢)
2. 確定使用那種連接查詢? 7種
確定交叉信息
--JOIN ON是固定語法 連接查詢
--WHERE 等值查詢
*/
--查看並集 INNER JOIN
SELECT s.StudentNo,StudentName,SubjectNo,StudentResult
FROM student AS s
INNER JOIN result AS r
WHERE r.StudentNo = s.StudentNo
--查看並集和右部分 RIGHT JOIN
SELECT s.StudentNo,StudentName,SubjectNo,StudentResult
FROM student AS s
RIGHT JOIN result r
ON r.StudentNo = s.StudentNo
--查詢缺考同學
--查看並集和右部分 RIGHT JOIN
SELECT s.StudentNo,StudentName,SubjectNo,StudentResult
FROM student AS s
LEFT JOIN result r
ON r.StudentNo = s.StudentNo
WHERE StudentResult IS NULL
--查詢參加考試同學的信息(學號,學生姓名,科目名稱,成績) 3張表
SELECT DISTINCT s.StudentNo,StudentName,SubjectNo,StudentResult
FROM student AS s
RIGHT JOIN result r
ON r.StudentNo = s.StudentNo
INNER JONIN subject sub
WHERE sub.SubjectNo = s.SubjectNo
--多表查詢,先查詢兩張表再慢慢增加
操作 | 描述 |
---|---|
INNER JOIN | 如果表中至少有一個匹配,就返回行 |
LEFT JOIN | 即使由右表中沒有匹配,也會從左表中返回所有的值,(例如新建的學生沒有成績) |
RIGHT JOIN | 即使由左表中沒有匹配,也會從右表中返回所有的值 |
自連接
--自連接用例表
CREATE TABLE `category`(
`categoryid` INT(3) NOT NULL COMMENT 'id',
`pid` INT(3) NOT NULL COMMENT '父id 沒有父則爲1',
`categoryname` VARCHAR(10) NOT NULL COMMENT '種類名字',
PRIMARY KEY (`categoryid`)
) ENGINE=INNODB AUTO_INCREMENT=9 CHARSET=utf8;
INSERT INTO `category` (`categoryid`,`pid`,`categoryname`)
VALUES ('2','1','信息技術'),
('3', '1', '軟件開發'),
('5', '1', '美術設計'),
('4', '3', '數據庫'),
('8', '2', '辦公信息'),
('6', '3', 'web開發'),
('7', '5', 'ps技術');
自己的表和自己的表連接,核心:一張表拆爲兩張一樣的表即可
- 父類
categoryid | categoryname |
---|---|
2 | 信息技術 |
3 | 軟件開發 |
5 | 美術設計 |
- 子類
pid(父類id) | categoryid | categoryname |
---|---|---|
3 | 4 | 數據庫 |
2 | 8 | 辦公信息 |
3 | 6 | web開發 |
5 | 7 | ps技術 |
操作:查詢父類對應子類的關係
父類 | 子類 |
---|---|
軟件開發 | 數據庫 |
信息技術 | 辦公信息 |
軟件開發 | web開發 |
美術設計 | ps技術 |
--查詢父子信息
SELECT a.`categoryName` AS '先修課程',b.`categoryName` AS '當前課程'
FROM `category` AS a,`category` AS b
WHERE a.`categoryid` = b.`pid`
--查詢學生所屬的年級(學號,學生的姓名,年紀名稱)
SELECT studentNo,studentName,`GraderName`
FROM student s
INNER JOIN `grade` g
ON s.GradeID = g.GradeID
--查詢科目所屬的年級(科目名稱,年紀名稱)
SELECT subjectName,`GraderName`
FROM `subject` sub
INNER JOIN `grade` g
ON sub.GradeID = g.GradeID
-- 思考題 查詢參加了數據庫結構考試的同學的同學信息(學號,學生姓名,科目名,分數)
SELECT studentNo,studentName,subjectName,studentResult
FROM student s
INNER JOIN `subject` sub
ON sub.subjectNo = s.subjectNo
INNER JOIN `grade` g
ON sub.studentNo = s.studentNo
WHERE gradeName = '數據庫結構'
4.5 分頁和排序
分頁 limit 和 排序 order by
--查詢參加了數據庫結構考試的同學的同學信息(學號,學生姓名,科目名,分數)
--對查詢到的結果根據程序降序/升序排序
--降序 DESC / 升序 ASC
SELECT s.StudentNo,StudentName,SubjectName,StudentResult
FROM student s
INNER JOIN `subject` sub
ON sub.SubjectNo = s.SubjectNo
INNER JOIN `grade` g
ON g.StudentNo = s.StudentNo
WHERE GradeName = '數據庫結構'
ORDER BY StudentResult DESC
--分頁,每頁只顯示五條數據
--語法:limit 當前頁,頁面的大小
--LIMIT 0,5 0~5 這是第一頁
--LIMIT 6,10 6~10 這是第二頁
--擴展
--網頁應用: 當前 總的頁數 頁面大小 n代表當前頁,pagesize代表頁面大小,總頁數=總數/頁面大小
--LIMIT : 5*(n-1)+1,5*(n-1)+pagesize
SELECT s.StudentNo,StudentName,SubjectName,StudentResult
FROM student s
INNER JOIN `subject` sub
ON sub.SubjectNo = s.SubjectNo
INNER JOIN `grade` g
ON g.StudentNo = s.StudentNo
WHERE GradeName = '數據庫結構'
ORDER BY StudentResult DESC
LIMIT 0,5
--思考題 查詢’JAVA第一學年'課程成績排名前十的學生且分數不小於80的學生信息(學號,學生姓名,科目名,分數)
SELECT s.StudentNo,StudentName,SubjectName,StudentResult
FROM student s
INNER JOIN `subject` sub
ON sub.SubjectNo = s.SubjectNo
INNER JOIN `grade` g
ON g.StudentNo = s.StudentNo
WHERE GradeName = 'JAVA第一學年' AND StudentResult >= 80
ORDER BY StudentResult DESC
LIMIT 0,10
爲什麼要分頁?
- 緩解數據庫壓力,給人的體驗更好
- 另一種形式 瀑布流 — 百度圖片,無限下拉。
4.6子查詢和嵌套查詢
WHERE (這個值是計算出來的)
子查詢的本質:在WHERE語句中嵌套一個子查詢語句
--語法
WHERE 字段屬性 =/IN (
SELECT...
)
--查詢參加了數據庫結構考試的同學的同學信息(學號,科目名,分數),降序排列
--方式一使用:連接查詢
SELECT StudentNo,r.SubjectNo,StudentResult
FROM result r
INNER JOIN `subject` sub
ON sub.SubjectNo = r.SubjectNo
WHERE SubjectNo = '數據結構'
ORDER BY StudentResult DESC
--方式二:使用子查詢
SELECT StudentNo,SubjectNo,StudentResult
FROM result r
WHERE SubjectNo = (
SELECT SubjectNo
FROM `subject` sub
WHERE SubjectNo = '數據結構'
)
ORDER BY StudentResult DESC
--查詢分數不小於80分的學生學號和姓名
SELECT DISTINCT s.StudentNo,StudentName,StudentResult
FROM student s
INNER JOIN result r
ON s.StudentNo = r.StudentNo
WHERE StudentResult >= 80
--在這個基礎上增加一個科目 是高等數學
--子查詢方式:
AND SubjectNo = (
SELECT SubjectNo
FROM subject sub
WHERE SubjectName = '高等數學'
)
--連接查詢方式:
--去掉上一行WHERE ,因爲WHERE不可以寫兩個 HAVING可以
INNER JOIN subject sub
ON s.StudentNo = sub.StudentNo
WHERE SubjectName = '高等數學' AND StudentResult >= 80
4.7 分組和過濾
HAVING 和 GROUP BY
--查詢不同課程的平均分,最高分,最低分,且平均分要要大於80分
SELECT Subjectname,AVE(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 --過濾過的分組要用HAVING不能用WHERE
4.8 SELECT 小結
小結
5.MySql函數
5.1常用函數(但並不常有)
數學運算
--數學運算
--絕對值
SELECT ABS(-8)
--向上取整
SELECT CELLING(9.4)
--向下取整
SELECT FLOOR(9.4)
--返回一個0~1之間的隨機數
SELECT RAND()
--判斷符號,負數返回-1,正數返回1
SELECT SIGN(10)
字符串
--字符串
--字符串長度
SELECT CHAR_LENGTH('不會真的有人會用這些函數吧')
--字符串拼接
SELECT CONCAT('我','正在學','MySql')
--轉大寫,轉小寫
SELECT LOWER('SeLEcT')
SELECT UPPER('SeLEcT')
--返回第一次出現的子串的位置
SELECT INSTR('SeLEcT','ect')
--替換字符串
SELECT REPLACE('不會真的有人會用這些函數吧','會用這些函數','只看視頻不實操')
--....
時間和日期(比較重要,數據庫內使用比較頻繁)
--時間和日期
--獲取當前日期
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()
5.2 聚合函數(常用)
聚合函數
函數名稱 | 描述 |
---|---|
COUNT() | 計數 |
SUM() | 求和 |
AVG() | 求平均值 |
MAX() | 最大值 |
MIN() | 最小值 |
… | … |
--聚合函數
--查詢學生表人數,都能夠統計表中的數據
SELECT COUNT(StudentNo) FROM `student` --會忽略null的值
SELECT COUNT(*) FROM `student` --不會忽略null的值
SELECT COUNT(1) FROM `student` --不會忽略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`
--查詢不同課程的平均分,最高分,最低分,且平均分要要大於80分
SELECT Subjectname,AVE(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 --過濾過的分組要用HAVING不能用WHERE
5.3 數據庫級別的MD5加密(擴展)
MD5
信息摘要算法,主要增強算法複雜度和不可逆性。
MD5 不可逆,具體的值的MD5是一樣的
MD5破解網站原理,背後有一個字點,MD5加密後的值,加密的前值
--測試MD5 加密
CREATE TABLE 'testmd5'(
`id` INT(4) NOT NULL,
`name` VACHAR(20) NOT NULL,
`pwd` VACHAR(50) NOT NULL,
PRIMARY KEY(`id`)
)ENGINE = INNODB DEFAULT CHARSET = utf8
--明文密碼
INSERT INTO testmd5 VALUES(1,'測試人員1','123456'),(2,'管理員','7894561')
--加密指定密碼
UPDATE testmd5 SET pwd=MD5(pwd) WHERE id = 1
--加密全部密碼
UPDATE testmd5 SET pwd=MD5(pwd)
--在插入的時候加密
INSERT INTO testmd5 VALUES(3,'測試人員2',MD5('123456'))
--如何校驗:將用戶傳遞進來的密碼,進行MD5加密,然後比對加密值
SELECT * FROM testmd5 WHERE `name` = '測試人員2' AND `psd` = MD5('123456')