作者:Gakki
1. 基礎(chǔ)
1.1 數(shù)據(jù)庫(kù)管理系統(tǒng)(數(shù)據(jù)庫(kù)軟件)
- 關(guān)系型數(shù)據(jù)庫(kù)(RDBMS)
- Oracle 數(shù)據(jù)庫(kù)
- MySQL 數(shù)據(jù)庫(kù)
- SQL server 數(shù)據(jù)庫(kù)
- PostgreSQL
- SQLite
- 非關(guān)系型數(shù)據(jù)庫(kù)(NoSQL)
- Redis(最好的緩存數(shù)據(jù)庫(kù))
- MongoDB(最好的文檔型數(shù)據(jù)庫(kù))
- Elasticsearch(最好的搜索服務(wù))
- Cassandra(最好的列式數(shù)據(jù)庫(kù))
- HBase(優(yōu)秀的分布式、列式數(shù)據(jù)庫(kù))
2. MySQL 的 DDL 操作
2.1 DDL 解釋
- DDL(Data Definition Language):數(shù)據(jù)定義語(yǔ)言,該語(yǔ)言部分包括以下內(nèi)容:
- 對(duì)數(shù)據(jù)庫(kù)的常用操作;
- 對(duì)表結(jié)構(gòu)的常用操作;
- 修改表的結(jié)構(gòu)。
2.2 對(duì)數(shù)據(jù)庫(kù)的常用操作
- 查看所有的數(shù)據(jù)庫(kù):
show database; - 創(chuàng)建數(shù)據(jù)庫(kù):
create database [if not exists] 數(shù)據(jù)庫(kù)名字 [charset = utf-8]; - 切換數(shù)據(jù)庫(kù):
use 數(shù)據(jù)庫(kù)名字; - 刪除數(shù)據(jù)庫(kù):
drop database [if exists] 數(shù)據(jù)庫(kù)名字;
2.3 對(duì)表結(jié)構(gòu)的常用操作 - 其他操作
- 查看當(dāng)前數(shù)據(jù)庫(kù)的所有表名稱:
show tables; - 查看指定某個(gè)表的創(chuàng)建語(yǔ)句:
show create table 表名; - 查看表結(jié)構(gòu):
desc 表名; - 刪除表:
drop table 表名;
2.4 對(duì)表結(jié)構(gòu)的常用操作 - 修改表結(jié)構(gòu)格式
2.4.1 添加列
- 語(yǔ)法格式:
alter table 表名 add 列名 類(lèi)型(長(zhǎng)度) [約束]; - 舉例:
- 為 student 表添加一個(gè)新的字段為:系別 dept ,類(lèi)型為 varchar(20);
alter table student add dept varchar(20);
2.4.2 修改列名和類(lèi)型
- 語(yǔ)法格式:
alter table 表名 change 舊列名 新列名 類(lèi)型(長(zhǎng)度) [約束]; - 舉例:
- student 表 dept 字段更換為 department varchar(30);
alter table student change dept department varchar(30);
2.4.3 刪除列
- 語(yǔ)法格式:
alter table 表名 drop 列名 - 舉例:
- 刪除 student 表中 department 這一列;
alter table student drop department;
2.4.4 修改表名
- 語(yǔ)法格式:
rename table 表名 to 新表名 - 舉例:
- 將 student 表改為 stu;
rename table student to stu
3. MySQL 的 DML 操作
3.1 概念
- DML(Data Manipulation Language) 是數(shù)據(jù)操作語(yǔ)言,主要對(duì) Mysql 的數(shù)據(jù)進(jìn)行增刪改;
- 關(guān)鍵字:
insert(插入)、update(更新)、delete(刪除)、truncate(刪除)
3.2 操作
3.2.1 數(shù)據(jù)插入
- 關(guān)鍵字:
insert - 格式:
- 方式1:
insert into 表名(列名1,列名2,……)value (值1,值2,……) - 方式2:
insert into 表名 value (值1,值2,……)
- 方式1:
3.2.2 數(shù)據(jù)修改
- 關(guān)鍵字:
update - 格式:
- 方式1:
update 表名 set 字段名 = 值,字段名 = 值,…… - 方式2:
update 表名 set 字段名 = 值,字段名 = 值,…… where ……
- 方式1:
3.2.3 數(shù)據(jù)刪除
- 關(guān)鍵字:
delete、truncate - 格式:
- 方式1:
delete from 表名注:這種方式會(huì)將整個(gè)表的數(shù)據(jù)全部刪除 - 方式2:
delete from 表名 where …… - 方式3:
truncate 表名注:這個(gè)是清空整個(gè)表,本質(zhì)上可以理解為刪除了表,并創(chuàng)建新表,和 delete 不同。
- 方式1:
4. MySQL 的約束
???4 . 1 主鍵約束
- 關(guān)鍵字:
primary key - 特點(diǎn):
- 一個(gè)表只有一個(gè)主鍵(包含聯(lián)合主鍵);
- 添加了主鍵約束的列不能為空,并且值不能重復(fù);
- 主鍵可以唯一的標(biāo)識(shí)表中的一行數(shù)據(jù),目的是提高查詢的效率;
- 使用:
create table emp ( eid int primary key; name varchar(20); deptId int; salary double );
?4.2 自增長(zhǎng)約束
- 關(guān)鍵字:
auto_increment - 特點(diǎn):
- 自增長(zhǎng)約束和主鍵一起使用;
- 自增長(zhǎng)約束默認(rèn)是從 1 開(kāi)始增長(zhǎng);
- 每次添加數(shù)據(jù),自增長(zhǎng)的值加 1;
- 使用:
create table t_user ( id int primary key auto_increment, name varchar(20) ); - delete 和 truncate 自增長(zhǎng)的特點(diǎn):
- delete 刪除數(shù)據(jù)之后,自增長(zhǎng)的值會(huì)被保留,從上一個(gè)斷點(diǎn)持續(xù)增長(zhǎng);
- truncate 是將表刪除,然后重新創(chuàng)建新表。所以清空數(shù)據(jù)之后,自增是 1 開(kāi)始。
?4.3 非空約束
- 關(guān)鍵字:
not null - 特點(diǎn):
- 添加非空約束的列不能為空;
- 真正的空是 NULL,不是 'NULL', 也不是 '';
- 使用:
create table t_user ( id int varchar(20) not null, address varchar(29) not null);
?4.4 唯一約束
- 關(guān)鍵字:
unique - 特點(diǎn):
- 添加唯一約束之后,該列的值不能重復(fù);
- 雖然不能重復(fù),但是添加唯一的約束的列可以為 NULL,因?yàn)?NULL 不等于 NULL;
- 使用:
create table t_user ( id int, name varchar (20), phone number varchar(20) unique;
?4.5 默認(rèn)約束
- 關(guān)鍵字:
default - 特點(diǎn):
- 添加約束的列如果沒(méi)有指定值,則為默認(rèn)值;
- 使用:
create table t_user ( id int, name varchar(20), address varchar(20) default '北京' );
4.6 零填充約束
- 關(guān)鍵字:
zerofill - 特點(diǎn):
- 當(dāng)給數(shù)值類(lèi)型設(shè)置該約束,則左邊不夠指定的整形長(zhǎng)度時(shí),則自動(dòng)補(bǔ)充0;
- 默認(rèn)零填充約束的數(shù)據(jù) int(10);
- 指定零填充約束的列為 unsigned 類(lèi)型,即無(wú)符號(hào)類(lèi)型;
- 使用:
create table t_user ( id int zerofill, name varchar(20) );
5. MySQL 的 DML 操作
5.1 簡(jiǎn)單查詢
- 查全表:
select * from 表名; - 指定字段查詢:
select 列名, 列名 from 表名; - 別名查詢:
- 列別名:
select pid as ‘商品id’, pname '商品名字', price from product; - 列別名:
select pname, price +10 as new price from product; - 表別名:
select pid as '商品id'', pname '商品名字', price from product as p;
- 列別名:
- 去重查詢:
- 關(guān)鍵字:
distinct - 操作:
- 去除重復(fù)行:
select distinct * from 表名; - 去除重復(fù)的列:
select distinct 列名 from 表名;
- 去除重復(fù)行:
- 關(guān)鍵字:
5.2 運(yùn)算符操作
- 算數(shù)運(yùn)算符:
+、-、*、/、%; - 比較運(yùn)算符:
<、>、<=、>=、!=、=、in、not in、like、is null、is not null; - 邏輯運(yùn)算符:
and(&&)、or(||)、not - 位運(yùn)算符(了解):
&、|、^、<<、>>、~;
5.3 排序查詢
- 關(guān)鍵字:
order by asc | desc; - 注:
asc:升序(默認(rèn)),desc:降序; - 特點(diǎn):
- 如果 oder by 后面跟一個(gè)字段,則只會(huì)按照該字段的值進(jìn)行排序,該字段必須為數(shù)值類(lèi)型或者英文和數(shù)字字符串類(lèi)型或者'2025-01-03';
- 如果 oder by 后面跟多個(gè)字段:order by c1,c2;解釋: 先按照 c1 來(lái)排序,如果 c1 相同,則按照 c2 排序;
- 操作:
- 使用價(jià)格排序(降序)
select * from product order by price desc; - 在價(jià)格排序(降序)的基礎(chǔ)上,以分類(lèi)排序(降序)
select * from product order by price desc, category_id desc;
- 使用價(jià)格排序(降序)
5.4 聚合查詢
- 關(guān)鍵字:
count();如:count(*),count(1)注:如果列有 null 值,則不會(huì)進(jìn)行統(tǒng)計(jì);sum();如:sum(price);注:如果列有 null 值,則不進(jìn)行計(jì)算,當(dāng)作不存在,列必須為數(shù)值列;-
max();如:max(price);注:如果列有 null 值,則不進(jìn)行計(jì)算,當(dāng)作不存在,列必須為數(shù)值列;
4.min();如:min(price);注:如果列有 null 值,則不進(jìn)行計(jì)算,當(dāng)作不存在,列必須為數(shù)值列; avg();如:avg(price);注:如果列有 null 值,則不進(jìn)行計(jì)算,當(dāng)作不存在,列必須為數(shù)值列;
- 注:一般情況下,聚合函數(shù)和分組會(huì)結(jié)合一起使用;
5.5 分組查詢
- 關(guān)鍵字:
group by - 特點(diǎn):
- 分組可以理解為將一張表格拆分成多張表,拆分的依據(jù)就是分組字段;
- 分組可以根據(jù)一個(gè)字段,也可以根據(jù)多個(gè)字段,如果是一個(gè)字段,則該字段相同就會(huì)分到同一組,如果是多個(gè)字段,則多個(gè)字段都相同才能分到同一組。
- 分組之后,select 的后面只可以跟組分字段和聚合操作。
- 注:
- 一般情況下,聚合函數(shù)和分組會(huì)結(jié)合一起使用;
- 分組之后,對(duì)分組后的操作進(jìn)行
條件判斷不能使用 where,必須使用 having;
SQL 執(zhí)行順序 - 這是我們實(shí)際上
SQL 執(zhí)行順序:我們先執(zhí)行from,join來(lái)確定表之間的連接關(guān)系,得到初步的數(shù)據(jù);where對(duì)數(shù)據(jù)進(jìn)行普通的初步的篩選;group by 分組;各組分別執(zhí)行having中的普通篩選或者聚合函數(shù)篩選。然后把再根據(jù)我們要的數(shù)據(jù)進(jìn)行select,可以是普通字段查詢也可以是獲取聚合函數(shù)的查詢結(jié)果,如果是集合函數(shù),select的查詢結(jié)果會(huì)新增一條字段將查詢結(jié)果去重distinct;最后合并各組的查詢結(jié)果,按照order by的條件進(jìn)行排序。
5.6 分頁(yè)顯示
- 關(guān)鍵字:
limit - 操作:
- 查詢 product 表的前 5 條記錄:
select * from product limit 5; - 從第 4 條開(kāi)始顯示,顯示 5 條:
select * from product limit 3,5;
- 查詢 product 表的前 5 條記錄:
6. MySQL 多表操作
6.1 前言
- 多表關(guān)系:1對(duì)1關(guān)系(很少用);1對(duì)多關(guān)系(很常見(jiàn));多對(duì)多關(guān)系(注意:多對(duì)多關(guān)系必須有中間表 )
-
外鍵【foreign key】約束:- 術(shù)語(yǔ):主表、從表、外鍵列;
- 創(chuàng)建方式:
- 方式一:在創(chuàng)建表的同時(shí)創(chuàng)建外鍵約束;
- 方式二:在創(chuàng)建表之后,通過(guò)修改表結(jié)構(gòu)的方式來(lái)添加外鍵約束;
- 特點(diǎn):
- 主表的數(shù)據(jù)可以隨便添加,從表的外鍵列數(shù)據(jù)必須依賴主表;
- 主表的數(shù)據(jù)如果被從表依賴,則不能刪除,而從表的數(shù)據(jù)可以隨便刪除;
6.2 多表聯(lián)合查詢
- 交叉連接查詢
- 特點(diǎn):形成一個(gè)笛卡爾集;
- 內(nèi)連接查詢:
- 隱式內(nèi)連接:
select * from A B where 條件; - 顯式內(nèi)連接:
select * from A inner join B on 條件; - 特點(diǎn):求兩張表的交集;
- 隱式內(nèi)連接:
- 外連接查詢:
- 左外連接
- 關(guān)鍵字:
left join - 特點(diǎn):將左表的數(shù)據(jù)全部輸出,如果右邊有對(duì)應(yīng)的數(shù)據(jù)則輸出,沒(méi)有對(duì)應(yīng)的數(shù)據(jù),則輸出 null。
- 關(guān)鍵字:
- 右外連接
- 關(guān)鍵字:
right join - 特點(diǎn):將右表的數(shù)據(jù)全部輸出,如果左邊有對(duì)應(yīng)的數(shù)據(jù)則輸出,沒(méi)有對(duì)應(yīng)的數(shù)據(jù),則輸出 null。
- 關(guān)鍵字:
- 完全連接
- 關(guān)鍵字:
full join - 特點(diǎn):返回左表和右表的所有數(shù)據(jù),并使用 null 值填充缺失的數(shù)據(jù);oracle 支持,mysql 不太支持,可以使用 union 關(guān)鍵字來(lái)實(shí)現(xiàn)。
- 方式一:
select * from student s full join record r on s.id = r.student_id; - 方式二:
- 關(guān)鍵字:
select * from student left join record on student.id = record.student_id union select * from student right join record on student.id = record.student_id; - 左外連接
- 子查詢
- 概念:select 的嵌套
- 查詢類(lèi)型:
- 將子查詢結(jié)果當(dāng)作一個(gè)值:一行一列;
- 將子查詢的結(jié)果當(dāng)成多個(gè)值:一列多行;
- 將子查詢的結(jié)果當(dāng)做一張表:一行多列或者多行多列;
- 關(guān)鍵字:
ALL:表示全部滿足;ANY / SOME:只要有一個(gè)滿足即可;IN:表示范圍內(nèi)的只要有匹配即可;EXISTS:如果查詢有結(jié)果,則返回 true;否則返回 false;
- 自關(guān)聯(lián)查詢
- 概念:一張表自己和自己關(guān)聯(lián);
- 特點(diǎn):表必須起別名。
