1. 程式人生 > >MySQL數據庫知識復習

MySQL數據庫知識復習

ria 進行 width back 創建表 nio 刪除用戶 判斷 姓名

  1. 什麽是數據庫?

所謂數據庫,就是存儲數據的倉庫。數據有多種形式:文字,圖片,電影

  1. 什麽是數據庫系統?

管理數據庫的軟件就被稱為數據庫系統。數據庫系統一般分為兩個部分:數據庫(DB),數據庫管理系統(DBMS

  1. 數據庫在Web程序開發中重要地位

動態網站基本上都是要對數據進行操作。例如新聞網站:當我們瀏覽新聞的時候,網頁的內容會經常發生變化,框架是不會變的。這就是一個典型的動態網頁。動態網頁的數據就是存儲在數據庫裏面。

PHP連接數據庫執行過程

  1. 為什麽選擇MySQLPHP進行合作

理由很簡單,全都免費,中小企業的福音

  1. 結構化查詢語言

SQL:結構化查詢語言

SQL可以分為4個部分:DMLDDLDQLDCL

DML:數據操作語言,用於操作數據庫中的數據,例如insertupdatedelete

DDL:數據定義語言,用於定義和管理數據對象,createdropalter

DQL:數據查詢語言,用於查詢數據的,select

DCL:數據控制語言,主要用於權限上面的修改,GRANTcommitrollback

  1. 數據庫相關操作

既然要操作數據庫,那麽首先需要連接數據庫

語法:mysql -h 服務器主機地址 –u 用戶名 –p 用戶密碼

-h:指定所要連接的數據庫服務器的位置,可以是IP地址,也可以是服務器域名

-u:數據庫服務器所使用的用戶名

-p:連接數據庫服務器所使用的密碼

  1. 查看當前數據庫系統裏面的所有數據庫

Show databases

  1. 創建新用戶並授權

Mysql裏面默認的用戶是root,我們可以通過grant語句來創建新用戶並且授權

語法:

Grant 權限 on 數據庫.數據表 to 用戶名@登錄主機 identified by “密碼”

示例:創建一個叫做xiejie的用戶,權限是可以操作所有的數據庫的所有表,密碼是123

all 代表所有權限

*.* 代表所有數據庫的所有數據庫表

查看mysql數據庫裏面的所有用戶

語法:

Select distinct concat(‘user:’ ’’,user,[email protected]

/* */,host,’’’;’)as query from mysql.user

查看具體某一個用戶的權限

語法:

Show grants for [email protected];

刪除用戶

方法一:

語法:drop user [email protected]

如下:

方法二:

語法:

Delete from mysql.user where host=’主機名’ and user=’用戶名’

示例:

Dropdelete的區別

Drop就是完全刪除,包括權限表裏面對應的權限信息和其他相關信息

Delete只是將該用戶刪除,並沒有刪除權限表相關的數據。後期如果重新建立一個同名的用戶的話,權限就會繼承之前的權限

  1. 數據庫相關操作

創建數據庫

語法: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 新表名

方法2rename table 舊表名 to 新表名

給數據表添加列

語法:alter table 表名 add 新列名 數據類型

如果想要新添加的字段在所有字段的最開頭,後面再添加一個first關鍵字即可

修改某一個字段位於另外一個字段後面

語法:alter table 表名

Modify 字段名1 數據類型 after 字段名2

刪除某列

Alter table 表名

Drop 列名

修改字段的數據類型

語法:alter table 表名

Change 原字段名 新字段名 新數據類型

刪除表

Drop table 表名

MySQL裏面的數據類型

MySQL裏面的數據類型大致可以分為5類:整數數據類型,浮點型數據類型,字符串數據類型,日期時間數據類型,二進制數據類型

整數數據類型

整數數據類型大致又分為5類:TINYINT1),SMALLINT2),MEDIUMINT3),INT4),BIGINT8

浮點型數據類型:分為3種,float4),double8),decimal17

字符串數據類型:分為6種,charvarcharTINYTEXTTEXTMEDIUMTEXTLONGTEXT

charvarcharchar是定長,varchar是變長

char5abc 實際占用內存還是5個字節

varchar5abc 根據數據的長度實際占用的長度會改變,這裏因為abc只有3個字節,所以只占用3個字節

這兩個不存在誰好誰壞,char是省時間,varchar省空間

時間日期數據類型:分為5種,DATETIMEYEARDATETIMETIMESTAMP

時間戳:所謂時間戳,就是從197011000秒到現在的總秒數

數據的完整性

要實現數據的完整性,方法有4種:實體完整性,域完整性,引用完整性,自定義完整

實體完整性

所謂實體,就是一條完整的數據,換句話說,就是一行信息

姓名

年齡

分數

性別

張三

18

100

李四

20

99

保證實體完整性:主鍵約束和唯一約束

在創建表的時候,在字段後面添加primary key關鍵字

例如:創建表時id作為主鍵示例:

主鍵事實上就等於非空+唯一

指定某個字段為主鍵的方法二:

唯一約束:unique指定某一字段的值必須是唯一的

設置了唯一約束以後,字段的值就必須是唯一值

證明:主鍵=非空加唯一

域完整性:數據類型,非空約束,默認約束,檢查約束(mysql不支持檢查約束)

所謂域,就是指一列

數據類型:我們在創建表的時候指定數據類型,一定程度就是實現了域完整性(列完整性)例如age列是填寫年齡的,我們將其數據類型指定為int後該列的數據類型就只能是int型,從而保證了域完整性

非空約束:not null

默認約束:給某一個字段默認值

Default

引用完整性

引用完整性是通過外鍵約束來實現

一個表的某一個字段是引用的另外一張表的主鍵,該字段就被稱之為外鍵

示例:有兩張表:班級班,一個是學生表

班級表:有3個班,分別是pg37pg39youxiban

學生表:

自定義完整性

就是由用戶自己指定約束條件。

設置字段自動增加 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 表名

Deletetruncate區別:

  1. Truncate是直接銷毀表,然後重新建立一個一模一樣的表,delete則是一條一條的進行刪除,如果是要刪除全表的話,truncate的效率要比delete要高
  2. 雖然truncate效率比delete高,但是沒有delete靈活,因為delete可以指定具體刪除某一條數據
  3. Truncate一般是被認為DDL語句,delete是被分為DML語句
  4. 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

聯表查詢

  1. 什麽是聯表查詢?

所謂聯表查詢,就是將多個表橫向連接起來,進行查詢。相比子查詢,要更加容易理解。

  1. 外鍵

所謂外鍵,就是指一個字段去引用另外一張表的主鍵字段

外鍵約束:所謂外鍵約束,就是因為系統並不知道兩張表之間的關系,所以我們添加外鍵約束來讓系統知道兩張表是存在引用關系

刪除外鍵

語法:alter table 表名(表名是有外鍵的那一張表)

Drop foreign key 外鍵名

  1. 表與表之間的關系

表與表之間的關系:一對一,一對多,多對多

一對一:人與身份證之間的關系

一對多:比如學生和班級之間的關系就是一對多,一個學生只可能屬於一個班級,但是一個班級可以對應多個學生

多對多:例如菜市場,一個商家可以對應多個買主,一個買主也可以去多個商家買菜

  1. 聯表查詢

聯表查詢可以分為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數據庫知識復習