MySQL數據庫知識復習
- 什麽是數據庫?
所謂數據庫,就是存儲數據的倉庫。數據有多種形式:文字,圖片,電影
- 什麽是數據庫系統?
管理數據庫的軟件就被稱為數據庫系統。數據庫系統一般分為兩個部分:數據庫(DB),數據庫管理系統(DBMS)
- 數據庫在Web程序開發中重要地位
動態網站基本上都是要對數據進行操作。例如新聞網站:當我們瀏覽新聞的時候,網頁的內容會經常發生變化,框架是不會變的。這就是一個典型的動態網頁。動態網頁的數據就是存儲在數據庫裏面。
PHP連接數據庫執行過程
- 為什麽選擇MySQL和PHP進行合作
理由很簡單,全都免費,中小企業的福音
- 結構化查詢語言
SQL:結構化查詢語言
SQL可以分為4個部分:DML,DDL,DQL,DCL
DML:數據操作語言,用於操作數據庫中的數據,例如insert,update,delete
DDL:數據定義語言,用於定義和管理數據對象,create,drop,alter
DQL:數據查詢語言,用於查詢數據的,select
DCL:數據控制語言,主要用於權限上面的修改,GRANT,commit,rollback
- 數據庫相關操作
既然要操作數據庫,那麽首先需要連接數據庫
語法:mysql -h 服務器主機地址 –u 用戶名 –p 用戶密碼
-h:指定所要連接的數據庫服務器的位置,可以是IP地址,也可以是服務器域名
-u:數據庫服務器所使用的用戶名
-p:連接數據庫服務器所使用的密碼
- 查看當前數據庫系統裏面的所有數據庫
Show databases
- 創建新用戶並授權
Mysql裏面默認的用戶是root,我們可以通過grant語句來創建新用戶並且授權
語法:
Grant 權限 on 數據庫.數據表 to 用戶名@登錄主機 identified by “密碼”
示例:創建一個叫做xiejie的用戶,權限是可以操作所有的數據庫的所有表,密碼是123
all 代表所有權限
*.* 代表所有數據庫的所有數據庫表
查看mysql數據庫裏面的所有用戶
語法:
Select distinct concat(‘user:’ ’’,user,[email protected]
查看具體某一個用戶的權限
語法:
Show grants for [email protected];
刪除用戶
方法一:
語法:drop user [email protected]
如下:
方法二:
語法:
Delete from mysql.user where host=’主機名’ and user=’用戶名’
示例:
Drop和delete的區別
Drop就是完全刪除,包括權限表裏面對應的權限信息和其他相關信息
Delete只是將該用戶刪除,並沒有刪除權限表相關的數據。後期如果重新建立一個同名的用戶的話,權限就會繼承之前的權限
- 數據庫相關操作
創建數據庫
語法:create database 數據庫名;
查看字符集
語法:show variables like ‘char%’;
校對規則:所謂校對規則,就是排序的方式,比較的規則。簡單來講就是按照什麽樣的規則進行排序
查看mysql裏面的校對規則:
Show collation;
Mysql中校對規則部分截圖
_ci:對大小寫不敏感
_cs:對大小寫敏感
_bin:基於二進制編碼進行比較
所以我們創建數據庫的時候可以指定字符集和校對規則
語法:
Create database 數據庫名 character set 字符集 collate 校對規則
如果要使用數據庫,需要先指定哪一個數據庫
Use 數據庫名
刪除數據庫
語法:drop database 數據庫名
修改已經創建好了的數據庫的字符集和校對規則
語法:
Alter database 數據庫名
[character set 字符集 collate 校對規則];
查看當前使用的數據庫
Select database()
查看數據庫
方法有2種:
顯示所有的數據庫
Show databases
顯示數據庫創建語句
Show create database 數據庫名
我們可以在後面添加一個\G,使其格式化輸出,方便我們查看
數據表相關
建立數據表
語法:
Create table 表名(字段名1 數據類型,字段名2 數據類型,字段名2 數據類型…);
創建數據表的時候也可以指定表的字符集和校對規則
查看數據表:3種方法
方法1:
Describe 表名
有一個簡寫:desc就是Describe的簡寫
查看所有數據表
Show tables
查看建表語句
Show create table 表名\G
加了\G的情況
數據表相關操作
修改表名
Alter table 原表名 rename 新表名
方法2:rename table 舊表名 to 新表名
給數據表添加列
語法:alter table 表名 add 新列名 數據類型
如果想要新添加的字段在所有字段的最開頭,後面再添加一個first關鍵字即可
修改某一個字段位於另外一個字段後面
語法:alter table 表名
Modify 字段名1 數據類型 after 字段名2
刪除某列
Alter table 表名
Drop 列名
修改字段的數據類型
語法:alter table 表名
Change 原字段名 新字段名 新數據類型
刪除表
Drop table 表名
MySQL裏面的數據類型
MySQL裏面的數據類型大致可以分為5類:整數數據類型,浮點型數據類型,字符串數據類型,日期時間數據類型,二進制數據類型
整數數據類型
整數數據類型大致又分為5類:TINYINT(1),SMALLINT(2),MEDIUMINT(3),INT(4),BIGINT(8)
浮點型數據類型:分為3種,float(4),double(8),decimal(17)
字符串數據類型:分為6種,char,varchar,TINYTEXT,TEXT,MEDIUMTEXT,LONGTEXT
char和varchar:char是定長,varchar是變長
char(5)abc 實際占用內存還是5個字節
varchar(5)abc 根據數據的長度實際占用的長度會改變,這裏因為abc只有3個字節,所以只占用3個字節
這兩個不存在誰好誰壞,char是省時間,varchar省空間
時間日期數據類型:分為5種,DATE,TIME,YEAR,DATETIME,TIMESTAMP
時間戳:所謂時間戳,就是從1970年1月1日0時0分0秒到現在的總秒數
數據的完整性
要實現數據的完整性,方法有4種:實體完整性,域完整性,引用完整性,自定義完整
實體完整性
所謂實體,就是一條完整的數據,換句話說,就是一行信息
姓名 |
年齡 |
分數 |
性別 |
張三 |
18 |
100 |
男 |
李四 |
20 |
99 |
女 |
保證實體完整性:主鍵約束和唯一約束
在創建表的時候,在字段後面添加primary key關鍵字
例如:創建表時id作為主鍵示例:
主鍵事實上就等於非空+唯一
指定某個字段為主鍵的方法二:
唯一約束:unique指定某一字段的值必須是唯一的
設置了唯一約束以後,字段的值就必須是唯一值
證明:主鍵=非空加唯一
域完整性:數據類型,非空約束,默認約束,檢查約束(mysql不支持檢查約束)
所謂域,就是指一列
數據類型:我們在創建表的時候指定數據類型,一定程度就是實現了域完整性(列完整性)例如age列是填寫年齡的,我們將其數據類型指定為int後該列的數據類型就只能是int型,從而保證了域完整性
非空約束:not null
默認約束:給某一個字段默認值
Default
引用完整性
引用完整性是通過外鍵約束來實現
一個表的某一個字段是引用的另外一張表的主鍵,該字段就被稱之為外鍵
示例:有兩張表:班級班,一個是學生表
班級表:有3個班,分別是pg37,pg39和youxiban
學生表:
自定義完整性
就是由用戶自己指定約束條件。
設置字段自動增加 auto_increment
設置了自動增長後字段可以自動增長
註意:設置自動增長時,該字段需要是主鍵或者設置了非空約束
存儲引擎
所謂存儲引擎,實際上就是指存儲表的類型是什麽
查看mysql裏面的存儲引擎
Show engines;
MyISAM:之前mysql主打的是MyISAM存儲引擎
InnoDB:現在mysql主打的是InnoDB
使用DML語句更改數據
DML語句無外乎就是3個,增加,刪除,修改
添加語句
Insert into 表名(要添加信息的字段名) values (對應字段的值)
如果是給所有字段添加數據
Insert into 表名 values (對應字段的值)
Insert into 表名
Set 字段名1=值1,字段名2=值2…
更新數據
Update 表名
Set 字段名1=值1,字段名2=值2…
需要註意的是:更新數據一定要和where進行配合使用
刪除數據
方法有2種:
通過delete關鍵字來刪除數據
語法:delete from 表名
Where 條件表達式
註意點:刪除某條數據以後,再重新添加新的數據,新的數據的主鍵部分的編號不做改變
刪除數據,後面的數據的主鍵編號也不會改變
刪除全部數據
Delete from 表名
Truncate 表名
Delete和truncate區別:
- Truncate是直接銷毀表,然後重新建立一個一模一樣的表,delete則是一條一條的進行刪除,如果是要刪除全表的話,truncate的效率要比delete要高
- 雖然truncate效率比delete高,但是沒有delete靈活,因為delete可以指定具體刪除某一條數據
- Truncate一般是被認為DDL語句,delete是被分為DML語句
- Truncate刪除所有數據後再重新添加數據,自動增長的字段重新從1開始增長,但是delete的話從刪除前的最大值+1開始
Truncate的情況:
Delete的情況
表的復制
方法一:
Create table 新表名 like 舊表名
註意:該方法只會復制表的結構,內容是不會被拷貝過去的
語法2:
Create table 新表名 as
(select * from 舊表名)
註意:該方法雖然可以復制內容,但是表結構不能得到完全的復制,自動增長和主鍵會丟失
語法3:
Create table 新表名 like 舊表名;
Insert into 新表名 select * from 舊表名;
DQL語句
DQL語句其實就是查詢語句,就只有一個select
Select * from 表名
Select 字段名1,字段名2… from 表名
按條件查詢
用where關鍵字對信息進行過濾
= |
等於 |
> |
大於 |
!= |
不等於 |
< |
小於 |
>= |
大於等於 |
<> |
也是表示不等於 |
<= |
小於等於 |
|
|
例如:查詢年齡大於20歲的人的姓名
In:判斷一個字段的值是否在一個集合裏面
可以和not關鍵進行配合,表示不在某一個集合
Between..and:表示是一個範圍
例如:要找18-20之間的人
可以和not配合,表示不再某一個範圍
空值查詢
Is null 代表空值查詢
查詢非空
Distinct:排除重復值
示例:找出學生有哪些年齡
註意:distinct只能放在查詢字段的最前面,不能放在後面,放在後面會報錯
模糊查詢
模糊查詢使用like關鍵字配合%和_
查詢名字裏面含有z字母的人
下劃線代表的意思就是一個_就匹配一個字符
需要註意空格也要匹配一個字符,所以也需要一個_
如果要查詢的內容裏面也包含了%或者下劃線,那麽需要對其進行轉義\
And
兩個條件都必須滿足
Or:滿足一個條件就可以
聚合函數和分組
聚合函數如下表
函數名 |
作用 |
函數名 |
作用 |
Count() |
返回某列的行數 |
Max() |
最大值 |
Sum() |
返回某列的和 |
Min() |
最小值 |
Avg() |
返回某列的平均值 |
|
|
主要註意一個平均數的計算
如果是使用系統提供的avg()函數,則有null值得字段不會被計算進去,根據實際業務需求,如果想要將null計算到平均數裏面,則需要自己定義。
排序
排序的關鍵字是order by
升序 ASC 降序DESC
升序的關鍵字ASC是可以省略的
降序desc
分組:使用的關鍵字為group by
如下:
還有一個和group by關鍵字一起配合的使用的是having
Having:用於過濾
Where:用於過濾
Where是在分組前進行過濾,having是在分組後進行過濾
先用where進行id過濾,然後進行分組,最後再過濾出分組後的成績
限制查詢結果
Limit:可以指定返回多少行數據
語法:limit a,b
A:代表開始的小標
B:代表總共顯示多少條
例如:1-100 5-15 limit 4,11
為表取別名
關鍵字as
聯表查詢
- 什麽是聯表查詢?
所謂聯表查詢,就是將多個表橫向連接起來,進行查詢。相比子查詢,要更加容易理解。
- 外鍵
所謂外鍵,就是指一個字段去引用另外一張表的主鍵字段
外鍵約束:所謂外鍵約束,就是因為系統並不知道兩張表之間的關系,所以我們添加外鍵約束來讓系統知道兩張表是存在引用關系
刪除外鍵
語法:alter table 表名(表名是有外鍵的那一張表)
Drop foreign key 外鍵名
- 表與表之間的關系
表與表之間的關系:一對一,一對多,多對多
一對一:人與身份證之間的關系
一對多:比如學生和班級之間的關系就是一對多,一個學生只可能屬於一個班級,但是一個班級可以對應多個學生
多對多:例如菜市場,一個商家可以對應多個買主,一個買主也可以去多個商家買菜
- 聯表查詢
聯表查詢可以分為3類:內連接,外鏈接,以及自連接
內連接:inner join
在mysql裏面,如果直接執行inner join但是不給條件的話,會得出笛卡爾乘積。
這裏有兩張表
學生表 班級表
接下來我們來執行不給條件的內連接,會得到笛卡爾乘積
在mysql裏面,如果內連接不給條件,那麽可以得到笛卡爾乘積,這是mysql的特殊處理機制。在其他數據庫管理系統裏面要得到笛卡爾乘積,使用的關鍵字為cross join。
在mysql裏面,使用cross join也能夠正常的得到笛卡爾乘積
語法:(內連接中的inner關鍵字可以省略)
Select 字段 from 表1 join 表2 on 表1.字段=表2.字段
除了on以外,還有where關鍵字是可以用的
雖然兩個關鍵字都能夠得出相同的效果,但是on的效率要高於where
On:在內聯之前就進行過濾
Where:產生了笛卡爾乘積以後進行過濾
外連接:
外連接分為3種:左外連接,右外連接,全外連接(mysql不支持全外連接)
使用union可以模擬出全外連接
左外連接:顯示左表的全部數據
如下:修改學生表的數據如下,添加niuer同學,班級編號為4,但是在班級表裏面沒有編號為4的班級
接下來進行左外連接,把左邊表的數據全部顯示出來
右外連接示例
首先給班級表添加新的數據,如下:
接下來進行右外連接,所謂右外連接,就是將右表的數據全部顯示出來,不管左表有沒有,如果左表沒有,顯示為null
關於左表和右表的判斷,非常簡單,join左邊的就是左表,join右邊的就是右表
全外連接:在標準的sql,全外連接的關鍵字為full join
左表右表的數據都顯示出來,雖然mysql不支持全外連接,但是可以使用union模擬全外連接
自連接:所謂自連接,就是自己連接自己,自連接的表來源源於同一張表,自連接其實就是內聯或者外聯的一種特殊情況
例如:有如下職員表
EmpID:員工編號 empName:員工姓名 leaderID:領導編號
查詢員工的姓名和所屬領導的姓名
復合條件連接查詢
所謂復合條件連接查詢,就是指在連接查詢的基礎添加一些過濾條件,如排序,limit
MySQL數據庫知識復習