一、MySQL 基礎
阿新 • • 發佈:2021-08-22
一、MySQL 基礎
MySQL 學習MySQL基礎一、為什麼要學習資料庫
- 1、持久化資料到本地。
- 2、可以實現結構化查詢,方便管理。
二、資料庫的相關概念
DBMS、DB、SQL
- 1、DB:資料庫,儲存一組有組織的資料的容器。
- 2、DBMS:資料庫管理系統,又稱為資料庫軟體(產品),用於管理DB中的資料。
- 3、SQL:結構化查詢語言,用於和DBMS通訊的語言。
三、資料庫儲存資料的特點
- 1、資料存放到表中,然後表再放到庫中。
- 2、一個庫中可以有多張表,每張表具有唯一的表名用來標識自己。
- 3、表中有一個或多個列,列又稱為“欄位”,相當於java中“屬性”。
- 4、表中的每一行資料,相當於java中“物件”。
四、初始 MySQL
4-2、MySQL 產品的介紹
- 1、MySQL 的背景
- 前身屬於瑞典的一家公司,MySQL AB。
- 08 年被 sun 公司收購。
- 09 年 sun 被 oracle 收購。
- 2、MySQL 的優點
- 1、開源、免費、成本低。
- 2、效能高、移植性也好。
- 3、體積小,便於安裝。
4-3、MySQL 產品的安裝 ★
- 1、屬於c/s架構的軟體,一般來講安裝服務端。
- 企業版。
- 社群版(5.5、5.6、5.7、8.0)。
4-4、MySQL 服務的啟動和停止 ★
- 方式一:計算機——右擊管理——服務
- 方式二:通過管理員身份執行
- net start 服務名(啟動服務)
- net stop 服務名(停止服務)
4-5、MySQL 服務的登入和退出 ★
- 方式一:通過mysql自帶的客戶端
- 只限於root使用者
- 方式二:通過windows自帶的客戶端
- 登入:
- mysql 【-h主機名 -P埠號 】-u使用者名稱 -p密碼
- 退出:
- exit或ctrl+C
4-6、MySQL 的常見命令和語法規範
常見命令
-- 1.檢視當前所有的資料庫。
show databases;
-- 2.開啟指定的庫。
use 庫名
-- 3.檢視當前庫的所有表。
show tables;
-- 4.檢視其它庫的所有表。
show tables from 庫名;
-- 5.建立表。
create table 表名(
列名 列型別,
列名 列型別,
。。。
);
-- 6.查看錶結構。
desc 表名;
-- 7.檢視伺服器的版本。
select version();-- 方式一:登入到mysql服務端。
mysql -- version;或 mysql --V;-- 方式二:沒有登入到mysql服務端。
語法規範
1.不區分大小寫,但建議關鍵字大寫,表名、列名小寫。
2.每條命令最好用分號結尾。
3.每條命令根據需要,可以進行縮排 或換行。
4.註釋。
單行註釋:#註釋文字
單行註釋:-- 註釋文字
多行註釋:/* 註釋文字 */
4-7、SQL 的語言分類。
DQL(Data Query Language):資料查詢語言
select
DML(Data Manipulate Language):資料操作語言
insert 、update、delete
DDL(Data Define Languge):資料定義語言
create、drop、alter
TCL(Transaction Control Language):事務控制語言
commit、rollback
五、DQL語言的學習 ★
5-1、基礎查詢 ★
語法:
SELECT 要查詢的東西
【FROM 表名】;
類似於Java中 :System.out.println(要列印的東西);
特點:
①通過select查詢完的結果 ,是一個虛擬的表格,不是真實存在。
②要查詢的東西 可以是常量值、可以是表示式、可以是欄位、可以是函式 。
5-2、條件查詢 ★
- 條件查詢:根據條件過濾原始表的資料,查詢到想要的資料
- 語法:
- select
- 要查詢的欄位|表示式|常量值|函式
- from
- 表
- where
- 條件 ;
- 分類:
- 一、條件表示式
- 示例:salary>10000
- 條件運算子:
- > < >= <= = != <>
- 二、邏輯表示式
- 示例:salary>10000 && salary<20000
- 邏輯運算子:
- and(&&):兩個條件如果同時成立,結果為true,否則為false
- or(||):兩個條件只要有一個成立,結果為true,否則為false
- not(!):如果條件成立,則not後為false,否則為true
- 三、模糊查詢
- 示例:last_name like 'a%'
5-3、排序查詢 ★
- 語法:
- select
- 要查詢的東西
- from
- 表
- where
- 條件
- order by 排序的欄位|表示式|函式|別名 【asc|desc】
5-4、常見函式 ★
- 一、單行函式
- 1、字元函式
- concat拼接
- substr擷取子串
- upper轉換成大寫
- lower轉換成小寫
- trim去前後指定的空格和字元
- ltrim去左邊空格
- rtrim去右邊空格
- replace替換
- lpad左填充
- rpad右填充
- instr返回子串第一次出現的索引
- length 獲取位元組個數
-
- 2、數學函式
- round 四捨五入
- rand 隨機數
- floor向下取整
- ceil向上取整
- mod取餘
- truncate截斷
- 3、日期函式
- now當前系統日期+時間
- curdate當前系統日期
- curtime當前系統時間
- str_to_date 將字元轉換成日期
- date_format將日期轉換成字元
- 4、流程控制函式
- if 處理雙分支
- case語句 處理多分支
- 情況1:處理等值判斷
- 情況2:處理條件判斷
-
- 5、其他函式
- version版本
- database當前庫
- user當前連線使用者
5-5、分組函式 ★
- sum 求和
- max 最大值
- min 最小值
- avg 平均值
- count 計數
- 特點:
- 1、以上五個分組函式都忽略null值,除了count(*)
- 2、sum和avg一般用於處理數值型
- max、min、count可以處理任何資料型別
- 3、都可以搭配distinct使用,用於統計去重後的結果
- 4、count的引數可以支援:
- 欄位、*、常量值,一般放1
- 建議使用 count(*)
5-6、分組查詢 ★
- 語法:
- select 查詢的欄位,分組函式
- from 表
- group by 分組的欄位
- 特點:
- 1、可以按單個欄位分組
- 2、和分組函式一同查詢的欄位最好是分組後的欄位
- 3、分組篩選
- 針對的表 位置 關鍵字
- 分組前篩選: 原始表 group by的前面 where
- 分組後篩選: 分組後的結果集 group by的後面 having
- 4、可以按多個欄位分組,欄位之間用逗號隔開
- 5、可以支援排序
- 6、having後可以支援別名
5-7、連線查詢 ★
- 笛卡爾乘積:如果連線條件省略或無效則會出現
- 解決辦法:新增上連線條件。
一、傳統模式下的連線 :等值連線——非等值連線。
- 1.等值連線的結果 = 多個表的交集。
- 2.n表連線,至少需要n-1個連線條件。
- 3.多個表不分主次,沒有順序要求。
- 4.一般為表起別名,提高閱讀性和效能。
二、sql99語法:通過join關鍵字實現連線。
- 含義:1999年推出的sql語法
- 支援:
- 等值連線、非等值連線 (內連線)
- 外連線
- 交叉連線
- 語法:
- select 欄位,...
- from 表1
- 【inner|left outer|right outer|cross】join 表2 on 連線條件
- 【inner|left outer|right outer|cross】join 表3 on 連線條件
- 【where 篩選條件】
- 【group by 分組欄位】
- 【having 分組後的篩選條件】
- 【order by 排序的欄位或表示式】
- 好處:語句上,連線條件和篩選條件實現了分離,簡潔明瞭!
三、自連線
案例:查詢員工名和直接上級的名稱
sql99
- SELECT e.last_name,m.last_name
- FROM employees e
- JOIN employees m ON e.`manager_id`=m.`employee_id`;
sql92
- SELECT e.last_name,m.last_name
- FROM employees e,employees m
- WHERE e.`manager_id`=m.`employee_id`;
5-8、子查詢 √
含義:
一條查詢語句中又嵌套了另一條完整的select語句,其中被巢狀的select語句,稱為子查詢或內查詢在外面的查詢語句,稱為主查詢或外查詢。
特點:
- 1、子查詢都放在小括號內
- 2、子查詢可以放在from後面、select後面、where後面、having後面,但一般放在條件的右側
- 3、子查詢優先於主查詢執行,主查詢使用了子查詢的執行結果
- 4、子查詢根據查詢結果的行數不同分為以下兩類:
- ① 單行子查詢
- 結果集只有一行
- 一般搭配單行操作符使用:> < = <> >= <=
- 非法使用子查詢的情況:
- a、子查詢的結果為一組值
- b、子查詢的結果為空
-
- ② 多行子查詢
- 結果集有多行
- 一般搭配多行操作符使用:any、all、in、not in
- in: 屬於子查詢結果中的任意一個就行
- any和all往往可以用其他查詢代替
5-9、分頁查詢 ★
應用場景:
實際的web專案中需要根據使用者的需求提交對應的分頁查詢的sql語句。
語法:
select 欄位|表示式,...
from 表
【where 條件】
【group by 分組欄位】
【having 條件】
【order by 排序的欄位】
limit 【起始的條目索引,】條目數;
特點:
1.起始條目索引從0開始
2.limit子句放在查詢語句的最後
3.公式:select * from 表 limit (page-1)*sizePerPage,sizePerPage
假如:
每頁顯示條目數sizePerPage
要顯示的頁數 page
5-10、union聯合查詢 √
引入:
union 聯合、合併
語法:
- select 欄位|常量|表示式|函式 【from 表】 【where 條件】 union 【all】
- select 欄位|常量|表示式|函式 【from 表】 【where 條件】 union 【all】
- select 欄位|常量|表示式|函式 【from 表】 【where 條件】 union 【all】
- .....
- select 欄位|常量|表示式|函式 【from 表】 【where 條件】
特點:
- 1、多條查詢語句的查詢的列數必須是一致的
- 2、多條查詢語句的查詢的列的型別幾乎相同
- 3、union代表去重,union all代表不去重
六、DML語言的學習 ★
6-2、插入語句
語法:
insert into 表名(欄位名,...)
values(值1,...);
特點:
1、欄位型別和值型別一致或相容,而且一一對應。
2、可以為空的欄位,可以不用插入值,或用null填充。
3、不可以為空的欄位,必須插入值。
4、欄位個數和值的個數必須一致。
5、欄位可以省略,但預設所有欄位,並且順序和表中的儲存順序一致 。
6-3、修改語句
修改單表語法:
update 表名 set 欄位=新值,欄位=新值
【where 條件】
修改多表語法:
update 表1 別名1,表2 別名2
set 欄位=新值,欄位=新值
where 連線條件
and 篩選條件
6-4、刪除語句
方式1:delete語句
1、單表的刪除: ★
delete from 表名 【where 篩選條件】
2、多表的刪除:
delete 別名1,別名2
from 表1 別名1,表2 別名2
where 連線條件
and 篩選條件;
方式2:truncate語句
truncate table 表名
兩種方式的區別【面試題】
#1.truncate不能加where條件,而delete可以加where條件。
#2.truncate的效率高一丟丟。
#3.truncate 刪除帶自增長的列的表後,如果再插入資料,資料從1開始。
#delete 刪除帶自增長列的表後,如果再插入資料,資料從上一次的斷點處開始。
#4.truncate刪除不能回滾,delete刪除可以回滾。
七、DDL語言的學習
7-1、庫和表的管理 √
庫的管理:
一、建立庫
create database 庫名
二、刪除庫
drop database 庫名
表的管理:
- #1.建立表
- CREATE TABLE IF NOT EXISTS stuinfo(
- stuId INT,
- stuName VARCHAR(20),
- gender CHAR,
- bornDate DATETIME
- );
- DESC studentinfo;
- #2.修改表 alter
- 語法:ALTER TABLE 表名 ADD|MODIFY|DROP|CHANGE COLUMN 欄位名 【欄位型別】;
- #①修改欄位名
- ALTER TABLE studentinfo CHANGE COLUMN sex gender CHAR;
- #②修改表名
- ALTER TABLE stuinfo RENAME [TO] studentinfo;
- #③修改欄位型別和列級約束
- ALTER TABLE studentinfo MODIFY COLUMN borndate DATE ;
- #④新增欄位
- ALTER TABLE studentinfo ADD COLUMN email VARCHAR(20) first;
- #⑤刪除欄位
- ALTER TABLE studentinfo DROP COLUMN email;
- #3.刪除表
- DROP TABLE [IF EXISTS] studentinfo;
7-2、常見資料型別介紹 √
- 整型:
- 小數:
- 浮點型
- 定點型
- 字元型:
- 日期型:
- Blob型別:
7-3、常見約束 √
- NOT NULL
- DEFAULT
- UNIQUE
- CHECK
- PRIMARY KEY
- FOREIGN KEY
八、TCL語言的學習
事務和事務處理
含義:
通過一組邏輯操作單元(一組DML——sql語句),將資料從一種狀態切換到另外一種狀態
特點:
(ACID)
- 原子性:要麼都執行,要麼都回滾。
- 一致性:保證資料的狀態操作前和操作後保持一致。(比如:錢的總額一定,分散式資料庫中資料儲存保持一致性。)
- 隔離性:多個事務同時操作相同資料庫的同一個資料時,一個事務的執行不受另外一個事務的干擾。
- 永續性:一個事務一旦提交,則資料將持久化到本地,除非其他事務對其進行修改。
8-1、事務的分類
- 隱式事務,沒有明顯的開啟和結束事務的標誌。
比如
insert、update、delete語句本身就是一個事務。
- 顯式事務,具有明顯的開啟和結束事務的標誌。
1、開啟事務
取消自動提交事務的功能
2、編寫事務的一組邏輯操作單元(多條sql語句)
insert
update
delete
3、提交事務或回滾事務
8-2、使用到的關鍵字
set autocommit=0;
start transaction;
commit;
rollback;
savepoint 斷點
commit to 斷點
rollback to 斷點
8-3、事務的隔離級別
- 1、事務併發問題如何發生?
當多個事務同時操作同一個資料庫的相同資料時。 - 2、事務的併發問題有哪些?
- 髒讀:一個事務讀取到了另外一個事務未提交的資料。
- 不可重複讀:同一個事務中,多次讀取到的資料不一致。
- 幻讀:一個事務讀取資料時,另外一個事務進行更新,導致第一個事務讀取到了沒有更新的資料。
- 3、如何避免事務的併發問題?
通過設定事務的隔離級別
1、READ UNCOMMITTED。
2、READ COMMITTED 可以避免髒讀。
3、REPEATABLE READ 可以避免髒讀、不可重複讀和一部分幻讀。
4、SERIALIZABLE可以避免髒讀、不可重複讀和幻讀。
- 4、設定隔離級別:
set session|global transaction isolation level 隔離級別名;
- 5、檢視隔離級別:
select @@tx_isolation;
九、檢視的講解 √
- 含義:理解成一張虛擬的表。
- 檢視和表的區別:
使用方式 | 佔用物理空間 | |
---|---|---|
檢視 | 完全相同 | 不佔用,僅僅儲存的是sql邏輯 |
表 | 完全相同 | 佔用 |
- 檢視的好處:
- 1、sql語句提高重用性,效率高。
- 2、和表實現了分離,提高了安全性。
9-1、檢視的建立
- 語法:
- CREATE VIEW 檢視名
- AS
- 查詢語句;
9-2、檢視的增刪改查
1、檢視檢視的資料 ★
SELECT * FROM my_v4;
SELECT * FROM my_v1 WHERE last_name='Partners';
2、插入檢視的資料
INSERT INTO my_v4(last_name,department_id) VALUES('虛竹',90);
3、修改檢視的資料
UPDATE my_v4 SET last_name ='夢姑' WHERE last_name='虛竹';
4、刪除檢視的資料
DELETE FROM my_v4;
9-3、某些檢視不能更新
包含以下關鍵字的sql語句:
- 分組函式、distinct、group by、having、union或者union all。
- 常量檢視。
- Select中包含子查詢。
- join
- from一個不能更新的檢視。
- where子句的子查詢引用了from子句中的表。
9-4、檢視邏輯的更新
- #方式一:重新建立
- CREATE OR REPLACE VIEW test_v7
- AS
- SELECT last_name FROM employees
- WHERE employee_id>100;
- #方式二: 修改更新檢視邏輯
- ALTER VIEW test_v7
- AS
- SELECT employee_id FROM employees;
- SELECT * FROM test_v7;
9-5、檢視的刪除
- DROP VIEW test_v1,test_v2,test_v3;
9-6、檢視結構的檢視
- DESC test_v7;
- SHOW CREATE VIEW test_v7;
十、變數
10-1、系統變數
- 1、全域性變數(作用域:針對於所有會話(連線)有效,但不能跨重啟)
- 檢視所有全域性變數
- SHOW GLOBAL VARIABLES;
- 檢視滿足條件的部分系統變數
- SHOW GLOBAL VARIABLES LIKE '%char%';
- 檢視指定的系統變數的值
- SELECT @@global.autocommit;
- 為某個系統變數賦值
- SET @@global.autocommit=0;
- SET GLOBAL autocommit=0;
- 2、會話變數(作用域:針對於當前會話(連線)有效)
- 檢視所有會話變數
- SHOW SESSION VARIABLES;
- 檢視滿足條件的部分會話變數
- SHOW SESSION VARIABLES LIKE '%char%';
- 檢視指定的會話變數的值
- SELECT @@autocommit;
- SELECT @@session.tx_isolation;
- 為某個會話變數賦值
- SET @@session.tx_isolation='read-uncommitted';
- SET SESSION tx_isolation='read-committed';
10-2、自定義變數
- 1、使用者變數
- - 宣告並初始化
- SET @變數名=值;
- SET @變數名:=值;
- SELECT @變數名:=值;
- - 賦值
- 方式一:一般用於賦簡單的值
- SET 變數名=值;
- SET 變數名:=值;
- SELECT 變數名:=值;
- 方式二:一般用於賦表 中的欄位值
- SELECT 欄位名或表示式 INTO 變數
- FROM 表;
- - 使用
- select @變數名;
- 2、區域性變數
- 宣告:
- declare 變數名 型別 【default 值】;
- 賦值:
- 方式一:一般用於賦簡單的值
- SET 變數名=值;
- SET 變數名:=值;
- SELECT 變數名:=值;
- 方式二:一般用於賦表 中的欄位值
- SELECT 欄位名或表示式 INTO 變數
- FROM 表;
- 使用:
- select 變數名
10-3、系統變數和自定義變數區別
作用域 | 定義位置 | 語法 | |
---|---|---|---|
使用者變數 | 當前會話 | 會話的任何地方 | 加@符號,不用指定型別 |
區域性變數 | 定義它的BEGIN END中 | BEGIN END的第一句話 | 一般不用加@,需要指定型別 |
十一、儲存過程和函式
- 含義:一組經過預先編譯的sql語句的集合。
- 好處:
- 1、提高了sql語句的重用性,減少了開發程式設計師的壓力。
- 2、提高了效率。
- 3、減少了傳輸次數。
- 分類:
- 1、無返回無參。
- 2、僅僅帶in型別,無返回有參。
- 3、僅僅帶out型別,有返回無參。
- 4、既帶in又帶out,有返回有參。
- 5、帶inout,有返回有參。
11-1、建立儲存過程
- 1、DELIMITER 關鍵字及語法
- mysql 預設以分號為語句的結束,但是在建立儲存過程時 sql 語句中一般會出現多個分號。為了不讓語句過早遇見分號;執行。在建立語句首行使用該關鍵字+特殊符號來指定其他字元為語句的結束。最後再指定 delimiter ; 恢復分號為語句結束標誌。
- 例如:
- DELIMITER $$
- DROP TRIGGER IF EXISTS `updateegopriceondelete`$$
- CREATE
- TRIGGER `updateegopriceondelete` AFTER DELETE ON `customerinfo`
- FOR EACH ROW BEGIN
- DELETE FROM egoprice WHERE customerId=OLD.customerId;
- END$$
- DELIMITER ;
- 2 、語法
- #1、語法
- create procedure 儲存過程名(in|out|inout 引數名 引數型別,...)
- begin
- 儲存過程體
- end
- #2、類似於方法
- 修飾符 返回型別 方法名(引數型別 引數名,...){
- 方法體;
- }
- #3、注意
- 1、需要設定新的結束標記
- delimiter 新的結束標記
- 示例:
- delimiter $
- CREATE PROCEDURE 儲存過程名(IN|OUT|INOUT 引數名 引數型別,...)
- BEGIN
- sql語句1;
- sql語句2;
- END $
- 2、儲存過程體中可以有多條sql語句,如果僅僅一條sql語句,則可以省略begin end
- 3、引數前面的符號的意思
- in:該引數只能作為輸入 (該引數不能做返回值)
- out:該引數只能作為輸出(該引數只能做返回值)
- inout:既能做輸入又能做輸出
11-2、呼叫儲存過程
- call 儲存過程名(實參列表)
11-3、建立函式
- 學過的函式:LENGTH、SUBSTR、CONCAT 等。
- 語法
- CREATE FUNCTION 函式名(引數名 引數型別,...) RETURNS 返回型別
- BEGIN
- 函式體
- END
11-4、呼叫函式
- SELECT 函式名(實參列表)
11-5、函式和儲存過程的區別
關鍵字 | 呼叫語法 | 返回值 | 應用場景 | |
---|---|---|---|---|
函式 | FUNCTION | SELECT 函式() | 只能是一個 | 一般用於查詢結果為一個值並返回時,當有返回值而且僅僅一個 |
儲存過程 | PROCEDURE | CALL 儲存過程() | 可以有0個或多個 | 一般用於更新 |
十二、流程控制結構
12-1、分支
一、if函式
語法:if(條件,值1,值2)
特點:可以用在任何位置
二、case語句
語法:
情況一:類似於switch
case 表示式
when 值1 then 結果1或語句1(如果是語句,需要加分號)
when 值2 then 結果2或語句2(如果是語句,需要加分號)
...
else 結果n或語句n(如果是語句,需要加分號)
end 【case】(如果是放在begin end中需要加上case,如果放在select後面不需要)
情況二:類似於多重if
case
when 條件1 then 結果1或語句1(如果是語句,需要加分號)
when 條件2 then 結果2或語句2(如果是語句,需要加分號)
...
else 結果n或語句n(如果是語句,需要加分號)
end 【case】(如果是放在begin end中需要加上case,如果放在select後面不需要)
特點:
可以用在任何位置
三、if elseif語句
語法:
if 情況1 then 語句1;
elseif 情況2 then 語句2;
...
else 語句n;
end if;
特點:
只能用在begin end中!!!!!!!!!!!!!!!
三者比較:
應用場合
if函式 簡單雙分支
case結構 等值判斷 的多分支
if結構 區間判斷 的多分支
12-2、迴圈
語法:
【標籤:】WHILE 迴圈條件 DO
迴圈體
END WHILE 【標籤】;
特點:
只能放在BEGIN END裡面
如果要搭配leave跳轉語句,需要使用標籤,否則可以不用標籤
leave類似於java中的break語句,跳出所在迴圈!!!