前言
本篇博客是本人在學習mysql時做的筆記,帶有案例。適用與初學mysql的朋友
MySQL 基礎
1.數據庫的概念
1.數據庫的英文單詞:DataBase 簡稱:DB
2.什麼是數據庫:用來儲存數據的倉庫
3.數據庫的特點:
a.持久化儲存數據,其實數據庫就是一個文件系
b.方便儲存和管理數據
c.使用了統一的方式操作數據庫 - - SQL
2.常見的數據庫
a.MySQl:開源免費的數據庫,小型的數據庫,已經被Oracle公司收購了,MySQL6.X也開始收費
b.Oracle:收費的大型數據庫,Oracle公司產品
c.DB2:IBM公司的數據庫產品,收費的,常用在銀行系統中
d.SQLServlet:MicroSoft公司收費的中型數據庫,C# .net等語言常用
e.SQLite:嵌入式的小型數據庫,應用在手機端
f.常用的數據庫:MySQL,Oracle
3.SQL
a.SQL的概念:Structured Query Language ->結構化查詢語言
其實就是定義了操作所有關係類型數據庫的規則,每一種數據庫操作的方式存在不一樣的地方稱爲“方言”
b.SQL通用語法
1.SQL 語句可以單行或多行書寫,以分號結尾
2.可以使用空格和縮進來增強語句的可讀性
3.MySQL數據庫和SQL語句不區分大小寫,關鍵字建議使用大寫
4.三種註解
4.1.單行註釋 --(加空格)註釋內容
4.2.單行註釋 #(可加空格可不加空格)註釋內容 MySQL 特有的註釋方式
4.3.多行註釋 /* */
SQL分類
1.DDL(Data Definition Language)數據定義語言
用來定義數據庫對象:數據庫,表,列。關鍵字:create,drop,alter等
2.DML(Data Query Manipulation Language)數據操作語言
用來對數據庫中的表數據進行增刪改操作。關鍵字:insert,delete,update等
3.DQL(Data Query Language)數據查詢語言
用來查詢數據庫中的表的記錄(數據)。關鍵字:select,where等
4.DCL(Data Control Language)數據控制語言(瞭解內容)
用來定義數據庫的訪問權限和安全級別,及創建用戶。關鍵字:GRABT,REVOKE等
DDL
操作數據庫:CRUD
1.C(Create):創建
創建數據庫:
create database TestOne;(創建了一個叫TestOne的數據庫)
判斷數據庫是否存在,如果不存在就創建數據庫,否則就不創建:
create database if not exists TestOne;-- 如果TestOne數據庫不存在就創建數據庫,如果存在就不創建
判斷數據庫是否存在,如果不存在就創建數據庫,並制定字符集爲GBK(默認字符集是UTF-8)
create database if not exists TestOne character set gbk; – 如果Test數據庫不存在就 建數據,並將數據庫的字符集修改成GBK
2.R(Retrieve):查詢
查詢所有數據庫的名稱:
show databases;
查詢某個數據庫的字符集:查詢某個數據的創建語句
show create database 數據庫名稱;
3.U(Update):修改
修改數據庫的字符集
alter database character set 字符集;
4.D(Delete):刪除
刪除數據庫
drop databa 數據庫名稱;
判斷數據庫是否存在再刪除
drop database if exists User;
5.使用數據庫
查看當前正在使用的數據庫的名稱
select databases();
使用數據庫
use 數據庫名稱;
操作表
1.C(Cerate):創建表
創建表的語法:
create table 表名(
列名1 數據類型1,
列名2 數據類型2,
列名3 數據類型3,
列名4 數據類型4
);
數據庫裏的數據類型:
1.int:整數類型2.double:小數類型
3.date:日期,只包含年月日 yyyy-MM-dd
4.datetime:日期,包含年月日時分秒 yyyy-MM-dd HH:mm:ss
5.timestamp:時間錯類型 包含年月日時分秒 yyyy-MM-dd HH:mm:ss
6.varchar:字符串類型
在指定數據庫中創建一個表的案例:
//先創建一個數據庫
create database StudentData;
//創建表 表中有姓名,年齡,性別
create table student(name varchar(30),age int,sex varchar(1));
//name varchar(30) 表示name有30個字符長度
複製表
create table 表名 like 被複制的表名;
2.R(Retrieve):查詢表
查詢某個數據庫中的所有表
show tables;
查詢表結構
desc 表名;
3.U(Update):修改表
修改表名
alter table 表名 rename to 新表名;
修改表字符集
alter table 表名 character set 字符集名稱;
添加一列
alter table 表名 add 列名 數據類型;
修改列名稱 類型
alter table 表名 change 列名 新列名 新數據類型;
修改數據類型
alter table 表名 modify 列名 數據類型;
刪除列
alter table 表名 drop 列名;
4.D(Delete):刪除表
刪除表
drop tabel 表名;
判斷表是否存在,如果存在刪除
drop table if exists 表名;
DML增刪改表中數據
1.添加數據
語法:
insert into 表名(列名1,列名2,列名3,列名4) values (值1,值2,值3,值4);
注意:
1.列名和值要一一對應
2.如果列名後,不定義列名,則默認給所有行添加值
insert into 表名 values (值1,值2,值3,值4)
3.除了數字類型,其他類型需要使用單引號(單雙都可以)引起來
2.刪除數據
語法:
delecte from 表名 where 條件 (where條件是可選的)
注意:
1.如果不添加條件,則會刪除表中所有記錄
2.如果刪除所有記錄
delecte from 表名; – 不推薦使用,因爲有多少條記錄就會執行多少次刪除操作(效率低)
truncate table 表名; – 推薦使用,效率高,先刪除表然後再創建一張一摸一樣的表
3.修改數據
語法:
update 表名 set 列1 = 值1,… where 條件 (where條件是可選的)
注意:
如果不加任何條件,則會將表中的所有記錄全部修改
DQL:查詢表中的記錄
1.語法:
select
字段列表(比如 name,age,sex)
form
表名列表(如果是多表查詢就寫多個表,表與表之間用逗號隔開)
where
條件列表
group by
分組字段
having
分組之後的條件
order by
排序
limit
分頁限定
2.基礎查詢
1.多個字段查詢
select 字段名1,字段名2…from 表名;
注意:
如果查詢所有字段,則可以使用*來替代字段列表 select * from 表名;
2.去除重複
distinct
3.計算列
一般可以使用四則運算計算一些列的值。(一般只會進行數值型的計算)
sql中的一個函數:
ifnull(表達式1,表達式2):null參與運算,計算結果都爲null
表達式1:那個字段需要判斷是否爲null
表達式2:如果該字段爲null後替換值
4.起別名
as
as也可以省略不寫,用空格代替(空字符)
查詢的小案例
SHOW DATABASES; -- 查看所有數據庫 USE studentData; -- 使用 studentData這個數據庫 SHOW tables; -- 查看數據庫中的所有表 SELECT * FROM NewTable; -- 查詢表中的所有記錄 -- 需求一:查詢地區,去除重複的結果集 SELECT DISTINCT region FROM NewTable; -- 查詢地區並去除重複 -- 需求二:查詢學生表中的所有同學的所在地區 name region SELECT name,region FROM NewTable; -- 查詢姓名和地區 -- 需求三:計算三門學科的總分(有些同學的的學科成績爲null,null參與運算結果還是null,所以這裏用到sql裏面的一個函數 ifNULL(表達式1,表達式2)) SELECT name,chinese AS 語文,math AS 數學,english AS 英語,chinese + IFNULL(math,0) + english AS 總分 FROM NewTable;
3.條件查詢
1.where子句後跟條件
2.運算符
(大於)> (小於)< (等於)= (小於等於)<= (大於等於)>= (等於)= (不等於)<>
between...and 在值1與值2之間的值,包含值1和值2
IN(集合)
LIKE(模糊查詢)
佔位符:
1._:單個任意字符
2.%:多個任意字符
IS NULL
and 或 &&
or 或 ||
not 或 |
3.小案例
# 需求一:查詢年齡大於等於30歲的
SELECT * FROM NewTable WHERE age >= 30;
# 需求二:查詢年齡不等於30的
# 兩種方式:SELECT * FROM NewTable WHERE age != 30;
SELECT * FROM NewTable WHERE age <> 30;
# 需求三:查詢年齡大於等於30小於等於40
#三種方式:SELECT * FROM NewTable WHERE age >= 30 AND age <= 40;
# SELECT * FROM NewTable WHERE age >= 30 && age <= 40;
SELECT * FROM NewTable WHERE age BETWEEN 30 AND 40;
# 需求四:年齡等於26或者27或者28
SELECT * FROM NewTable WHERE age IN(26,27,28);
# 需求五:查詢數學成績爲null的
SELECT * FROM NewTable WHERE math IS NULL;
# 需求六:查詢數學成績不爲null
SELECT * FROM NewTable WHERE math IS NOT NULL;
# 需求七:查詢姓爲馬的所有人
SELECT * FROM NewTable WHERE name LIKE '馬%';
# 需求八:查詢第二個字爲六的所有人
SELECT * FROM NewTable WHERE name LIKE '_六%';
# 需求九:查詢名字爲三個字的所有人
SELECT * FROM NewTable WHERE name LIKE "___";
# 需求十:查詢名字中包含馬的所有人
SELECT * FROM NewTable WHERE n ame LIKE "%馬%";
1.DQL:查詢語句
1.排序查詢
語法:order by 子句
order by 排序字段1,排序方式1,排序字段2,排序方式2…
排序方式:
ASC:升序,默認的
DESC:降序
注意:
如果有多個排序條件,則當前面的條件值一樣的,纔會判斷第二條件
排序的小案例 # 排序 # 需求一:將所有同學的語文成績按升序排序 SELECT * FROM NewTable ORDER BY chinese; # 需求二:將所有同學的語文成績按降序排序,如果語文成績一樣,則按英語成績的升序排序 SELECT * FROM NewTable ORDER BY chinese DESC,english DESC;
2.聚合查詢
概念:將一列數據作爲一個整體,進行縱向的計算
a.count:計算個數
b.max:計算最大值
c.min:計算最小值
d.sum:計算和
e.avg:計算平均值
注意:
聚合函數的計算排除null值
解決方案:
1.選擇不包含null的列進行計算
2.IFNULL函數
小案例演示 # 聚合函數 # 需求一:計算表中的個數 SELECT COUNT(name) FROM NewTable; -- 10 # 如果選擇的列中包含非空(null),比如根據數學成績統計個數 SELECT COUNT(math) FROM NewTable; -- 本來是十個,現在是八個了 聚合函數計算個數排除了非空(null) # 解決方案一: SELECT COUNT(IFNULL(math,0)) FROM NewTable; # 解決方案二: # 選擇非空的一列進行計算個數 # 需求二:計算語文成績的最大值 SELECT MAX(chinese) FROM NewTable; -- 100 # 需求三:計算語文成績的最小值 SELECT MIN(chinese) FROM NewTable; -- 78 # 需求四:計算語文成績的平均分 SELECT AVG(chinese) FROM NewTable; -- 87.1000
3.分組查詢
語法:group by 分組字段
注意:
1.分組後查詢的字段:分組字段,聚合函數
2.where 和 having 的區別·:
a.where在分組之前進行限定,如果不滿足條件,則不參與分組。having在分組之後進行限定。如果不滿足結果,則不會查詢出來
b.where後不可用跟聚合函數,having可以進行聚合函數的判斷
小案例 # 分組 # 需求一:按照性別分組,分別查詢男,女同學的平均分,人數 SELECT sex,AVG(chinese),COUNT(name) FROM NewTable GROUP BY sex; # 需求二:按照性別分組,分別查詢男,女同學的平均分,人數 要求:分數低於80分的人不參與查詢 SELECT sex,AVG(chinese),COUNT(name) FROM NewTable WHERE chinese > 80 GROUP BY sex; # 需求三:按照性別分組,分別查詢男,女同學的平均分,人數 要求:分數低於80分的人不參與查詢,並且人數要大於2人 SELECT sex,AVG(chinese),COUNT(name) FROM NewTable WHERE chinese > 80 GROUP BY sex HAVING COUNT(name) > 2;
SELECT:查看結果的列,或者聚合函數相關計算
FROM:從哪個表中查數據
WHERE:根據條件,過濾表中的數據
GROUP BY:將WHERE過濾的數據行分組
HAVING:對分組的數據進行過濾
ORDER BY:按照什麼順序來排序最後的數據問題:這些sql中的關鍵字的執行順序分別是什麼?
select name ,age from tb where id>‘1’ group by name order by age limit 1,3;
看以上這條語句:
執行順序 from tb(從那張表查詢數學)select name ,age(查詢那些字段) where id>‘1’(根據什麼去查詢這些字段)group by name (查詢出來,根據name去進行分組)order by age(根據age去排序 默認排序asc 升序) limit 1,3(分頁)
4.分頁查詢
1.語法:limit 開始索引,每頁查詢的條數
2.公式:開始索引 = (當前的頁碼 -1) * 每頁顯示的條數
3.limit是mysql的 “方言“
4.小案例
# 分頁
# 需求:每頁顯示四條數據
# LIMIT 是mysql特有的方言
# LIMIT 開始索引,條數
# 開始索引 = 當前頁數-1乘以每頁的條數
SELECT * FROM NewTable LIMIT 0,4; -- 第一頁
SELECT * FROM NewTable LIMIT 4,4; -- 第二頁
SELECT * FROM NewTable LIMIT 8,4; -- 第三頁
2.約束
1.約束的概念:對錶中的數據進行限定,保證數據的正確性,有效性和完整性。
約束的分類:
1.主鍵約束:primary key
1.主鍵約束:primary key
注意:
a.含義:非空切爲一
b.一張表只有一個主鍵
c.主鍵就是表中記錄的唯一表示
#以下sql語句用來演示主鍵約束
#創建表,並給表中的指定列添加主鍵約束
CREATE TABLE stu(
id int PRIMARY KEY,
name varchar(20),
age int,
sex varchar(1)
);
#向表中添加一條數據
INSERT INTO stu(id,name,age,sex) VALUES (1,"張三",23,"男");
#向表中添加一條重複id的數據 sql語句編譯報錯
INSERT INTO stu(id,name,age,sex) VALUES (1,"李四",24,"男"); #Duplicate entry '1' for key 'PRIMARY' key 'PRIMARY'的重複條目'1'
#刪除主鍵約束
ALTER TABLE stu DROP PRIMARY KEY;
#創建表時沒有添加主鍵,可以通過下面這條sql語句給表中的指定列添加主鍵
ALTER TABLE stu MODIFY id int PRIMARY KEY;
自動增長(一般和主鍵配合使用)
1.概念:如果某一列是數值類型,可以使用 auto_increment關鍵字來完成值的自動增長
2.演示定義方式
#演示主鍵和自動增長
#創建表stu 給指定列設定主鍵約束,並自動增長
CREATE TABLE stu(
id int PRIMARY KEY AUTO_INCREMENT,
name varchar(20),
age int,
sex varchar(1)
);
#向表中添加數據
INSERT INTO stu(id,name,age,sex) VALUES (1,"張三",23,"男");
INSERT INTO stu(id,name,age,sex) VALUES (NULL,"張三",23,"男"); #執行這條語句時id的值不爲null而是爲2
# 查看錶中數據
SELECT * FROM stu;
# 刪除自動增長 注意如果時配合主鍵一起使用的話 這條語句刪除的只是自動增長,沒有刪除主鍵約束
ALTER TABLE stu MODIFY id int;
#添加自動增長
ALTER TABLE stu MODIFY id int AUTO_INCREMENT;
2.非空約束:not null
2.非空約束:某一列的值不能爲null
#第一種方式,在創建表時對錶種的列進行非約束
#在studentData這個數據庫中創建一張新的表,並對錶中的指定屬性,name屬性進行非空約束
CREATE TABLE NewStudentData(
id int,
name varchar(20) NOT NULL,
age int,
sex varchar(1)
);
SELECT * FROM NewStudentData;
INSERT INTO NewStudentData(id,name,age,sex) VALUES (1,NULL,23,"男"); #錯誤的添加方式
#指定了name這個值不爲null 如果name的值爲null,那麼回sql語句執行就會報錯
# Column 'name' cannot be null (列“name”不能爲空)
INSERT INTO NewStudentData(id,name,age,sex) VALUES (1,"張三",23,"男"); #正確的添加方式
# 執行正確的sql語句後,查看錶中所有的數據
SELECT * FROM NewStudentData;
#刪除非空約束
ALTER TABLE NewStudentData MODIFY name varchar(20);
#第二種方式,在創建表後對指定列添加非空約束
ALTER TABLE NewStudentData MODIFY name varchar(20) NOT NULL;
#這條語句是測試 錯誤的演示
INSERT INTO NewStudentData(id,name,age,sex) VALUES (1,NULL,23,"男"); #Column
'name' cannot be null 添加非空約束成功
3.唯一約束:unique
3.唯一約束:unique,某一列的值不能重複
#創建一個表 用來演示唯一約束 (在創建表時對指定列限定唯一約束)
CREATE TABLE stu(
id int,
name varchar(20),
phone varchar(11) UNIQUE
);
#向表中添加數據 兩條演示數據
INSERT INTO stu(id,name,phone) VALUES (1,"張三","110");
INSERT INTO stu(id,name,phone) VALUES (2,"李四","110"); #Duplicate entry '110' for key 'phone' 唯一約束錯誤提示信息
#刪除唯一約束
ALTER TABLE stu DROP INDEX phone;
#在創建表後給指定列限定唯一約束
ALTER TABLE stu MODIFY phone varchar(11) UNIQUE;
#添加相同的數據進行測試
INSERT INTO stu(id,name,phone) VALUES (2,"李四","110"); #Duplicate entry '110' for key 'phone'
4.外鍵約束:foreign key
a.外鍵約束:foreign key,讓表與表之間產生關係,從而保證數據的正確性
b.外鍵的作用:進行多表數據的關聯
c.主表(父表):數據來源表/主鍵所在表
d.從表(子表):數據引用表/外鍵所在表
e.強制保證外鍵數據的完整性
f.即以下情況,外鍵約束會強制保護數據
1.從表嘗試引用主鍵不存在的數據
2.主表嘗試刪除從表引用數據
1.在創建表時,可以添加外鍵
語法:
create table 表名(
...
#外鍵列
constraint 外鍵名稱 foreign key(外鍵列的名稱) references 主表名稱(主表列名稱)
);
2.刪除外鍵
alter table 表名 drop foreign key 外鍵名稱;
3.創建表之後,添加外鍵
alter table 表名 add constraint 外鍵名稱 foreign key(外鍵字段名稱) references 主表名稱(主表列名稱)
4.級聯操作
1.添加級聯操作
語法:
alter table 表名 add constraint 外鍵名稱 foreign key(外鍵字段名稱) references 主表名稱(主表列名稱) on update cascade on delete cascade;
2.分類:
2.1.聯動更新: on update cascade
2.2.聯動刪除: on delete cascade
外鍵約束演示sql語句:
SHOW DATABASES;
USE studentData;
show tables;
#創建部門表 (id,dep_name,dep_location)
create table department(
id int primary key auto_increment,
dep_name varchar(20),
dep_location varchar(20)
);
-- 創建員工表(id,name,age,dep_id)
-- 多方,從表
create table employee(
id int primary key auto_increment,
name varchar(20),
age int,
dep_id int, -- 外鍵對應主表的主鍵
#在創建表時添加外鍵約束添加外鍵約束
CONSTRAINT emp_dep_id FOREIGN KEY(dep_id) REFERENCES department(id)
)
-- 添加2個部門
insert into department values(null, '研發部','廣州'),(null, '銷售部', '深圳');
select * from department;
-- 添加員工,dep_id 表示員工所在的部門
INSERT INTO employee (NAME, age, dep_id) VALUES ('張三', 20, 1);
INSERT INTO employee (NAME, age, dep_id) VALUES ('李四', 21, 1);
INSERT INTO employee (NAME, age, dep_id) VALUES ('王五', 20, 1);
INSERT INTO employee (NAME, age, dep_id) VALUES ('老王', 20, 2);
INSERT INTO employee (NAME, age, dep_id) VALUES ('大王', 22, 2);
INSERT INTO employee (NAME, age, dep_id) VALUES ('小王', 18, 2);
select * from employee;
#刪除外鍵約束
ALTER TABLE employee DROP FOREIGN KEY emp_dep_id;
#在創建表後添加外鍵約束,並添加更新級聯,刪除級聯
ALTER TABLE employee ADD CONSTRAINT emp_dep_id FOREIGN KEY(dep_id) REFERENCES
department(id) on update cascade on delete cascade;
3.數據庫的設計
1.多表之間的關係
概念:設計數據庫時,需要遵循的一些規範要求,必須先遵循前面的所有範式要求
設計數據庫時,遵循不同的範式要求,設計出合理的關係型數據庫,這些不同的範式要求被稱爲不同的範式,各種範式呈遞次規範,越高的範式數據庫塵于越小
目前關係數據庫有六種範式:第一範式(1NF),第二範式(2NF),第三範式(3NF),第四範式(巴斯-科德範式(BCNF)),第五範式(5NF,又稱完美範式)
分類:
1.第一範式(1NF):每一列都是不可分割的原子數據項
2.第二範式(2NF):在1NF的基礎上,非碼屬性必須完全依賴於候選碼(在1NF的基礎上消除非主屬性對主碼的部分函數依賴)
幾個概念:
1.函數依賴:A --> B,如果通過A屬性(屬性組)的值,可以確定唯一B屬性的值,則稱B依賴於A
例如:學號 --> 學生姓名 (學號,課程名稱) --> 分數
2.完全函數依賴:A --> B,如果A是一個屬性組,則B屬性值得確定需要依賴於A屬性組中的所有屬性值
例如:(學號,課程名稱) --> 分數
3.部分函數依賴:A --> B,如果A是一個屬性組,則B屬性值得確定需要依賴於A屬性組中某一些值即可
例如:(學號,課程名稱) --> 姓名
4.傳遞函數依賴:A --> B, B --> C,如果通過A屬性(屬性組)的值,可以確定唯一B屬性的值,在通過B屬性(屬性組)的值可以確定唯一C屬性的值,則稱C傳遞函數依賴於A
例如:學好 -->系名,系名 --> 系主任
5.碼:如果在一張表中,一個屬性或屬性組,被其他所有屬性完全依賴,則稱這個屬性(屬性組)爲該表的碼
例如:該表中碼爲:(學號,課程名稱)
主屬性:碼屬性組中的所有屬性
非主屬性:除過碼屬性的屬性
3.第三範式(3NF):在2NF基礎上,任何非主屬性不依賴於其他非主屬性(在2NF基礎上消除傳遞依賴)
2.數據庫的備份和還原
備份和還原的兩種方式
1.命令行
備份:
語法:mysqldump -u用戶名(root) -p密碼(root) 數據庫名稱 >>保存的路徑
還原:
1.登錄數據庫
2.創建數據庫
3.使用數據庫
3.執行文件(xxx.sql文件)語法:source 文件路徑;
2.圖形化工具:(很簡單!)