1. 程式人生 > 其它 >一、MySQL 基礎

一、MySQL 基礎

一、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 服務的啟動和停止 ★
  1. 方式一:計算機——右擊管理——服務

  2. 方式二:通過管理員身份執行
  3. net start 服務名(啟動服務)
  4. net stop 服務名(停止服務)
4-5、MySQL 服務的登入和退出 ★
  1. 方式一:通過mysql自帶的客戶端
  2. 只限於root使用者

  3. 方式二:通過windows自帶的客戶端
  4. 登入:
  5. mysql 【-h主機名 -P埠號 】-u使用者名稱 -p密碼

  6. 退出:
  7. 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):資料操作語言
	insertupdatedelete
DDLData Define Languge):資料定義語言
	createdropalter
TCL(Transaction Control Language):事務控制語言
	commitrollback

五、DQL語言的學習 ★
5-1、基礎查詢 ★
語法:
SELECT 要查詢的東西
【FROM 表名】;

類似於Java中 :System.out.println(要列印的東西);
特點:
①通過select查詢完的結果 ,是一個虛擬的表格,不是真實存在。
②要查詢的東西 可以是常量值、可以是表示式、可以是欄位、可以是函式  。  
5-2、條件查詢 ★
  1. 條件查詢:根據條件過濾原始表的資料,查詢到想要的資料
  2. 語法:
  3. select
  4. 要查詢的欄位|表示式|常量值|函式
  5. from

  6. where
  7. 條件 ;

  8. 分類:
  9. 一、條件表示式
  10. 示例:salary>10000
  11. 條件運算子:
  12. > < >= <= = != <>

  13. 二、邏輯表示式
  14. 示例:salary>10000 && salary<20000

  15. 邏輯運算子:

  16. and(&&):兩個條件如果同時成立,結果為true,否則為false
  17. or(||):兩個條件只要有一個成立,結果為true,否則為false
  18. not(!):如果條件成立,則not後為false,否則為true

  19. 三、模糊查詢
  20. 示例:last_name like 'a%'
5-3、排序查詢 ★
  1. 語法:
  2. select
  3. 要查詢的東西
  4. from

  5. where
  6. 條件

  7. order by 排序的欄位|表示式|函式|別名 【asc|desc
5-4、常見函式 ★
  1. 一、單行函式
  2. 1、字元函式
  3. concat拼接
  4. substr擷取子串
  5. upper轉換成大寫
  6. lower轉換成小寫
  7. trim去前後指定的空格和字元
  8. ltrim去左邊空格
  9. rtrim去右邊空格
  10. replace替換
  11. lpad左填充
  12. rpad右填充
  13. instr返回子串第一次出現的索引
  14. length 獲取位元組個數

  15. 2、數學函式
  16. round 四捨五入
  17. rand 隨機數
  18. floor向下取整
  19. ceil向上取整
  20. mod取餘
  21. truncate截斷
  22. 3、日期函式
  23. now當前系統日期+時間
  24. curdate當前系統日期
  25. curtime當前系統時間
  26. str_to_date 將字元轉換成日期
  27. date_format將日期轉換成字元
  28. 4、流程控制函式
  29. if 處理雙分支
  30. case語句 處理多分支
  31. 情況1:處理等值判斷
  32. 情況2:處理條件判斷

  33. 5、其他函式
  34. version版本
  35. database當前庫
  36. user當前連線使用者
5-5、分組函式 ★
  1. sum 求和
  2. max 最大值
  3. min 最小值
  4. avg 平均值
  5. count 計數

  6. 特點:
  7. 1、以上五個分組函式都忽略null值,除了count(*)
  8. 2、sum和avg一般用於處理數值型
  9. max、min、count可以處理任何資料型別
  10. 3、都可以搭配distinct使用,用於統計去重後的結果
  11. 4、count的引數可以支援:
  12. 欄位、*、常量值,一般放1

  13. 建議使用 count(*)
5-6、分組查詢 ★
  1. 語法:
  2. select 查詢的欄位,分組函式
  3. from
  4. group by 分組的欄位

  5. 特點:
  6. 1、可以按單個欄位分組
  7. 2、和分組函式一同查詢的欄位最好是分組後的欄位
  8. 3、分組篩選
  9. 針對的表 位置 關鍵字
  10. 分組前篩選: 原始表 group by的前面 where
  11. 分組後篩選: 分組後的結果集 group by的後面 having

  12. 4、可以按多個欄位分組,欄位之間用逗號隔開
  13. 5、可以支援排序
  14. 6having後可以支援別名
5-7、連線查詢 ★
  1. 笛卡爾乘積:如果連線條件省略或無效則會出現
  2. 解決辦法:新增上連線條件。

一、傳統模式下的連線 :等值連線——非等值連線。

  • 1.等值連線的結果 = 多個表的交集。
  • 2.n表連線,至少需要n-1個連線條件。
  • 3.多個表不分主次,沒有順序要求。
  • 4.一般為表起別名,提高閱讀性和效能。

二、sql99語法:通過join關鍵字實現連線。

  1. 含義:1999年推出的sql語法
  2. 支援:
  3. 等值連線、非等值連線 (內連線)
  4. 外連線
  5. 交叉連線

  6. 語法:

  7. select 欄位,...
  8. from1
  9. inner|left outer|right outer|crossjoin2 on 連線條件
  10. inner|left outer|right outer|crossjoin3 on 連線條件
  11. where 篩選條件】
  12. group by 分組欄位】
  13. having 分組後的篩選條件】
  14. order by 排序的欄位或表示式】

  15. 好處:語句上,連線條件和篩選條件實現了分離,簡潔明瞭!

三、自連線
案例:查詢員工名和直接上級的名稱

sql99

  1. SELECT e.last_name,m.last_name
  2. FROM employees e
  3. JOIN employees m ON e.`manager_id`=m.`employee_id`;

sql92

  1. SELECT e.last_name,m.last_name
  2. FROM employees e,employees m
  3. WHERE e.`manager_id`=m.`employee_id`;
5-8、子查詢 √

含義:

一條查詢語句中又嵌套了另一條完整的select語句,其中被巢狀的select語句,稱為子查詢或內查詢在外面的查詢語句,稱為主查詢或外查詢。

特點:

  1. 1、子查詢都放在小括號內
  2. 2、子查詢可以放在from後面、select後面、where後面、having後面,但一般放在條件的右側
  3. 3、子查詢優先於主查詢執行,主查詢使用了子查詢的執行結果
  4. 4、子查詢根據查詢結果的行數不同分為以下兩類:
  5. ① 單行子查詢
  6. 結果集只有一行
  7. 一般搭配單行操作符使用:> < = <> >= <=
  8. 非法使用子查詢的情況:
  9. a、子查詢的結果為一組值
  10. b、子查詢的結果為空

  11. ② 多行子查詢
  12. 結果集有多行
  13. 一般搭配多行操作符使用:any、all、innot in
  14. in: 屬於子查詢結果中的任意一個就行
  15. 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 聯合、合併

語法:

  1. select 欄位|常量|表示式|函式 【from 表】 【where 條件】 union 【all】
  2. select 欄位|常量|表示式|函式 【from 表】 【where 條件】 union 【all】
  3. select 欄位|常量|表示式|函式 【from 表】 【where 條件】 union 【all】
  4. .....
  5. select 欄位|常量|表示式|函式 【from 表】 【where 條件】

特點:

  1. 1、多條查詢語句的查詢的列數必須是一致的
  2. 2、多條查詢語句的查詢的列的型別幾乎相同
  3. 3、union代表去重,union all代表不去重

六、DML語言的學習 ★
6-2、插入語句

語法:
insert into 表名(欄位名,...)
values(值1,...);

特點:

1、欄位型別和值型別一致或相容,而且一一對應。
2、可以為空的欄位,可以不用插入值,或用null填充。
3、不可以為空的欄位,必須插入值。
4、欄位個數和值的個數必須一致。
5、欄位可以省略,但預設所有欄位,並且順序和表中的儲存順序一致	。
6-3、修改語句

修改單表語法:

	update 表名 set 欄位=新值,欄位=新值
	【where 條件】

修改多表語法:

update1 別名1,表2 別名2
	set 欄位=新值,欄位=新值
	where 連線條件
	and 篩選條件	
6-4、刪除語句

方式1:delete語句

1、單表的刪除: ★

delete from 表名 【where 篩選條件】

2、多表的刪除:

	delete 別名1,別名2
	from1 別名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. #1.建立表
  2. CREATE TABLE IF NOT EXISTS stuinfo(
  3. stuId INT,
  4. stuName VARCHAR(20),
  5. gender CHAR,
  6. bornDate DATETIME
  7. );

  8. DESC studentinfo;

  9. #2.修改表 alter
  10. 語法:ALTER TABLE 表名 ADD|MODIFY|DROP|CHANGE COLUMN 欄位名 【欄位型別】;

  11. #①修改欄位名
  12. ALTER TABLE studentinfo CHANGE COLUMN sex gender CHAR;

  13. #②修改表名
  14. ALTER TABLE stuinfo RENAME [TO] studentinfo;
  15. #③修改欄位型別和列級約束
  16. ALTER TABLE studentinfo MODIFY COLUMN borndate DATE ;

  17. #④新增欄位

  18. ALTER TABLE studentinfo ADD COLUMN email VARCHAR(20) first;
  19. #⑤刪除欄位
  20. ALTER TABLE studentinfo DROP COLUMN email;

  21. #3.刪除表

  22. 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、事務的分類
  • 隱式事務,沒有明顯的開啟和結束事務的標誌。
比如
insertupdatedelete語句本身就是一個事務。
- 顯式事務,具有明顯的開啟和結束事務的標誌。
	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、檢視的建立
  1. 語法:
  2. CREATE VIEW 檢視名
  3. AS
  4. 查詢語句;
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、檢視邏輯的更新
  1. #方式一:重新建立
  2. CREATE OR REPLACE VIEW test_v7
  3. AS
  4. SELECT last_name FROM employees
  5. WHERE employee_id>100;

  6. #方式二: 修改更新檢視邏輯
  7. ALTER VIEW test_v7
  8. AS
  9. SELECT employee_id FROM employees;

  10. SELECT * FROM test_v7;
9-5、檢視的刪除
  1. DROP VIEW test_v1,test_v2,test_v3;
9-6、檢視結構的檢視
  1. DESC test_v7;
  2. SHOW CREATE VIEW test_v7;
十、變數
10-1、系統變數
  • 1、全域性變數(作用域:針對於所有會話(連線)有效,但不能跨重啟)
  1. 檢視所有全域性變數
  2. SHOW GLOBAL VARIABLES;

  3. 檢視滿足條件的部分系統變數
  4. SHOW GLOBAL VARIABLES LIKE '%char%';

  5. 檢視指定的系統變數的值
  6. SELECT @@global.autocommit;

  7. 為某個系統變數賦值
  8. SET @@global.autocommit=0;
  9. SET GLOBAL autocommit=0;
  • 2、會話變數(作用域:針對於當前會話(連線)有效)
  1. 檢視所有會話變數
  2. SHOW SESSION VARIABLES;

  3. 檢視滿足條件的部分會話變數
  4. SHOW SESSION VARIABLES LIKE '%char%';

  5. 檢視指定的會話變數的值
  6. SELECT @@autocommit;
  7. SELECT @@session.tx_isolation;

  8. 為某個會話變數賦值
  9. SET @@session.tx_isolation='read-uncommitted';
  10. SET SESSION tx_isolation='read-committed';
10-2、自定義變數
  • 1、使用者變數

  1. - 宣告並初始化
  2. SET @變數名=值;
  3. SET @變數名:=值;
  4. SELECT @變數名:=值;

  5. - 賦值

  6. 方式一:一般用於賦簡單的值
  7. SET 變數名=值;
  8. SET 變數名:=值;
  9. SELECT 變數名:=值;

  10. 方式二:一般用於賦表 中的欄位值
  11. SELECT 欄位名或表示式 INTO 變數
  12. FROM 表;

  13. - 使用
  14. select @變數名;

  • 2、區域性變數
  1. 宣告:
  2. declare 變數名 型別 【default 值】;

  3. 賦值:
  4. 方式一:一般用於賦簡單的值
  5. SET 變數名=值;
  6. SET 變數名:=值;
  7. SELECT 變數名:=值;

  8. 方式二:一般用於賦表 中的欄位值
  9. SELECT 欄位名或表示式 INTO 變數
  10. FROM 表;

  11. 使用:
  12. 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 關鍵字及語法
  1. mysql 預設以分號為語句的結束,但是在建立儲存過程時 sql 語句中一般會出現多個分號。為了不讓語句過早遇見分號;執行。在建立語句首行使用該關鍵字+特殊符號來指定其他字元為語句的結束。最後再指定 delimiter ; 恢復分號為語句結束標誌。

  2. 例如:

  3. DELIMITER $$
  4. DROP TRIGGER IF EXISTS `updateegopriceondelete`$$
  5. CREATE
  6. TRIGGER `updateegopriceondelete` AFTER DELETE ON `customerinfo`
  7. FOR EACH ROW BEGIN
  8. DELETE FROM egoprice WHERE customerId=OLD.customerId;
  9. END$$
  10. DELIMITER ;
  • 2 、語法
  1. #1、語法
  2. create procedure 儲存過程名(in|out|inout 引數名 引數型別,...)
  3. begin
  4. 儲存過程體

  5. end

  6. #2、類似於方法
  7. 修飾符 返回型別 方法名(引數型別 引數名,...){

  8. 方法體;
  9. }

  10. #3、注意
  11. 1、需要設定新的結束標記
  12. delimiter 新的結束標記
  13. 示例:
  14. delimiter $

  15. CREATE PROCEDURE 儲存過程名(IN|OUT|INOUT 引數名 引數型別,...)
  16. BEGIN
  17. sql語句1;
  18. sql語句2;

  19. END $

  20. 2、儲存過程體中可以有多條sql語句,如果僅僅一條sql語句,則可以省略begin end

  21. 3、引數前面的符號的意思
  22. in:該引數只能作為輸入 (該引數不能做返回值)
  23. out:該引數只能作為輸出(該引數只能做返回值)
  24. inout:既能做輸入又能做輸出

11-2、呼叫儲存過程
  1. call 儲存過程名(實參列表)
11-3、建立函式
  • 學過的函式:LENGTH、SUBSTR、CONCAT 等。
  • 語法
  1. CREATE FUNCTION 函式名(引數名 引數型別,...) RETURNS 返回型別
  2. BEGIN
  3. 函式體

  4. END
11-4、呼叫函式
  1. 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語句,跳出所在迴圈!!!