B站MySQL基礎(尚硅谷)學習筆記
最近在學習資料庫技術,并且把視頻中的知識點進行了匯總,字數較多,僅供參考,
會持續更新
歡迎讀者提出問題與錯誤,一起交流~
視頻前幾集所講述的基本知識:
DB:資料庫,保存一組有組織的資料的容器,
DBMS:資料庫管理系統:又稱為資料庫軟體(產品),用于管理DB中的資料,
SQL:結構化查詢語言,用于和DBMS通信的語言,
將資料先放到表里面,再把表放到庫里,
一個資料庫中可以有多張表,每個表都有一個的名字,用來標識自己,表名具有唯一性,
表具有一些特性,這些特性定義了資料在表中如何存盤,類似java中類的設計,
表由列組成,我們也稱為欄位,所有表都是由一個或者多個列組成的,每一個列類似于Java中的屬性,
MySQL不區分大小寫,但建議關鍵字大寫,表名,列名小寫,
每條命令最好用分號結尾,
每條命令根據需要,可以進行縮進和換行,
注釋:單行注釋: # 注釋文字 單行注釋: – 注釋文字 多行注釋: /* 645465 */
DQL語言的學習(資料查詢語言)(針對于查詢(select))
DML語言的學習(資料操作語言)(針對于增刪改)
DDL語言的學習(資料定義語言)(針對庫和表的定義,創建洗掉等)
TCL語言的學習(事物控制語言)
DQL學習
進階一:基礎查詢
select 查詢串列 from 表名;
類似于: System.out.println(‘’列印的東西‘’);
特點:查詢串列可以是:表中的欄位、常量值、運算式、函式,查詢的結果是一個虛擬的表格,
1.查詢表中的單個欄位
SELECT last_name FROM employees;
2.查詢表中的多個欄位
SELECT last_name,salary,email FROM employees;
3.查詢表中的所有欄位
SELECT * FROM employees;
4.查詢常量值
SELECT 100;
SELECT 'john';
5.查詢運算式
SELECT 100*98;
SELECT 100%98;
6.查詢函式
SELECT VERSION();
7.起別名
1.便于理解,
2.如果要查詢的欄位有重名的情況,使用別名可以區分開來
方式一
SELECT 100%98 AS 結果;
SELECT last_name AS 姓,first_name AS 名 FROM employees;
方式二
SELECT last_name 姓, first_name 名 FROM employees;
案例:查詢salary ,顯示結果是 out put,
SELECT salary AS "OUT put" FROM employees;
8.去重
里面只可以放一個
案例 :查詢員工表中涉及到的所有部門編號
SELECT DISTINCT department_id FROM employees;
9.+號的作用
java中的+號作用:
1.運算子(數值型)
2.連接符,只要有一個運算元為字串,
mysql中的+號只有一個功能:運算子
select 100+90;
兩個運算元都是數值型,則做加法
select '123'+90;(為90)
其中一方為字符型,試圖將字符型數值轉換為數值型
如果轉換成功,就繼續左加法運算,如果轉換失敗,則將字符型數值轉換成0
select null+10;為null
案例:查詢員工名和姓鏈接成一個欄位,并顯示為姓名
SELECT
CONCAT(last_name,first_name) AS 姓名
FROM
employees;
10.` 的作用
著重號,用于區分NAME(關鍵字)和NAME(表內容)的區別,
建議還是不要使用 ,當需要命名name時,可以將name前面加上一些別的字母,用來于關鍵字區別,
如:s_name,t_name 等,
進階二:條件查詢
語法:
select
查詢串列
from
表名
where
篩選條件;
分類:
一、按條件運算式篩選
條件運算子: > < =(等于) <>(不等) >= <=
案例一:查詢工資大于12000的員工,
SELECT * FROM employees WHERE salary>12000 ;
案例二:查詢部門編號不等于90號的員工名和部門編號,
SELECT
last_name , department_id
FROM
employees
WHERE
department_id<>90;
# 或者 department_id!=90
二、按邏輯運算式篩選
作用:用于連接條件運算式
邏輯運算子 : && || !
推薦:and or not
案例一:查詢工資在10000-20000之間的員工名、工資以及獎金,
SELECT
last_name,salary,commission_pct
FROM
employees
WHERE
salary>=10000&&salary<=20000;
#或者用and
案例二:查詢部門編號不是在90-110之間,或者工資大于15000的員工資訊,
SELECT
*
FROM
employees
WHERE
department_id > 110 or department_id< 90 OR salary>15000;
或者:
SELECT
*
FROM
employees
WHERE
NOT(department_id>=90 AND department_id<=110) OR salary>15000;
三、模糊查詢
like、between and、in、is null
like
特點:一般和通配符搭配使用
通配符:
% 任意多個字符(包含零個)
_ 任一單個字符
案例一:查詢員工名中包含字符a的員工資訊,
SELECT
*
FROM
employees
WHERE
last_name LIKE '%a%' ;
案例二:查詢員工中第三個字符為e,第五個字符為a的員工名和工資,
SELECT
last_name,salary
FROM
employees
WHERE
last_name LIKE '___e_a%';
案例三:查詢員工名中第二個字符為下劃線的員工名,
SELECT
last_name
FROM
employees
WHERE
last_name LIKE '_\_%';
between and
使用between and可以提高陳述句的簡潔度,包含兩個臨界值,兩個臨界值不要顛倒順序,
案例一:查詢員工編號在100-120之間的員工資訊,
SELECT
*
FROM
employees
WHERE
employee_id BETWEEN 100 AND 120;
in
含義:判斷某欄位的值是否屬于in串列中的某一項,
特點:1.使用in提高陳述句簡潔度,
? 2.in串列的值型別必須統一或者兼容,
案例一:查詢員工的工種編號是IT_RPOG、AD_VP、AD_PRES中的一個員工名和工種編號
SELECT
last_name,job_id
FROM
employees
WHERE
job_id IN ('IT_RPOG','AD_VP','AD_PRES');
is null
案例一:查詢到沒有獎金的員工和獎金率,
SELECT
last_name,commission_pct
FROM
employees
WHERE
commission_pct IS NOT NULL;
<=>
安全等于:相當于是否等于
案例一:
SELECT
last_name,commission_pct
FROM
employees
WHERE
commission_pct <=>NULL;
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-5aFYAwpp-1614861109930)(C:\Users\劉暢\Pictures\Camera Roll\QQ圖片20210227103814.pngcenter">寫法
4.日期型
分類:
date只保存日期
time只保存時間
year只保存年
datetime保存日期+時間
TIMESTAMP保存日期+時間
比較:
| 位元組 | 范圍 | 時區等的影響 | |
|---|---|---|---|
| datetime | 8 | 較大1000-9999年 | 不受 |
| TIMESTAMP | 4 | 較小1970-2038年 | 受 |
進階十三:常見約束
一種限制,用于限制表中的資料,為了保證表中的資料的準確和可靠性
分類:
NOT NULL :非空,用于保證該欄位的值不能為空
比如姓名、學號等
DEFAULT:默認,用于保證該欄位的值有默認值
比如性別
PRIMARY KEY :主鍵,用于保證該欄位的值有唯一值,并且非空
比如學號、員工編號等
UNIQUE : 唯一,用于保證該欄位的值有唯一值,可以為空
比如座位號
CHECK:檢查約束【MySQL中不支持】[兼容性…不報錯,但是沒效果]
比如:年齡和性別
FOREIGN KEY :外鍵,用于限制兩個表的關系,用于保證該欄位的值必須來自于主表的關聯列的值
比如:學生表的專業編號,員工表的部門編號,員工表的工種編號
1.添加約束的時機
1.創建表時
2.修改表時
2.約束的添加分類
1.列級約束
六大約束語法上都支持,但外鍵約束沒有效果,
2.表級約束
除了非空,默認,其他的都支持,
CREATE TABLE 表名(
欄位名 欄位型別 列級約束
欄位名 欄位型別
表級約束
);
創建表時添加約束
#1.添加列級約束
語法:
? 直接在欄位名和型別后面追加約束型別即可
CREATE table stuinfo(
id INT PRIMARY KEY,#主鍵
stuName VARCHAR(20) NOT NULL ,#非空
gender CHAR(1) CHECK(gender='男'OR gender='女'),#檢查性別
seat INT UNIQUE ,#唯一
age INT DEFAULT 18 #默認約束
);
CREATE TABLE major(
id INT PRIMARY key,
majorName VARCHAR(20)
);
添加表級約束
在各個欄位最下面
【CONSTRAINT 約束名】(可以去掉) 約束型別(欄位名)
#通用寫法:
CREATE table IF NOT EXISTS stuinfo(
id INT PRIMARY KEY,
stuname VARCHAR(20) NOT NULL,
gender CHAR(1),
age INT DEFAULT 18,
seat INT UNIQUE ,
majorid INT,
FOREIGN KEY(majorid) REFERENCES major(id)
);
主鍵和唯一的區別
1.均可以保證唯一性
2.主鍵不允許為空,唯一可以為空
3.主鍵最多為一個(0/1)
唯一可以有多個
4.都允許組合,但是不推薦
外鍵的特點
1.要求在從表設定外鍵關系
2.從表的外鍵列的型別和主表中的關聯列的型別要求一致或者兼容,名稱無要求
3.主表的關聯列必須是個key(一般是主鍵或者唯一)
4.插入資料時,必須先插入主表(科目),再插入從表(學生),
洗掉資料時,先洗掉從表,再洗掉主表,
3.標識列
又稱為自增序列
含義:可以不用手動的插入值,系統提供默認的序列值
特點:1.標識列和key搭配
? 2.一個表中可以有至多一個標識列
? 3.標識列型別只能是數值型
? 4.標識列可以通過 SET auto_increment_increment=3;設定步長,可以通過手動插入值,設定起始值,
創建表時設定標識列
DROP TABLE IF EXISTS tab_identity;
CREATE TABLE tab_identity(
id INT PRIMARY KEY auto_increment,
NAME VARCHAR(20)
);
修改表時設定標識列
ALTER TABLE tab_identity MODIFY COLUMN id INT PRIMARY KEY auto_increment;
修改表時洗掉標識列
ALTER TABLE tab_identity MODIFY COLUMN id INT PRIMARY KEY;
進階十四:TCL語言 事務控制語言
事務:一個或一組sql陳述句組成一個執行單元,這個執行單元要么全部執行,要么全部不執行,
案例:轉賬
張三豐 1000
郭襄 1000
張三豐轉給郭襄500
張三豐 500
郭襄 1500
事務(ACID)的屬性:
1.原子性:原子性是指事務是一個不可分割的作業單位,事務中的操作要么都發生要么都不發生,
2.一致性:事務必須使資料庫從一個一致性狀態變成另外一個一致性狀態,
3.隔離性:事務的隔離性是指一個事務的執行不能被其他事務干擾,即一個事務內部的操作及使用的資料對并發的其他事務
是隔離的,并發執行的各個事務之間是不能互相干擾的,
4.持久性:持久性是指一個事務一旦被提交,它對資料庫中資料的改變就是永久性的,
接下來的其他操作和資料庫故障不應該對其有任何影響,
事務的創建:
隱式事務:事務沒有明顯的開啟和結束標記 比如:INSERT UPDATE DELETE 陳述句
顯式事務:事務具有明顯的開啟和結束的標記(前提,必須先設定自動提交功能為禁用)
1.開啟事務
SET autocommit=0;(關閉自動提交)
2.撰寫事務中的sql陳述句(SELECT INSERT UPDATE SELECT)
陳述句1;
陳述句2;
…
3.結束事務
COMMIT; 提交事務
ROLLBACK; 回滾事務
NOT NULL :非空,用于保證該欄位的值不能為空
比如姓名、學號等
DEFAULT:默認,用于保證該欄位的值有默認值
比如性別
PRIMARY KEY :主鍵,用于保證該欄位的值有唯一值,并且非空
比如學號、員工編號等
UNIQUE : 唯一,用于保證該欄位的值有唯一值,可以為空
比如座位號
CHECK:檢查約束【MySQL中不支持】[兼容性…不報錯,但是沒效果]
比如:年齡和性別
FOREIGN KEY :外鍵,用于限制兩個表的關系,用于保證該欄位的值必須來自于主表的關聯列的值
比如:學生表的專業編號,員工表的部門編號,員工表的工種編號
1.添加約束的時機
1.創建表時
2.修改表時
2.約束的添加分類
1.列級約束
六大約束語法上都支持,但外鍵約束沒有效果,
2.表級約束
除了非空,默認,其他的都支持,
CREATE TABLE 表名(
欄位名 欄位型別 列級約束
欄位名 欄位型別
表級約束
);
創建表時添加約束
#1.添加列級約束
語法:
? 直接在欄位名和型別后面追加約束型別即可
CREATE table stuinfo(
id INT PRIMARY KEY,#主鍵
stuName VARCHAR(20) NOT NULL ,#非空
gender CHAR(1) CHECK(gender='男'OR gender='女'),#檢查性別
seat INT UNIQUE ,#唯一
age INT DEFAULT 18 #默認約束
);
CREATE TABLE major(
id INT PRIMARY key,
majorName VARCHAR(20)
);
添加表級約束
在各個欄位最下面
【CONSTRAINT 約束名】(可以去掉) 約束型別(欄位名)
#通用寫法:
CREATE table IF NOT EXISTS stuinfo(
id INT PRIMARY KEY,
stuname VARCHAR(20) NOT NULL,
gender CHAR(1),
age INT DEFAULT 18,
seat INT UNIQUE ,
majorid INT,
FOREIGN KEY(majorid) REFERENCES major(id)
);
主鍵和唯一的區別
1.均可以保證唯一性
2.主鍵不允許為空,唯一可以為空
3.主鍵最多為一個(0/1)
唯一可以有多個
4.都允許組合,但是不推薦
外鍵的特點
1.要求在從表設定外鍵關系
2.從表的外鍵列的型別和主表中的關聯列的型別要求一致或者兼容,名稱無要求
3.主表的關聯列必須是個key(一般是主鍵或者唯一)
4.插入資料時,必須先插入主表(科目),再插入從表(學生),
洗掉資料時,先洗掉從表,再洗掉主表,
3.標識列
又稱為自增序列
含義:可以不用手動的插入值,系統提供默認的序列值
特點:1.標識列和key搭配
? 2.一個表中可以有至多一個標識列
? 3.標識列型別只能是數值型
? 4.標識列可以通過 SET auto_increment_increment=3;設定步長,可以通過手動插入值,設定起始值,
創建表時設定標識列
DROP TABLE IF EXISTS tab_identity;
CREATE TABLE tab_identity(
id INT PRIMARY KEY auto_increment,
NAME VARCHAR(20)
);
修改表時設定標識列
ALTER TABLE tab_identity MODIFY COLUMN id INT PRIMARY KEY auto_increment;
修改表時洗掉標識列
ALTER TABLE tab_identity MODIFY COLUMN id INT PRIMARY KEY;
進階十四:TCL語言 事務控制語言
事務:一個或一組sql陳述句組成一個執行單元,這個執行單元要么全部執行,要么全部不執行,
案例:轉賬
張三豐 1000
郭襄 1000
張三豐轉給郭襄500
張三豐 500
郭襄 1500
事務(ACID)的屬性:
1.原子性:原子性是指事務是一個不可分割的作業單位,事務中的操作要么都發生要么都不發生,
2.一致性:事務必須使資料庫從一個一致性狀態變成另外一個一致性狀態,
3.隔離性:事務的隔離性是指一個事務的執行不能被其他事務干擾,即一個事務內部的操作及使用的資料對并發的其他事務
是隔離的,并發執行的各個事務之間是不能互相干擾的,
4.持久性:持久性是指一個事務一旦被提交,它對資料庫中資料的改變就是永久性的,
接下來的其他操作和資料庫故障不應該對其有任何影響,
事務的創建:
隱式事務:事務沒有明顯的開啟和結束標記 比如:INSERT UPDATE DELETE 陳述句
顯式事務:事務具有明顯的開啟和結束的標記(前提,必須先設定自動提交功能為禁用)
1.開啟事務
SET autocommit=0;(關閉自動提交)
2.撰寫事務中的sql陳述句(SELECT INSERT UPDATE SELECT)
陳述句1;
陳述句2;
…
3.結束事務
COMMIT; 提交事務
ROLLBACK; 回滾事務
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/266432.html
標籤:其他
下一篇:oracle使用序列跳號問題
