- 前言
知識(shí)無(wú)底,學(xué)海無(wú)涯,知識(shí)點(diǎn)雖然簡(jiǎn)單,但是比較多,所以將MySQL的基礎(chǔ)寫出來(lái),方便自己以后查找,還有就是分享給大家。
一、SQL簡(jiǎn)述
1.SQL的概述
Structure Query Language(結(jié)構(gòu)化查詢語(yǔ)言)簡(jiǎn)稱SQL,它被美國(guó)國(guó)家標(biāo)準(zhǔn)局(ANSI)確定為關(guān)系型數(shù)據(jù)庫(kù)語(yǔ)言的美國(guó)標(biāo)準(zhǔn),后被國(guó)際化標(biāo)準(zhǔn)組織(ISO)采納為關(guān)系數(shù)據(jù)庫(kù)語(yǔ)言的國(guó)際標(biāo)準(zhǔn)。數(shù)據(jù)庫(kù)管理系統(tǒng)可以通過SQL管理數(shù)據(jù)庫(kù);定義和操作數(shù)據(jù),維護(hù)數(shù)據(jù)的完整性和安全性。
2.SQL的優(yōu)點(diǎn)
2、絕大多數(shù)重要的數(shù)據(jù)庫(kù)管理系統(tǒng)均支持SQL
3、高度過程化;用SQL操作數(shù)據(jù)庫(kù)時(shí)大部分的工作由DBMS自動(dòng)完成
3.SQL的分類
2、DML(Data Manipulation Language) 數(shù)據(jù)操作語(yǔ)言,用來(lái)操作數(shù)據(jù)庫(kù)中表里的數(shù)據(jù);常用語(yǔ)句:INSERT、 UPDATE、 DELETE
3、DCL(Data Control Language) 數(shù)據(jù)控制語(yǔ)言,用來(lái)操作訪問權(quán)限和安全級(jí)別; 常用語(yǔ)句:GRANT、DENY
4、DQL(Data Query Language) 數(shù)據(jù)查詢語(yǔ)言,用來(lái)查詢數(shù)據(jù) 常用語(yǔ)句:SELECT
二、數(shù)據(jù)庫(kù)的三大范式
2、第二范式(2NF)是在第一范式(
3、第三范式(3NF)是在第二范式的基礎(chǔ)上建立起來(lái)的,即滿足第三范式必須要先滿足第二范式。第三范式(3NF)要求:表中的非主鍵列必須和主鍵直接相關(guān)而不能間接相關(guān);也就是說:非主鍵列之間不能相關(guān)依賴。
三、數(shù)據(jù)庫(kù)的數(shù)據(jù)類型
使用MySQL數(shù)據(jù)庫(kù)存儲(chǔ)數(shù)據(jù)時(shí),不同的數(shù)據(jù)類型決定了 MySQL存儲(chǔ)數(shù)據(jù)方式的不同。為此,MySQL數(shù)據(jù)庫(kù)提供了多種數(shù)據(jù)類型,其中包括整數(shù)類型、浮點(diǎn)數(shù)類型、定點(diǎn) 數(shù)類型、日期和時(shí)間類型、字符串類型、二進(jìn)制…等等數(shù)據(jù)類型。
1.整數(shù)類型
根據(jù)數(shù)值取值范圍的不同MySQL 中的整數(shù)類型可分為5種,分別是TINYINT、SMALUNT、MEDIUMINT、INT和 BIGINT。下圖列舉了 MySQL不同整數(shù)類型所對(duì)應(yīng)的字節(jié)大小和取值范圍而最常用的為INT類型的,
數(shù)據(jù)類型 |
字節(jié)數(shù) |
無(wú)符號(hào)數(shù)的取值范圍 |
有符號(hào)數(shù)的取值范圍 |
TINYINT |
1 |
0~255 |
-128~127 |
SMALLINT |
2 |
0~65535 |
-32768~32768 |
MEDIUMINT |
3 |
0~16777215 |
-8388608~8388608 |
INT |
4 |
0~4294967295 |
-2147483648~ 2147483648 |
BIGINT |
8 |
0~18446744073709551615 |
-9223372036854775808~9223372036854775808 |
2.浮點(diǎn)數(shù)類型和定點(diǎn)數(shù)類型
在MySQL數(shù)據(jù)庫(kù)中使用浮點(diǎn)數(shù)和定點(diǎn)數(shù)來(lái)存儲(chǔ)小數(shù)。浮點(diǎn)數(shù)的類型有兩種:?jiǎn)尉雀↑c(diǎn)數(shù)類型(FLOAT)和雙精度浮點(diǎn)數(shù)類型(DOUBLE)。而定點(diǎn)數(shù)類型只有一種即DECIMAL類型。下圖列舉了 MySQL中浮點(diǎn)數(shù)和定點(diǎn)數(shù)類型所對(duì)應(yīng)的字節(jié)大小及其取值范圍:
數(shù)據(jù)類型 |
字節(jié)數(shù) |
有符號(hào)的取值范圍 |
無(wú)符號(hào)的取值范圍 |
FLOAT |
4 |
-3.402823466E+38~-1.175494351E-38 |
0和 |
DOUBLE |
8 |
-1.7976931348623157E+308~2.2250738585072014E-308 |
0和 |
DECIMAL(M,D) |
M+2 |
-1.7976931348623157E+308~2.2250738585072014E-308 |
0和 |
從上圖中可以看出:DECIMAL類型的取值范圍與DOUBLE類型相同。但是,請(qǐng)注意:DECIMAL類型的有效取值范圍是由M和D決定的。其中,M表示的是數(shù)據(jù)的長(zhǎng) 度,D表示的是小數(shù)點(diǎn)后的長(zhǎng)度。比如,將數(shù)據(jù)類型為DECIMAL(6,2)的數(shù)據(jù)6.5243 插人數(shù)據(jù)庫(kù)后顯示的結(jié)果為6.52
3.字符串類型
在MySQL中常用CHAR 和 VARCHAR 表示字符串。兩者不同的是:VARCHAR存儲(chǔ)可變長(zhǎng)度的字符串。
當(dāng)數(shù)據(jù)為CHAR(M)類型時(shí),不管插入值的長(zhǎng)度是實(shí)際是多少它所占用的存儲(chǔ)空間都是M個(gè)字節(jié);而VARCHAR(M)所對(duì)應(yīng)的數(shù)據(jù)所占用的字節(jié)數(shù)為實(shí)際長(zhǎng)度加1
插入值 |
CHAR(3) |
存儲(chǔ)需求 |
VARCHAR(3) |
存儲(chǔ)需求 |
‘’ |
‘’ |
3個(gè)字節(jié) |
‘’ |
1個(gè)字節(jié) |
‘a’ |
‘a’ |
3個(gè)字節(jié) |
‘a’ |
2個(gè)字節(jié) |
‘ab’ |
‘ab’ |
3個(gè)字節(jié) |
‘ab’ |
3個(gè)字節(jié) |
‘abc’ |
‘ab’ |
3個(gè)字節(jié) |
‘abc’ |
4個(gè)字節(jié) |
‘abcd’ |
‘ab’ |
3個(gè)字節(jié) |
‘abc’ |
4字節(jié) |
4.字符串類型
文本類型用于表示大文本數(shù)據(jù),例如,文章內(nèi)容、評(píng)論、詳情等,它的類型分為如下4種:
數(shù)據(jù)類型 |
儲(chǔ)存范圍 |
TINYTEXT |
0~255字節(jié) |
TEXT |
0~65535字節(jié) |
MEDIUMTEXT |
0~16777215字節(jié) |
LONGTEXT |
0~4294967295字節(jié) |
5.日期與時(shí)間類型
MySQL提供的表示日期和時(shí)間的數(shù)據(jù)類型分別是 :YEAR、DATE、TIME、DATETIME 和 TIMESTAMP。下圖列舉了日期和時(shí)間數(shù)據(jù)類型所對(duì)應(yīng)的字節(jié)數(shù)、取值范圍、日期格式以及零值:
數(shù)據(jù)類型 |
字節(jié)數(shù) |
取值范圍 |
日期格式 |
零值 |
YEAR |
1 |
1901~2155 |
YYYY |
0000 |
DATE |
4 |
1000-01-01~9999-12-31 |
YYYY-MM-DD |
0000-00-00 |
TIME |
3 |
-838:59:59~ 838:59:59 |
HH:MM:SS |
00:00:00 |
DATETIME |
8 |
1000-01-01 00:00:00~9999-12-31 23:59:59 |
YYYY-MM-DD HH:MM:SS |
0000-00-00 00:00:00 |
TIMESTAMP |
4 |
1970-01-01 00:00:01~2038-01-19 03:14:07 |
YYYY-MM-DD HH:MM:SS |
0000-00-00 00:00:00 |
5.1 YEAR類型
YEAR類型用于表示年份,在MySQL中,可以使用以下三種格式指定YEAR類型 的值。
1、使用4位字符串或數(shù)字表示,范圍為’1901’—'2155’或1901—2155。例如,輸人 ‘2019’或2019插人到數(shù)據(jù)庫(kù)中的值均為2019。
2、使用兩位字符串表示,范圍為’00’—‘99’。其中,‘00’—'69’范圍的值會(huì)被轉(zhuǎn)換為 2000—2069范圍的YEAR值,‘70’—'99’范圍的值會(huì)被轉(zhuǎn)換為1970—1999范圍的YEAR 值。例如,輸人’19’插人到數(shù)據(jù)庫(kù)中的值為2019。
3、使用兩位數(shù)字表示,范圍為1—99。其中,1—69范圍的值會(huì)被轉(zhuǎn)換為2001— 2069范圍的YEAR值,70—99范圍的值會(huì)被轉(zhuǎn)換為1970—1999范圍的YEAR值。例 如,輸人19插入到數(shù)據(jù)庫(kù)中的值為2019。
請(qǐng)注意:當(dāng)使用YEAR類型時(shí),一定要區(qū)分’0’和0。因?yàn)樽址袷降?rsquo;0’表示的YEAR值是2000而數(shù)字格式的0表示的YEAR值是0000。
5.2 TIME類型
TIME類型用于表示時(shí)間值,它的顯示形式一般為HH:MM:SS,其中,HH表示小時(shí), MM表示分,SS表示秒。在MySQL中,可以使用以下3種格式指定TIME類型的值。
1、以’D HH:MM:SS’字符串格式表示。其中,D表示日可取0—34之間的值, 插人數(shù)據(jù)時(shí),小時(shí)的值等于(DX24+HH)。例如,輸入’2 11:30:50’插人數(shù)據(jù)庫(kù)中的日期為59:30:50。
2、以’HHMMSS’字符串格式或者HHMMSS數(shù)字格式表示。 例如,輸人’115454’或115454,插入數(shù)據(jù)庫(kù)中的日期為11:54:54
3、使用CURRENT_TIME或NOW()輸人當(dāng)前系統(tǒng)時(shí)間。
5.3 DATETIME類型
DATETIME類型用于表示日期和時(shí)間,它的顯示形式為’YYYY-MM-DD HH: MM:SS’,其中,YYYY表示年,MM表示月,DD表示日,HH表示小時(shí),MM表示分,SS 表示秒。在MySQL中,可以使用以下4種格式指定DATETIME類型的值。
?以’YYYY-MM-DD HH:MM:SS’或者’YYYYMMDDHHMMSS’字符串格式表示的日期和時(shí)間,取值范圍為’1000-01-01 00:00:00’—‘9999-12-3 23:59:59’。例如,輸人’2019-01-22 09:01:23’或 ‘20140122_0_90123’插人數(shù)據(jù)庫(kù)中的 DATETIME 值都為 2019-01-22 09:01:23。
1、以’YY-MM-DD HH:MM:SS’或者’YYMMDDHHMMSS’字符串格式表示的日期和時(shí)間,其中YY表示年,取值范圍為’00’—‘99’。與DATE類型中的YY相同,‘00’— '69’范圍的值會(huì)被轉(zhuǎn)換為2000—2069范圍的值,‘70’—'99’范圍的值會(huì)被轉(zhuǎn)換為1970—1999范圍的值。
2、以YYYYMMDDHHMMSS或者YYMMDDHHMMSS數(shù)字格式表示的日期 和時(shí)間。例如,插入20190122090123或者190122090123,插人數(shù)據(jù)庫(kù)中的DATETIME值都 為 2019-01-22 09:01:23。
3、使用NOW來(lái)輸人當(dāng)前系統(tǒng)的日期和時(shí)間。
5.4 TIMESTAMP類型
TIMESTAMP類型用于表示日期和時(shí)間,它的顯示形式與DATETIME相同但取值范圍比DATETIME小。在此,介紹幾種TIMESTAMP類型與DATATIME類型不同的形式:
1、使用CURRENT_TIMESTAMP輸人系統(tǒng)當(dāng)前日期和時(shí)間。
2、輸人NULL時(shí)系統(tǒng)會(huì)輸人系統(tǒng)當(dāng)前日期和時(shí)間。
3、無(wú)任何輸人時(shí)系統(tǒng)會(huì)輸入系統(tǒng)當(dāng)前日期和時(shí)間。
6.二進(jìn)制類型
在MySQL中常用BLOB存儲(chǔ)二進(jìn)制類型的數(shù)據(jù),例如:圖片、PDF文檔等。BLOB類型分為如下四種:
數(shù)據(jù)類型 |
儲(chǔ)存范圍 |
TINYBLOB |
0~255字節(jié) |
BLOB |
0~65535字節(jié) |
MEDIUMBLOB |
0~16777215字節(jié) |
LONGBLOB |
0~4294967295字節(jié) |
四、數(shù)據(jù)庫(kù)、數(shù)據(jù)表的基本操作
1.數(shù)據(jù)庫(kù)的基本操作
MySQL安裝完成后,要想將數(shù)據(jù)存儲(chǔ)到數(shù)據(jù)庫(kù)的表中,首先要?jiǎng)?chuàng)建一個(gè)數(shù)據(jù)庫(kù)。創(chuàng) 建數(shù)據(jù)庫(kù)就是在數(shù)據(jù)庫(kù)系統(tǒng)中劃分一塊空間存儲(chǔ)數(shù)據(jù),語(yǔ)法如下:
create database 數(shù)據(jù)庫(kù)名稱;
創(chuàng)建一個(gè)叫db1的數(shù)據(jù)庫(kù)MySQL命令:
-- 創(chuàng)建一個(gè)叫db1的數(shù)據(jù)庫(kù)
show create database db1;
運(yùn)行效果展示:
創(chuàng)建數(shù)據(jù)庫(kù)后查看該數(shù)據(jù)庫(kù)基本信息MySQL命令:
show create database db1;
運(yùn)行效果展示:
刪除數(shù)據(jù)庫(kù)MySQL命令:
drop database db1;
運(yùn)行效果展示:
查詢出MySQL中所有的數(shù)據(jù)庫(kù)MySQL命令:
show databases;
運(yùn)行效果展示:
將數(shù)據(jù)庫(kù)的字符集修改為gbk MySQL命令:
alter database db1 character set gbk;
運(yùn)行效果展示:
切換數(shù)據(jù)庫(kù) MySQL命令:
use db1;
運(yùn)行效果展示:
查看當(dāng)前使用的數(shù)據(jù)庫(kù) MySQL命令:
select database();
運(yùn)行效果展示:
2.數(shù)據(jù)表的基本操作
數(shù)據(jù)庫(kù)創(chuàng)建成功后可在該數(shù)據(jù)庫(kù)中創(chuàng)建數(shù)據(jù)表(簡(jiǎn)稱為表)存儲(chǔ)數(shù)據(jù)。請(qǐng)注意:在操作數(shù)據(jù)表之前應(yīng)使用“USE 數(shù)據(jù)庫(kù)名;”指定操作是在哪個(gè)數(shù)據(jù)庫(kù)中進(jìn)行先關(guān)操作,否則會(huì)拋出“No database selected”錯(cuò)誤。
語(yǔ)法如下:
create table 表名(
字段1 字段類型,
字段2 字段類型,
…
字段n 字段類型
);
2.1 創(chuàng)建數(shù)據(jù)表
示例:創(chuàng)建學(xué)生表 MySQL命令:
create table student( id int, name varchar(20), gender varchar(10), birthday date );
運(yùn)行效果展示:
2.2 查看數(shù)據(jù)表
示例:查看當(dāng)前數(shù)據(jù)庫(kù)中所有表 MySQL命令:
show tables;
運(yùn)行效果展示:
示例:查表的基本信息 MySQL命令:
show create table student;
運(yùn)行效果展示:
示例:查看表的字段信息 MySQL命令:
desc student;
運(yùn)行效果展示:
2.3 修改數(shù)據(jù)表
有時(shí),希望對(duì)表中的某些信息進(jìn)行修改,例如:修改表名、修改字段名、修改字段 數(shù)據(jù)類型…等等。在MySQL中使用alter table修改數(shù)據(jù)表.
示例:修改表名 MySQL命令:
alter table student rename to stu;
運(yùn)行效果展示:
示例:修改字段名 MySQL命令:
alter table stu change name sname varchar(10);
運(yùn)行效果展示:
示例:修改字段數(shù)據(jù)類型 MySQL命令:
alter table stu modify sname int;
運(yùn)行效果展示:
示例:增加字段 MySQL命令:
alter table stu add address varchar(50);
運(yùn)行效果展示:
示例:刪除字段 MySQL命令:
alter table stu drop address;
運(yùn)行效果展示:
2.4 刪除數(shù)據(jù)表
語(yǔ)法:
drop table 表名;
示例:刪除數(shù)據(jù)表 MySQL命令:
drop table stu;
運(yùn)行效果展示:
五、數(shù)據(jù)表的約束
為防止錯(cuò)誤的數(shù)據(jù)被插入到數(shù)據(jù)表,MySQL中定義了一些維護(hù)數(shù)據(jù)庫(kù)完整性的規(guī)則;這些規(guī)則常稱為表的約束。常見約束如下:
約束條件 |
說明 |
PRIMARY KEY |
主鍵約束用于唯一標(biāo)識(shí)對(duì)應(yīng)的記錄 |
FOREIGN KEY |
外鍵約束 |
NOT NULL |
非空約束 |
UNIQUE |
唯一性約束 |
DEFAULT |
默認(rèn)值約束,用于設(shè)置字段的默認(rèn)值 |
以上五種約束條件針對(duì)表中字段進(jìn)行限制從而保證數(shù)據(jù)表中數(shù)據(jù)的正確性和唯一性。換句話說,表的約束實(shí)際上就是表中數(shù)據(jù)的限制條件。
1.主鍵約束
主鍵約束即primary key用于唯一的標(biāo)識(shí)表中的每一行。被標(biāo)識(shí)為主鍵的數(shù)據(jù)在表中是唯一的且其值不能為空。這點(diǎn)類似于我們每個(gè)人都有一個(gè)身份證號(hào),并且這個(gè)身份證號(hào)是唯一的。
主鍵約束基本語(yǔ)法:
字段名 數(shù)據(jù)類型 primary key;
設(shè)置主鍵約束(primary key)的第一種方式
示例:MySQL命令:
create table student(id int primary key,name varchar(20));
運(yùn)行效果展示:
設(shè)置主鍵約束(primary key)的第二·種方式
示例:MySQL命令:
create table student01(id int
name varchar(20),primary key(id));
運(yùn)行效果展示:
2.非空約束
非空約束即 NOT NULL指的是字段的值不能為空,基本的語(yǔ)法格式如下所示:
字段名 數(shù)據(jù)類型 NOT NULL;
示例:MySQL命令:
create table student02(id int
name varchar(20) not null);
運(yùn)行效果展示:
3.默認(rèn)值約束
默認(rèn)值約束即DEFAULT用于給數(shù)據(jù)表中的字段指定默認(rèn)值,即當(dāng)在表中插入一條新記錄時(shí)若未給該字段賦值,那么,數(shù)據(jù)庫(kù)系統(tǒng)會(huì)自動(dòng)為這個(gè)字段插人默認(rèn)值;其基本的語(yǔ)法格式如下所示:
字段名 數(shù)據(jù)類型 DEFAULT 默認(rèn)值;
示例:MySQL命令:
create table student03(id int,name varchar(20),gender varchar(10) default 'male'
);
運(yùn)行效果展示:
5.唯一性約束
唯一性約束即UNIQUE用于保證數(shù)據(jù)表中字段的唯一性,即表中字段的值不能重復(fù)出現(xiàn),其基本的語(yǔ)法格式如下所示:
字段名 數(shù)據(jù)類型 UNIQUE;
示例:MySQL命令:
create table student04(id int,name varchar(20) unique);
運(yùn)行效果展示:
6.外鍵約束
外鍵約束即FOREIGN KEY常用于多張表之間的約束。基本語(yǔ)法如下:
-- 在創(chuàng)建數(shù)據(jù)表時(shí)語(yǔ)法如下:
CONSTRAINT 外鍵名 FOREIGN KEY (從表外鍵字段) REFERENCES 主表 (主鍵字段)
-- 將創(chuàng)建數(shù)據(jù)表創(chuàng)號(hào)后語(yǔ)法如下:ALTER TABLE 從表名 ADD CONSTRAINT 外鍵名 FOREIGN KEY (從表外鍵字段) REFERENCES 主表 (主鍵字段);
示例:創(chuàng)建一個(gè)學(xué)生表 MySQL命令:
create table student05(id int primary key,name varchar(20));
示例:創(chuàng)建一個(gè)班級(jí)表 MySQL命令:
create table class(classid int primary key,studentid int
);
示例:學(xué)生表作為主表,班級(jí)表作為副表設(shè)置外鍵, MySQL命令:
alter table class add constraint fk_class_studentid foreign key(studentid) references student(id);
運(yùn)行效果展示:
6.1 數(shù)據(jù)一致性概念
大家知道:建立外鍵是為了保證數(shù)據(jù)的完整和統(tǒng)一性。但是,如果主表中的數(shù)據(jù)被刪除或修改從表中對(duì)應(yīng)的數(shù)據(jù)該怎么辦呢?很明顯,從表中對(duì)應(yīng)的數(shù)據(jù)也應(yīng)該被刪除,否則數(shù)據(jù)庫(kù)中會(huì)存在很多無(wú)意義的垃圾數(shù)據(jù)。
6.2 刪除外鍵
語(yǔ)法如下:
alter table 從表名 drop foreign key 外鍵名;
示例:刪除外鍵 MySQL命令:
alter table class drop foreign key fk_class_studentid;
運(yùn)行效果展示:
外鍵的那個(gè)字段不在了證明刪除成功了
6.3 關(guān)于外鍵約束需要注意的細(xì)節(jié)
1、從表里的外鍵通常為主表的主鍵
2、從表里外鍵的數(shù)據(jù)類型必須與主表中主鍵的數(shù)據(jù)類型一致
3、主表發(fā)生變化時(shí)應(yīng)注意主表與從表的數(shù)據(jù)一致性問題
六、數(shù)據(jù)表插入數(shù)據(jù)
在MySQL通過INSERT語(yǔ)句向數(shù)據(jù)表中插入數(shù)據(jù)。在此,我們先準(zhǔn)備一張學(xué)生表,代碼如下:
create table student( id int, name varchar(30), age int, gender varchar(30) );
1. 為表中所有字段插入數(shù)據(jù)
每個(gè)字段與其值是嚴(yán)格一一對(duì)應(yīng)的。也就是說:每個(gè)值、值的順序、值的類型必須與對(duì)應(yīng)的字段相匹配。但是,各字段也無(wú)須與其在表中定義的順序一致,它們只要與 VALUES中值的順序一致即可。
語(yǔ)法如下:
INSERT INTO 表名(字段名1,字段名2,...) VALUES (值 1,值 2,...);
示例:向?qū)W生表中插入一條學(xué)生信息 MySQL命令:
insert into student (id,name,age,gender) values (1,'bob',16,'male');
運(yùn)行效果展示:
2. 為表中指定字段插入數(shù)據(jù)
語(yǔ)法如下:
INSERT INTO 表名(字段名1,字段名2,...) VALUES (值 1,值 2,...);
插入數(shù)據(jù)的方法基本和為表中所有字段插入數(shù)據(jù),一樣,只是需要插入的字段由你自己指定
3. 同時(shí)插入多條記錄
語(yǔ)法如下:
INSERT INTO 表名 [(字段名1,字段名2,...)]VALUES (值 1,值 2,…),(值 1,值 2,…),...;
在該方式中:(字段名1,字段名2,…)是可選的,它用于指定插人的字段名;(值 1,值 2,…),(值 1,值 2,…)表示要插人的記錄,該記錄可有多條并且每條記錄之間用逗號(hào)隔開。
示例:向?qū)W生表中插入多條學(xué)生信息 MySQL命令:
insert into student (id,name,age,gender) values (2,'lucy',17,'female'),(3,'jack',19,'male'),(4,'tom',18,'male');
運(yùn)行效果展示:
七、更新數(shù)據(jù)
在MySQL通過UPDATE語(yǔ)句更新數(shù)據(jù)表中的數(shù)據(jù)。在此,我們將就用六中的student學(xué)生表
1. UPDATE基本語(yǔ)法
UPDATE 表名 SET 字段名1=值1[,字段名2 =值2,…] [WHERE 條件表達(dá)式];
在該語(yǔ)法中:字段名1、字段名2…用于指定要更新的字段名稱;值1、值 2…用于表示字段的新數(shù)據(jù);WHERE 條件表達(dá)式 是可選的,它用于指定更新數(shù)據(jù)需要滿足的條件
2. UPDATE更新部分?jǐn)?shù)據(jù)
示例:將name為tom的記錄的age設(shè)置為20并將其gender設(shè)置為female MySQL命令:
update student set age=20,gender='female' where name='tom';
運(yùn)行效果展示:
3. UPDATE更新全部數(shù)據(jù)
示例:將所有記錄的age設(shè)置為18 MySQL命令:
update student set age=18;
運(yùn)行效果展示:
八、刪除數(shù)據(jù)
在MySQL通過DELETE語(yǔ)句刪除數(shù)據(jù)表中的數(shù)據(jù)。在此,我們先準(zhǔn)備一張數(shù)據(jù)表,代碼如下:
-- 創(chuàng)建學(xué)生表
create table student( id int, name varchar(30), age int, gender varchar(30) );
-- 插入數(shù)據(jù)
insert into student (id,name,age,gender) values (2,'lucy',17,'female'),(3,'jack',19,'male'),(4,'tom',18,'male'),(5,'sal',19,'female'),(6,'sun',20,'male')
,(7,'sad',13,'female'),(8,'sam',14,'male');
1. DELETE基本語(yǔ)法
在該語(yǔ)法中:表名用于指定要執(zhí)行刪除操作的表;[WHERE 條件表達(dá)式]為可選參數(shù)用于指定刪除的條件。
DELETE FROM 表名 [WHERE 條件表達(dá)式];
2. DELETE刪除部分?jǐn)?shù)據(jù)
示例:刪除age等于14的所有記錄 MySQL命令:
delete from student where age=14;
運(yùn)行效果展示:
3. DELETE刪除全部數(shù)據(jù)
示例:刪除student表中的所有記錄 MySQL命令:
delete from student;
運(yùn)行效果展示:
4. TRUNCATE和DETELE的區(qū)別
TRUNCATE和DETELE都能實(shí)現(xiàn)刪除表中的所有數(shù)據(jù)的功能,但兩者也是有區(qū)別的:
1、DELETE語(yǔ)句后可跟WHERE子句,可通過指定WHERE子句中的條件表達(dá)式只刪除滿足條件的部分記錄;但是,TRUNCATE語(yǔ)句只能用于刪除表中的所有記錄。
2、使用TRUNCATE語(yǔ)句刪除表中的數(shù)據(jù)后,再次向表中添加記錄時(shí)自動(dòng)增加字段的默認(rèn)初始值重新由1開始;使用DELETE語(yǔ)句刪除表中所有記錄后,再次向表中添加記錄時(shí)自動(dòng)增加字段的值為刪除時(shí)該字段的最大值加1
3、DELETE語(yǔ)句是DML語(yǔ)句,TRUNCATE語(yǔ)句通常被認(rèn)為是DDL語(yǔ)句
九、MySQL數(shù)據(jù)表簡(jiǎn)單查詢
1.簡(jiǎn)單查詢概述
簡(jiǎn)單查詢即不含where的select語(yǔ)句。在此,我們講解簡(jiǎn)單查詢中最常用的兩種查詢:查詢所有字段和查詢指定字段。
在此,先準(zhǔn)備測(cè)試數(shù)據(jù),代碼如下:
-- 創(chuàng)建數(shù)據(jù)庫(kù)
DROP DATABASE IF EXISTS mydb;
CREATE DATABASE mydb;
USE mydb;
-- 創(chuàng)建student表
CREATE TABLE student ( sid CHAR(6), sname VARCHAR(50), age INT, gender VARCHAR(50) DEFAULT 'male'
);
-- 向student表插入數(shù)據(jù)
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1001', 'lili', 14, 'male');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1002', 'wang', 15, 'female');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1003', 'tywd', 16, 'male');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1004', 'hfgs', 17, 'female');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1005', 'qwer', 18, 'male');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1006', 'zxsd', 19, 'female');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1007', 'hjop', 16, 'male');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1008', 'tyop', 15, 'female');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1009', 'nhmk', 13, 'male');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1010', 'xdfv', 17, 'female');
2.查詢所有字段(方法不唯一只是舉例)
查詢所有字段 MySQL命令:
select * from student;
運(yùn)行效果展示:
3.查詢指定字段(sid、sname)
查詢指定字段(sid、sname) MySQL命令:
select sid,sname from student;
運(yùn)行效果展示:
4.常數(shù)的查詢
在SELECT中除了書寫列名,還可以書寫常數(shù)。可以用于標(biāo)記
常數(shù)的查詢?nèi)掌跇?biāo)記 MySQL命令:
select sid,sname,'2021-03-02' from student;
運(yùn)行效果展示:
5.從查詢結(jié)果中過濾重復(fù)數(shù)據(jù)
在使用DISTINCT 時(shí)需要注意:
在SELECT查詢語(yǔ)句中DISTINCT關(guān)鍵字只能用在第一個(gè)所查列名之前。
MySQL命令:
select distinct gender from student;
運(yùn)行效果展示:
6.算術(shù)運(yùn)算符(舉例加運(yùn)算符)
在SELECT查詢語(yǔ)句中還可以使用加減乘除運(yùn)算符。
查詢學(xué)生10年后的年齡 MySQL命令:
select sname,age+10 from student;
運(yùn)行效果展示:
十、函數(shù)
在此,先準(zhǔn)備測(cè)試數(shù)據(jù),代碼如下:
-- 創(chuàng)建數(shù)據(jù)庫(kù)
DROP DATABASE IF EXISTS mydb;
CREATE DATABASE mydb;
USE mydb;
-- 創(chuàng)建student表
CREATE TABLE student ( sid CHAR(6), sname VARCHAR(50), age INT, gender VARCHAR(50) DEFAULT 'male'
);
-- 向student表插入數(shù)據(jù)
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1001', 'lili', 14, 'male');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1002', 'wang', 15, 'female');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1003', 'tywd', 16, 'male');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1004', 'hfgs', 17, 'female');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1005', 'qwer', 18, 'male');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1006', 'zxsd', 19, 'female');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1007', 'hjop', 16, 'male');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1008', 'tyop', 15, 'female');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1009', 'nhmk', 13, 'male');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1010', 'xdfv', 17, 'female');
1.聚合函數(shù)
在開發(fā)中,我們常常有類似的需求:統(tǒng)計(jì)某個(gè)字段的最大值、最小值、 平均值等等。為此,MySQL中提供了聚合函數(shù)來(lái)實(shí)現(xiàn)這些功能。所謂聚合,就是將多行匯總成一行;其實(shí),所有的聚合函數(shù)均如此——輸入多行,輸出一行。聚合函數(shù)具有自動(dòng)濾空的功能,若某一個(gè)值為NULL,那么會(huì)自動(dòng)將其過濾使其不參與運(yùn)算。
聚合函數(shù)使用規(guī)則:
只有SELECT子句和HAVING子句、ORDER BY子句中能夠使用聚合函數(shù)。例如,在WHERE子句中使用聚合函數(shù)是錯(cuò)誤的。
接下來(lái),我們學(xué)習(xí)常用聚合函數(shù)。
1.1、count()
統(tǒng)計(jì)表中數(shù)據(jù)的行數(shù)或者統(tǒng)計(jì)指定列其值不為NULL的數(shù)據(jù)個(gè)數(shù)
查詢有多少該表中有多少人
MySQL命令:
select count(*) from student;
運(yùn)行效果展示:
1.2、max()
計(jì)算指定列的最大值,如果指定列是字符串類型則使用字符串排序運(yùn)算
查詢?cè)搶W(xué)生表中年紀(jì)最大的學(xué)生
MySQL命令:
select max(age) from student;
運(yùn)行效果展示:
1.3、min()
計(jì)算指定列的最小值,如果指定列是字符串類型則使用字符串排序運(yùn)算
查詢?cè)搶W(xué)生表中年紀(jì)最小的學(xué)生 MySQL命令:
select sname,min(age) from student;
運(yùn)行效果展示:
1.4、sum()
計(jì)算指定列的數(shù)值和,如果指定列類型不是數(shù)值類型則計(jì)算結(jié)果為0
查詢?cè)搶W(xué)生表中年紀(jì)的總和 MySQL命令:
select sum(age) from student;
運(yùn)行效果展示:
1.5、avg()
計(jì)算指定列的平均值,如果指定列類型不是數(shù)值類型則計(jì)算結(jié)果為
查詢?cè)搶W(xué)生表中年紀(jì)的平均數(shù) MySQL命令:
select avg(age) from student;
運(yùn)行效果展示:
2.其他常用函數(shù)
這里我就不一一舉例了,基本混個(gè)眼熟,以后用到再細(xì)說
2.1、時(shí)間函數(shù)
SELECT NOW();
SELECT DAY (NOW());
SELECT DATE (NOW());
SELECT TIME (NOW());
SELECT YEAR (NOW());
SELECT MONTH (NOW());
SELECT CURRENT_DATE();
SELECT CURRENT_TIME();
SELECT CURRENT_TIMESTAMP();
SELECT ADDTIME('14:23:12','01:02:01');
SELECT DATE_ADD(NOW(),INTERVAL 1 DAY);
SELECT DATE_ADD(NOW(),INTERVAL 1 MONTH);
SELECT DATE_SUB(NOW(),INTERVAL 1 DAY);
SELECT DATE_SUB(NOW(),INTERVAL 1 MONTH);
SELECT DATEDIFF('2019-07-22','2019-05-05');
2.2、字符串函數(shù)
--連接函數(shù)
SELECT CONCAT ()
--SELECT INSTR ();
--統(tǒng)計(jì)長(zhǎng)度
SELECT LENGTH();
2.3、數(shù)學(xué)函數(shù)
-- 絕對(duì)值
SELECT ABS(-136);
-- 向上取整
SELECT FLOOR(3.14);
-- 向下取整
SELECT CEILING(3.14);
十一、條件查詢
數(shù)據(jù)庫(kù)中存有大量數(shù)據(jù),我們可根據(jù)需求獲取指定的數(shù)據(jù)。此時(shí),我們可在查詢語(yǔ)句中通過WHERE子句指定查詢條件對(duì)查詢結(jié)果進(jìn)行過濾。
在開始學(xué)習(xí)條件查詢之前,我們先準(zhǔn)備測(cè)試數(shù)據(jù),代碼如下:
-- 創(chuàng)建數(shù)據(jù)庫(kù)
DROP DATABASE IF EXISTS mydb;
CREATE DATABASE mydb;
USE mydb;
-- 創(chuàng)建student表
CREATE TABLE student ( sid CHAR(6), sname VARCHAR(50), age INT, gender VARCHAR(50) DEFAULT 'male'
);
-- 向student表插入數(shù)據(jù)
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1001', 'lili', 14, 'male');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1002', 'wang', 15, 'female');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1003', 'tywd', 16, 'male');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1004', 'hfgs', 17, 'female');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1005', 'qwer', 18, 'male');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1006', 'zxsd', 19, 'female');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1007', 'hjop', 16, 'male');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1008', 'tyop', 15, 'female');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1009', 'nhmk', 13, 'male');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1010', 'xdfv', 17, 'female');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1012', 'lili', 14, 'male');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1013', 'wang', 15, 'female');
1.使用關(guān)系運(yùn)算符查詢
在WHERE中可使用關(guān)系運(yùn)算符進(jìn)行條件查詢,常用的關(guān)系運(yùn)算符如下所示:
關(guān)系運(yùn)算符 |
說明 |
= |
等于 |
<> |
不等于 |
!= |
不等于 |
< |
小于 |
<= |
小于等于 |
> |
大于 |
>= |
大于等于 |
查詢年齡等于或大于17的學(xué)生的信息 MySQL命令:
select * from student where age>=17;
運(yùn)行效果展示:
2.使用IN關(guān)鍵字查詢
IN關(guān)鍵字用于判斷某個(gè)字段的值是否在指定集合中。如果字段的值恰好在指定的集合中,則將字段所在的記錄將査詢出來(lái)。
查詢sid為S_1002和S_1003的學(xué)生信息 MySQL命令:
select * from student where sid in ('S_1002','S_1003');
運(yùn)行效果展示:
查詢sid為S_1001以外的學(xué)生的信息 MySQL命令:
select * from student where sid not in ('S_1001');
運(yùn)行效果展示:
3.使用BETWEEN AND關(guān)鍵字查詢
BETWEEN AND用于判斷某個(gè)字段的值是否在指定的范圍之內(nèi)。如果字段的值在指定范圍內(nèi),則將所在的記錄將查詢出來(lái)
查詢15到18歲的學(xué)生信息 MySQL命令:
select * from student where age between 15 and 18;
運(yùn)行效果展示:
查詢不是15到18歲的學(xué)生信息 MySQL命令:
select * from student where age not between 15 and 18;
運(yùn)行效果展示:
4.使用空值查詢
在MySQL中,使用 IS NULL關(guān)鍵字判斷字段的值是否為空值。請(qǐng)注意:空值NULL不同于0,也不同于空字符串
由于student表沒有空值就不演示查詢空值的了
查詢sname不為空值的學(xué)生信息 MySQL命令:
select * from student where sname is not null;
運(yùn)行效果展示:
5.使用AND關(guān)鍵字查詢
在MySQL中可使用AND關(guān)鍵字可以連接兩個(gè)或者多個(gè)查詢條件。
查詢年紀(jì)大于15且性別為male的學(xué)生信息 MySQL命令:
select * from student where age>15 and gender='male';
運(yùn)行效果展示:
6.使用OR關(guān)鍵字查詢
在使用SELECT語(yǔ)句查詢數(shù)據(jù)時(shí)可使用OR關(guān)鍵字連接多個(gè)査詢條件。在使用OR關(guān)鍵字時(shí),只要記錄滿足其中任意一個(gè)條件就會(huì)被查詢出來(lái)
查詢年紀(jì)大于15或者性別為male的學(xué)生信息 MySQL命令:
select * from student where age>15 or gender='male';
運(yùn)行效果展示:
7.使用LIKE關(guān)鍵字查詢
MySQL中可使用LIKE關(guān)鍵字可以判斷兩個(gè)字符串是否相匹配
7.1 普通字符串
查詢sname中與wang匹配的學(xué)生信息 MySQL命令:
select * from student where sname like 'wang';
運(yùn)行效果展示:
7.2 含有%通配的字符串
%用于匹配任意長(zhǎng)度的字符串。例如,字符串“a%”匹配以字符a開始任意長(zhǎng)度的字符串
查詢學(xué)生姓名以li開始的記錄 MySQL命令:
select * from student where sname like 'li%';
運(yùn)行效果展示:
查詢學(xué)生姓名以g結(jié)尾的記錄 MySQL命令:
select * from student where sname like '%g';
運(yùn)行效果展示:
查詢學(xué)生姓名包含s的記錄 MySQL命令:
select * from student where sname like '%s%';
運(yùn)行效果展示
7.3 含有_通配的字符串
下劃線通配符只匹配單個(gè)字符,如果要匹配多個(gè)字符,需要連續(xù)使用多個(gè)下劃線通配符。例如,字符串“ab_”匹配以字符串“ab”開始長(zhǎng)度為3的字符串,如abc、abp等等;字符串“a__d”匹配在字符“a”和“d”之間包含兩個(gè)字符的字符串,如"abcd"、"atud"等等。
查詢學(xué)生姓名以zx開頭且長(zhǎng)度為4的記錄 MySQL命令:
select * from student where sname like 'zx__';
運(yùn)行效果展示
查詢學(xué)生姓名以g結(jié)尾且長(zhǎng)度為4的記錄 MySQL命令:
select * from student where sname like '___g';
運(yùn)行效果展示
8.使用LIMIT限制查詢結(jié)果的數(shù)量
當(dāng)執(zhí)行查詢數(shù)據(jù)時(shí)可能會(huì)返回很多條記錄,而用戶需要的數(shù)據(jù)可能只是其中的一條或者幾條
查詢學(xué)生表中年紀(jì)最小的3位同學(xué) MySQL命令:
select * from student order by age asc limit 3;
運(yùn)行效果展示
9.使用GROUP BY進(jìn)行分組查詢
GROUP BY 子句可像切蛋糕一樣將表中的數(shù)據(jù)進(jìn)行分組,再進(jìn)行查詢等操作。換言之,可通俗地理解為:通過GROUP BY將原來(lái)的表拆分成了幾張小表。
接下來(lái),我們通過一個(gè)例子開始學(xué)習(xí)GROUP BY,代碼如下
-- 創(chuàng)建數(shù)據(jù)庫(kù)
DROP DATABASE IF EXISTS mydb;
CREATE DATABASE mydb;
USE mydb;
-- 創(chuàng)建員工表
CREATE TABLE employee ( id int, name varchar(50), salary int, departmentnumber int
);
-- 向員工表中插入數(shù)據(jù)
INSERT INTO employee values(1,'tome',2000,1001);
INSERT INTO employee values(2,'lucy',9000,1002);
INSERT INTO employee values(3,'joke',5000,1003);
INSERT INTO employee values(4,'wang',3000,1004);
INSERT INTO employee values(5,'chen',3000,1001);
INSERT INTO employee values(6,'yukt',7000,1002);
INSERT INTO employee values(7,'rett',6000,1003);
INSERT INTO employee values(8,'mujk',4000,1004);
INSERT INTO employee values(9,'poik',3000,1001);
9.1 GROUP BY和聚合函數(shù)一起使用
統(tǒng)計(jì)各部門員工個(gè)數(shù) MySQL命令:
select count(*), departmentnumber from employee group by departmentnumber;
運(yùn)行效果展示
統(tǒng)計(jì)部門編號(hào)大于1001的各部門員工個(gè)數(shù) MySQL命令:
select count(*), departmentnumber from employee where departmentnumber>1001 group by departmentnumber;
運(yùn)行效果展示
9.2 GROUP BY和聚合函數(shù)以及HAVING一起使用
統(tǒng)計(jì)工資總和大于8000的部門 MySQL命令:
select sum(salary),departmentnumber from employee group by departmentnumber sum(salary)>8000;
運(yùn)行效果展示
10.使用ORDER BY對(duì)查詢結(jié)果排序
從表中査詢出來(lái)的數(shù)據(jù)可能是無(wú)序的或者其排列順序不是我們期望的。為此,我們可以使用ORDER BY對(duì)查詢結(jié)果進(jìn)行排序
其語(yǔ)法格式如下所示:
SELECT 字段名1,字段名2,…
FROM 表名
ORDER BY 字段名1 [ASC 丨 DESC],字段名2 [ASC | DESC];
在該語(yǔ)法中:字段名1、字段名2是查詢結(jié)果排序的依據(jù);參數(shù) ASC表示按照升序排序,DESC表示按照降序排序;默認(rèn)情況下,按照ASC方式排序。通常情況下,ORDER BY子句位于整個(gè)SELECT語(yǔ)句的末尾。
查詢所有學(xué)生并按照年紀(jì)大小升序排列 MySQL命令:
select * from student order by age asc;
運(yùn)行效果展示
查詢所有學(xué)生并按照年紀(jì)大小降序排列 MySQL命令:
select * from student order by age desc;
運(yùn)行效果展示
十二、別名設(shè)置
在査詢數(shù)據(jù)時(shí)可為表和字段取別名,該別名代替表和字段的原名參與查詢操作。
操作的表事先已準(zhǔn)備
1.為表取別名
在查詢操作時(shí),假若表名很長(zhǎng)使用起來(lái)就不太方便,此時(shí)可為表取一個(gè)別名,用該別名來(lái)代替表的名稱。語(yǔ)法格式如下所示:
SELECT * FROM 表名 [AS] 表的別名 WHERE .... ;
將student改為stu查詢整表 MySQL命令:
select * from student as stu;
運(yùn)行效果展示
2.為字段取別名
在查詢操作時(shí),假若字段名很長(zhǎng)使用起來(lái)就不太方便,此時(shí)可該字段取一個(gè)別名,用該別名來(lái)代替字段的名稱。語(yǔ)法格式如下所示:
SELECT 字段名1 [AS] 別名1 , 字段名2 [AS] 別名2 , ... FROM 表名 WHERE ... ;
將student中的name取別名為“姓名” 查詢整表 MySQL命令:
select name as '姓名',id from student;
運(yùn)行效果展示
十三、表的關(guān)聯(lián)關(guān)系
在實(shí)際開發(fā)中數(shù)據(jù)表之間存在著各種關(guān)聯(lián)關(guān)系。在此,介紹MySQL中數(shù)據(jù)表的三種關(guān)聯(lián)關(guān)系。
多對(duì)一
多對(duì)一(亦稱為一對(duì)多)是數(shù)據(jù)表中最常見的一種關(guān)系。例如:?jiǎn)T工與部門之間的關(guān)系,一個(gè)部門可以有多個(gè)員工;而一個(gè)員工不能屬于多個(gè)部門只屬于某個(gè)部門。在多對(duì)一的表關(guān)系 中,應(yīng)將外鍵建在多的一方否則會(huì)造成數(shù)據(jù)的冗余。
多對(duì)多
多對(duì)多是數(shù)據(jù)表中常見的一種關(guān)系。例如:學(xué)生與老師之間的關(guān)系,一個(gè)學(xué)生可以有多個(gè)老師而且一個(gè)老師有多個(gè)學(xué)生。通常情況下,為了實(shí)現(xiàn)這種關(guān)系需要定義一張中間表(亦稱為連接表)該表會(huì)存在兩個(gè)外鍵分別參照老師表和學(xué)生表。
一對(duì)一
在開發(fā)過程中,一對(duì)一的關(guān)聯(lián)關(guān)系在數(shù)據(jù)庫(kù)中并不常見;因?yàn)橐赃@種方式存儲(chǔ)的信息通常會(huì)放在同一張表中。
接下來(lái),我們來(lái)學(xué)習(xí)在一對(duì)多的關(guān)聯(lián)關(guān)系中如果添加和刪除數(shù)據(jù)。先準(zhǔn)備一些測(cè)試數(shù)據(jù),代碼如下:
DROP TABLE IF EXISTS student;
DROP TABLE IF EXISTS class;
-- 創(chuàng)建班級(jí)表
CREATE TABLE class( cid int(4) NOT NULL PRIMARY KEY, cname varchar(30) );
-- 創(chuàng)建學(xué)生表
CREATE TABLE student( sid int(8) NOT NULL PRIMARY KEY, sname varchar(30), classid int(8) NOT NULL
);
-- 為學(xué)生表添加外鍵約束
ALTER TABLE student ADD CONSTRAINT fk_student_classid FOREIGN KEY(classid) REFERENCES class(cid);
-- 向班級(jí)表插入數(shù)據(jù)
INSERT INTO class(cid,cname)VALUES(1,'JAVA');
INSERT INTO class(cid,cname)VALUES(2,'Python');
-- 向?qū)W生表插入數(shù)據(jù)
INSERT INTO student(sid,sname,classid)VALUES(1,'tome',1);
INSERT INTO student(sid,sname,classid)VALUES(2,'lucy',1);
INSERT INTO student(sid,sname,classid)VALUES(3,'lili',2);
INSERT INTO student(sid,sname,classid)VALUES(4,'domi',2);
1.關(guān)聯(lián)查詢
查詢Java班的所有學(xué)生 MySQL命令:
select * from student where classid=(select cid from class where cname='Java');
運(yùn)行效果展示
2.關(guān)于關(guān)聯(lián)關(guān)系的刪除數(shù)據(jù)
請(qǐng)從班級(jí)表中刪除Java班級(jí)。在此,請(qǐng)注意:班級(jí)表和學(xué)生表之間存在關(guān)聯(lián)關(guān)系;要?jiǎng)h除Java班級(jí),應(yīng)該先刪除學(xué)生表中與該班相關(guān)聯(lián)的學(xué)生。否則,假若先刪除Java班那么學(xué)生表中的cid就失去了關(guān)聯(lián)
刪除Java班 MySQL命令:
delete from student where classid=(select cid from class where cname='Java');
delete from class where cname='Java';
運(yùn)行效果展示
十四、多表連接查詢
1.交叉連接查詢
交叉連接返回的結(jié)果是被連接的兩個(gè)表中所有數(shù)據(jù)行的笛卡兒積;比如:集合A={a,b},集合B={0,1,2},則集合A和B的笛卡爾積為{(a,0),(a,1),(a,2),(b,0),(b,1),(b,2)}。所以,交叉連接也被稱為笛卡爾連接,其語(yǔ)法格式如下:
SELECT * FROM 表1 CROSS JOIN 表2;
在該語(yǔ)法中:CROSS JOIN用于連接兩個(gè)要查詢的表,通過該語(yǔ)句可以查詢兩個(gè)表中所有的數(shù)據(jù)組合。
由于這個(gè)交叉連接查詢?cè)趯?shí)際運(yùn)用中沒有任何意義,所以只做為了解即可
2.內(nèi)連接查詢
內(nèi)連接(Inner Join)又稱簡(jiǎn)單連接或自然連接,是一種非常常見的連接查詢。內(nèi)連接使用比較運(yùn)算符對(duì)兩個(gè)表中的數(shù)據(jù)進(jìn)行比較并列出與連接條件匹配的數(shù)據(jù)行,組合成新的 記錄。也就是說在內(nèi)連接查詢中只有滿足條件的記錄才能出現(xiàn)在查詢結(jié)果中。其語(yǔ)法格式如下:
SELECT 查詢字段1,查詢字段2, ... FROM 表1 [INNER] JOIN 表2 ON 表1.關(guān)系字段=表2.關(guān)系字段
在該語(yǔ)法中:INNER JOIN用于連接兩個(gè)表,ON來(lái)指定連接條件;其中INNER可以省略。
準(zhǔn)備數(shù)據(jù),代碼如下:
-- 若存在數(shù)據(jù)庫(kù)mydb則刪除
DROP DATABASE IF EXISTS mydb;
-- 創(chuàng)建數(shù)據(jù)庫(kù)mydb
CREATE DATABASE mydb;
-- 選擇數(shù)據(jù)庫(kù)mydb
USE mydb;
-- 創(chuàng)建部門表
CREATE TABLE department( did int (4) NOT NULL PRIMARY KEY, dname varchar(20));
-- 創(chuàng)建員工表
CREATE TABLE employee ( eid int (4) NOT NULL PRIMARY KEY, ename varchar (20), eage int (2), departmentid int (4) NOT NULL
);
-- 向部門表插入數(shù)據(jù)
INSERT INTO department VALUES(1001,'財(cái)務(wù)部');
INSERT INTO department VALUES(1002,'技術(shù)部');
INSERT INTO department VALUES(1003,'行政部');
INSERT INTO department VALUES(1004,'生活部');
-- 向員工表插入數(shù)據(jù)
INSERT INTO employee VALUES(1,'張三',19,1003);
INSERT INTO employee VALUES(2,'李四',18,1002);
INSERT INTO employee VALUES(3,'王五',20,1001);
INSERT INTO employee VALUES(4,'趙六',20,1004);
查詢員工姓名及其所屬部門名稱 MySQL命令:
select employee.ename,department.dname from department inner join employee on department.did=employee.departmentid;
運(yùn)行效果展示
3.外連接查詢
在使用內(nèi)連接查詢時(shí)我們發(fā)現(xiàn):返回的結(jié)果只包含符合查詢條件和連接條件的數(shù)據(jù)。但是,有時(shí)還需要在返回查詢結(jié)果中不僅包含符合條件的數(shù)據(jù),而且還包括左表、右表或兩個(gè)表中的所有數(shù)據(jù),此時(shí)我們就需要使用外連接查詢。外連接又分為左(外)連接和右(外)連接。其語(yǔ)法格式如下:
SELECT 查詢字段1,查詢字段2, ... FROM 表1 LEFT | RIGHT [OUTER] JOIN 表2 ON 表1.關(guān)系字段=表2.關(guān)系字段 WHERE 條件
由此可見,外連接的語(yǔ)法格式和內(nèi)連接非常相似,只不過使用的是LEFT [OUTER] JOIN、RIGHT [OUTER] JOIN關(guān)鍵字。其中,關(guān)鍵字左邊的表被稱為左表,關(guān)鍵字右邊的表被稱為右表;OUTER可以省略。
在使用左(外)連接和右(外)連接查詢時(shí),查詢結(jié)果是不一致的,具體如下:
1、LEFT [OUTER] JOIN 左(外)連接:返回包括左表中的所有記錄和右表中符合連接條件的記錄。
2、RIGHT [OUTER] JOIN 右(外)連接:返回包括右表中的所有記錄和左表中符合連接條件的記錄。
先準(zhǔn)備數(shù)據(jù),代碼如下:
-- 若存在數(shù)據(jù)庫(kù)mydb則刪除
DROP DATABASE IF EXISTS mydb;
-- 創(chuàng)建數(shù)據(jù)庫(kù)mydb
CREATE DATABASE mydb;
-- 選擇數(shù)據(jù)庫(kù)mydb
USE mydb;
-- 創(chuàng)建班級(jí)表
CREATE TABLE class( cid int (4) NOT NULL PRIMARY KEY, cname varchar(20));
-- 創(chuàng)建學(xué)生表
CREATE TABLE student ( sid int (4) NOT NULL PRIMARY KEY, sname varchar (20), sage int (2), classid int (4) NOT NULL
);
-- 向班級(jí)表插入數(shù)據(jù)
INSERT INTO class VALUES(1001,'Java');
INSERT INTO class VALUES(1002,'C++');
INSERT INTO class VALUES(1003,'Python');
INSERT INTO class VALUES(1004,'php');
-- 向?qū)W生表插入數(shù)據(jù)
INSERT INTO student VALUES(1,'張三',20,1001);
INSERT INTO student VALUES(2,'李四',21,1002);
INSERT INTO student VALUES(3,'王五',24,1002);
INSERT INTO student VALUES(4,'趙六',23,1003);
INSERT INTO student VALUES(5,'Jack',22,1009);
準(zhǔn)備這組數(shù)據(jù)有一定的特點(diǎn),為的是讓大家直觀的看出左連接與右連接的不同之處
1、班級(jí)編號(hào)為1004的PHP班級(jí)沒有學(xué)生
2、學(xué)號(hào)為5的學(xué)生王躍躍班級(jí)編號(hào)為1009,該班級(jí)編號(hào)并不在班級(jí)表中
3.1 左(外)連接查詢
左(外)連接的結(jié)果包括LEFT JOIN子句中指定的左表的所有記錄,以及所有滿足連接條件的記錄。如果左表的某條記錄在右表中不存在則在右表中顯示為空。
查詢每個(gè)班的班級(jí)ID、班級(jí)名稱及該班的所有學(xué)生的名字 MySQL命令:
select class.cid,class.cname,student.sname from class left outer join student on class.cid=student.classid;
運(yùn)行效果展示
展示結(jié)果分析:
1、分別找出Java班、C++班、Python班的學(xué)生
2、右表的王躍躍不滿足查詢條件故其沒有出現(xiàn)在查詢結(jié)果中
3、雖然左表的PHP班沒有學(xué)生,但是任然顯示了PHP的信息;但是,它對(duì)應(yīng)的學(xué)生名字為NULL
3.2 右(外)連接查詢
右(外)連接的結(jié)果包括RIGHT JOIN子句中指定的右表的所有記錄,以及所有滿足連接條件的記錄。如果右表的某條記錄在左表中沒有匹配,則左表將返回空值。
查詢每個(gè)班的班級(jí)ID、班級(jí)名稱及該班的所有學(xué)生的名字 MySQL命令:
select class.cid,class.cname,student.sname from class right outer join student on class.cid=student.classid;
運(yùn)行效果展示
展示結(jié)果分析:
1、分別找出Java班、C++班、Python班的學(xué)生
2、?左表的PHP班不滿足查詢條件故其沒有出現(xiàn)在查詢結(jié)果中
3、?雖然右表的jack沒有對(duì)應(yīng)班級(jí),但是任然顯示王躍躍的信息;但是,它對(duì)應(yīng)的班級(jí)以及班級(jí)編號(hào)均為NULL
十五、子查詢
子查詢是指一個(gè)查詢語(yǔ)句嵌套在另一個(gè)查詢語(yǔ)句內(nèi)部的查詢;該查詢語(yǔ)句可以嵌套在一個(gè) SELECT、SELECT…INTO、INSERT…INTO等語(yǔ)句中。在執(zhí)行查詢時(shí),首先會(huì)執(zhí)行子查詢中的語(yǔ)句,再將返回的結(jié)果作為外層查詢的過濾條件。在子?xùn)嗽冎型ǔ?梢允褂帽容^運(yùn)算符和IN、EXISTS、ANY、ALL等關(guān)鍵字。
準(zhǔn)備數(shù)據(jù),代碼如下:
DROP TABLE IF EXISTS student;
DROP TABLE IF EXISTS class;
-- 創(chuàng)建班級(jí)表
CREATE TABLE class( cid int (4) NOT NULL PRIMARY KEY, cname varchar(20));
-- 創(chuàng)建學(xué)生表
CREATE TABLE student ( sid int (4) NOT NULL PRIMARY KEY, sname varchar (20), sage int (2), classid int (4) NOT NULL
);
-- 向班級(jí)表插入數(shù)據(jù)
INSERT INTO class VALUES(1001,'Java');
INSERT INTO class VALUES(1002,'C++');
INSERT INTO class VALUES(1003,'Python');
INSERT INTO class VALUES(1004,'PHP');
INSERT INTO class VALUES(1005,'Android');
-- 向?qū)W生表插入數(shù)據(jù)
INSERT INTO student VALUES(1,'張三',20,1001);
INSERT INTO student VALUES(2,'李四',21,1002);
INSERT INTO student VALUES(3,'王五',24,1003);
INSERT INTO student VALUES(4,'趙六',23,1004);
INSERT INTO student VALUES(5,'小明',21,1001);
INSERT INTO student VALUES(6,'小紅',26,1001);
INSERT INTO student VALUES(7,'小亮',27,1002);
1.帶比較運(yùn)算符的子查詢
比較運(yùn)算符前面我們提到過得,就是>、<、=、>=、<=、!=等
查詢張三同學(xué)所在班級(jí)的信息 MySQL命令:
select * from class where cid=(select classid from student where sname='張三');
運(yùn)行效果展示
查詢比張三同學(xué)所在班級(jí)編號(hào)還大的班級(jí)的信息 MySQL命令:
select * from class where cid>(select classid from student where sname='張三');
運(yùn)行效果展示
2.帶EXISTS關(guān)鍵字的子查詢
EXISTS關(guān)鍵字后面的參數(shù)可以是任意一個(gè)子查詢, 它不產(chǎn)生任何數(shù)據(jù)只返回TRUE或FALSE。當(dāng)返回值為TRUE時(shí)外層查詢才會(huì) 執(zhí)行
假如王五同學(xué)在學(xué)生表中則從班級(jí)表查詢所有班級(jí)信息 MySQL命令:
select * from class where exists (select * from student where sname='王五');
運(yùn)行效果展示
3.帶ANY關(guān)鍵字的子查詢
ANY關(guān)鍵字表示滿足其中任意一個(gè)條件就返回一個(gè)結(jié)果作為外層查詢條件。
查詢比任一學(xué)生所屬班級(jí)號(hào)還大的班級(jí)編號(hào) MySQL命令:
select * from class where cid > any (select classid from student);
運(yùn)行效果展示
4.帶ALL關(guān)鍵字的子查詢
ALL關(guān)鍵字與ANY有點(diǎn)類似,只不過帶ALL關(guān)鍵字的子?xùn)嗽兎祷氐慕Y(jié)果需同時(shí)滿足所有內(nèi)層?xùn)嗽儣l件。
查詢比所有學(xué)生所屬班級(jí)號(hào)還大的班級(jí)編號(hào) MySQL命令:
select * from class where cid > all (select classid from student);
運(yùn)行效果展示
總結(jié)
重要(從關(guān)鍵字分析):
查詢語(yǔ)句的書寫順序和執(zhí)行順序
select ===> from ===> where ===> group by ===> having ===> order by ===> limit
查詢語(yǔ)句的執(zhí)行順序
from ===> where ===> group by ===> having ===> select ===> order by ===> limi