尚硅谷--MySQL--基礎篇(P1~P95)

尚硅谷--MySQL--基礎篇(P1~P95)

參考鏈接:https://www.bilibili.com/video/BV1iq4y1u7vj?p=199&spm_id_from=pageDriver

尚硅谷非常好的視頻之一,由於時間原因先學的高級篇,建議結合前面《JavaGuider-數據庫篇》進行查漏補缺,整個Mysql完整系統性學下來還是非常有收穫的。

csdn csdn csdn csdn csdn


🔥1. Mysql基礎篇

1.1.基本概念
1.1.1 數據庫名詞

​ DBMS:數據庫管理系統(管理各個數據庫)如:mysql Server,Oracle

​ DB:數據庫

​ RDBMS:關係型數據庫,即二維表格數據

​ 非RDBMS:非關係型數據庫,如鍵值數據庫,文檔型數據庫

1.1.2 ER圖與表關聯關係

​ ER圖:實體集(庫表)、屬性(字段)、聯繫集(庫表之間關係)

​ 表關聯關係:一對一、一對多、多對多、自我引用

1.1.3 SQL名詞
  1. DDL(data definition language):數據定義語言,操作庫表, create, drop, alter
  2. DML(data manipulation language):數據操作語言, CRUD
  3. DCL(data control language):數據控制語言。commit ,rollback
  4. TCL(transaction control language): 單獨抽取commit rollback
1.1.4 笛卡爾積

​ 兩張表的乘積個數。

(表一旦取了別名就不能再用表原名)

1.1.5 連接查詢
  1. Mysql不支持滿外連接

  2. union返回兩個結果集並集並去重

  3. union all 返回兩個結果並集不去重(若明確知道重複數據,則使用union all 可以提高查詢效率)

  4. natural join

    1. -- 目前都是mysql採用SQL99語法: 自動查詢兩張表中所有字段相同,實現select * from emp join dept where emp.did = dept.did and emp.name = dept.name這種
      SELECT * FROM `emp` NATURAL join dept
      
      -- 等價於emp.did=dept.did中同名字段
      select * from emp join dept using(did)
      
1.2 基本語法
1.2.0 基本語法
-- 算術運算符
select 100 + 17.6, 10 * 5, 100 / 2;
select * from user where id % 2 =0;

-- <=>安全的等於
select * from user where id <=> 1;
-- 不等於
select * from user where id <> 1;
1.2.1 基本函數
-- 數學:三角、進制函數
-- 字符串函數
/*日期函數:慚愧,以前還寫了篇SQL高級用法博客,結果在尚硅谷這裏也只是基本篇某個篇章,越是無知越自大啊。
 https://www.cnblogs.com/meditation5201314/p/15143702.html
 
 */
 
 -- 流程控制函數 if可以選擇2種結果。 case when... else end類似於if else 
select id, if(id >= 1, 'id大於等於1', 'id小於1'),
case when id = 1 then 'id等於1'
		 when id >1 and id <= 2  then 'id大於1小於2'
		 else '大於2' end 'details'
 from emp 
 -- case ..when..else .. end 結合算術運算使用類似於switch..case
 select case id when 1 then id * 100
				else id *200 end '新id'
from emp				

-- 	Mysql信息函數	
select 
VERSION() 'Mysql版本', 
CONNECTION_ID() '連接id', 
DATABASE() '數據庫', 
SCHEMA(),
USER() '用戶',
CURRENT_USER() '當前用戶',
CHARSET('尚硅谷') '字符集',
COLLATION('尚硅谷') '比較規則'


1.2.2 聚集函數
-- 可以單獨使用sum, avg,count這些
select sum(id) from emp;
select avg(id) from emp


-- 分組後可以統計組內其他字段
SELECT name, sum(last_qr_user_id) FROM `user` group by name
-- 多個字段分組
-- varchar類型存儲int數據,也是可以相加的
SELECT name, last_qr_user_id, sum(last_transfer_time) FROM `user` group by name, last_qr_user_id
-- select中非組函數字段必須申明在group by中
-- with rollup,在分組後取一條不分組、所有數據的條件來做個比較
SELECT name, sum(last_qr_user_id) FROM `user` group by name with ROLLUP
-- Having必須在group後面使用
SELECT name, sum(last_qr_user_id) FROM `user` group by name having max(last_qr_user_id) > 1


-- 總體順序 SQL執行原理:先多表join弄出一張虛擬表,然後根據條件查詢
select ....from ...join on 
where .... 
group ....
having ....
order by ....
limit ...


1.3 子查詢
1.3.1 基本概念

​ 一條SQL查詢出來的值查詢完後,供另一條SQL主查詢使用。能用自連接儘量避免子查詢,因爲是對未知表先查詢,mysql處理器對自連接做了優化。

1.3.2 子查詢分類
1. 單行、多行子查詢:看內查詢返回的結果
1. **相關、不相關子查詢**:子查詢和主查詢是否相關
1.3.3 單行子查詢

單行子查詢就是隻返回一行結果

-- 成對,可以進行多字段子查詢
select * from user where (last_transfer_time, last_qr_user_id) in (
select last_transfer_time, last_qr_user_id from user where id in(67, 69)
)

-- 子查詢配合having使用
select name, min(last_qr_user_id) from 
user group by name having min(last_qr_user_id) < (
select max(last_qr_user_id) from user
)

##單行子查詢-針對某個不確定的字段
SELECT
	id,
	NAME,
	(
	CASE
			name
		WHEN ( SELECT name FROM USER WHERE NAME = 'a函數一' ) then '胡宇喬' 
		ELSE '其他' END ) new_Name 
FROM
USER

-- 錯誤用法!:不能重複嵌套聚合函數
select sum(avg(last_qr_user_id)) from user group by name


1.3.4 多行子查詢

多行子查詢:返回多個子查詢結果

操作符:

1. in: 列表任意一個
1. any: 和單行比較
-- NULL問題:無論是單行還是多行,對子查詢的值小心NULL值,因爲in 相當於or = ,in (1, null) 等價於 a = 1 or a = null,而=null在MYSQL中查詢不到任何數據,只能用is null,記得剔除
##多行子查詢-any,all,some。any,some類似找min,all類似找MAX
#any
SELECT
	* 
FROM
USER
where id > ANY (select id from user where id > 1)
#all
SELECT
	* 
FROM
USER
where id >= ALL (select id from user where id > 1)
#some
SELECT
	* 
FROM
USER
where id >= SOME (select id from user where id > 1)




1.3.5 相關子查詢(*)
這個還是非常重要,比如查詢一張用戶-客戶表中,所有用戶最早添加客戶的時間,就需要用到相關子查詢
select * from a 
where a.add_time = (select min(add_time) from a2 where a.clientid = a2.clientid)


/* 除了group by 和limit 後,其他地方都可以聲明子查詢
select ..
from ...
where ...
group by ...
having ..
order by ..
limit ...


*/
1.4 數據類型
1.4.1 時間類型

​ 推薦datetime,會隨着服務器地區變換而變化,但timestamp不會

1.4.2 文本字符串類型

​ char, varchar(不要超過5000), text, enum

​ blob: 存儲圖片,音頻,視頻

​ json


1.5 個人總結

image-20220731120202523

【MySQL上篇:基礎篇】
【第1子篇:數據庫概述與MySQL安裝篇】
p01-p11
學習建議:零基礎同學必看,涉及理解和Windows系統下MySQL安裝

【第2子篇:SQL之SELECT使用篇】
p12-p48
學習建議:學習SQL的重點,必須重點掌握,建議課後練習多寫

【第3子篇:SQL之DDL、DML、DCL使用篇】
p49-p73
學習建議:學習SQL的重點,難度較SELECT低,練習寫寫就能掌握

【第4子篇:其它數據庫對象篇】
p74-p93
學習建議:對於希望早點學完MySQL基礎,開始後續內容的同學,這個子篇可以略過。
在工作中,根據公司需要進行學習即可。

【第5子篇:MySQL8新特性篇】
p94-p95
學習建議:對於希望早點學完MySQL基礎,開始後續內容的同學,這個子篇可以略過。
在工作中,根據公司需要進行學習即可。

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