Mysql入門詳細篇

前言

本篇博客是本人在學習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.圖形化工具:(很簡單!)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章