日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長(zhǎng)提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

  • 前言

知識(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和
1.175494351E-38~3.402823466E+38

DOUBLE

8

-1.7976931348623157E+308~2.2250738585072014E-308

0和
2.2250738585072014E-308~1.7976931348623157E+308

DECIMAL(M,D)

M+2

-1.7976931348623157E+308~2.2250738585072014E-308

0和
2.2250738585072014E-308~1.7976931348623157E+308

從上圖中可以看出: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

分享到:
標(biāo)簽:基礎(chǔ) SQL
用戶無(wú)頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫(kù),初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績(jī)?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績(jī)?cè)u(píng)定