MySql學習筆記(一)4.12 - 4.15

MySql學習筆記

筆記內容學習來自B站狂神說java,狂神小迷弟一枚

課程鏈接: 快來點我,支持狂神.

1. 初識MySql

javeEE: 企業級java開發 Web

前端:頁面展示,數據

後端:連接點,連接數據庫JDBC,鏈接前端(控制,控制試圖跳轉,和給前端傳遞數據)

數據庫:存數據,txt,excel,word

除了基礎寫代碼+學好數據庫+操作系統+數據結構和算法=不錯的程序猿

再+408+編譯原理+實戰經驗 = 高級程序員

1.1 爲什麼學習數據庫

  1. 崗位需求

  2. mysql處理小型數據,得數據庫者的天下

  3. 被迫需求:存數據

  4. 數據庫是所有軟件體系中最核心的存在 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 (約束)
1586680924028

方式一:在創建時設置外鍵

--創建年紀表
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')

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章