溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

MySQL中的基礎(chǔ)知識(shí)點(diǎn)有哪些

發(fā)布時(shí)間:2021-12-20 17:05:41 來(lái)源:億速云 閱讀:188 作者:小新 欄目:MySQL數(shù)據(jù)庫(kù)

這篇文章主要為大家展示了“MySQL中的基礎(chǔ)知識(shí)點(diǎn)有哪些”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“MySQL中的基礎(chǔ)知識(shí)點(diǎn)有哪些”這篇文章吧。

一、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)可以通過(guò)SQL管理數(shù)據(jù)庫(kù);定義和操作數(shù)據(jù),維護(hù)數(shù)據(jù)的完整性和安全性。

2.SQL的優(yōu)點(diǎn)

1、簡(jiǎn)單易學(xué),具有很強(qiáng)的操作性
2、絕大多數(shù)重要的數(shù)據(jù)庫(kù)管理系統(tǒng)均支持SQL
3、高度非過(guò)程化;用SQL操作數(shù)據(jù)庫(kù)時(shí)大部分的工作由DBMS自動(dòng)完成

3.SQL的分類

1、DDL(Data Definition Language) 數(shù)據(jù)定義語(yǔ)言,用來(lái)操作數(shù)據(jù)庫(kù)、表、列等; 常用語(yǔ)句:CREATE、 ALTER、DROP
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)操作訪問(wèn)權(quán)限和安全級(jí)別; 常用語(yǔ)句:GRANT、DENY
4、DQL(Data Query Language) 數(shù)據(jù)查詢語(yǔ)言,用來(lái)查詢數(shù)據(jù) 常用語(yǔ)句:SELECT

二、數(shù)據(jù)庫(kù)的三大范式

1、第一范式(1NF)是指數(shù)據(jù)庫(kù)表的每一列都是不可分割的基本數(shù)據(jù)線;也就是說(shuō):每列的值具有原子性,不可再分割。
2、第二范式(2NF)是在第一范式(1NF)的基礎(chǔ)上建立起來(lái)得,滿足第二范式(2NF)必須先滿足第一范式(1NF)。如果表是單主鍵,那么主鍵以外的列必須完全依賴于主鍵;如果表是復(fù)合主鍵,那么主鍵以外的列必須完全依賴于主鍵,不能僅依賴主鍵的一部分。
3、第三范式(3NF)是在第二范式的基礎(chǔ)上建立起來(lái)的,即滿足第三范式必須要先滿足第二范式。第三范式(3NF)要求:表中的非主鍵列必須和主鍵直接相關(guān)而不能間接相關(guān);也就是說(shuō):非主鍵列之間不能相關(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ù)的取值范圍
TINYINT10~255-128~127
SMALLINT20~65535-32768~32768
MEDIUMINT30~16777215-8388608~8388608
INT40~4294967295-2147483648~ 2147483648
BIGINT80~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)的取值范圍
FLOAT4-3.402823466E+38~-1.175494351E-380和1.175494351E-38~3.402823466E+38
DOUBLE8-1.7976931348623157E+308~2.2250738585072014E-3080和2.2250738585072014E-308~1.7976931348623157E+308
DECIMAL(M,D)M+2-1.7976931348623157E+308~2.2250738585072014E-3080和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(chǎn)’‘a(chǎn)’3個(gè)字節(jié)‘a(chǎn)’2個(gè)字節(jié)
‘a(chǎn)b’‘a(chǎn)b’3個(gè)字節(jié)‘a(chǎn)b’3個(gè)字節(jié)
‘a(chǎn)bc’‘a(chǎn)b’3個(gè)字節(jié)‘a(chǎn)bc’4個(gè)字節(jié)
‘a(chǎn)bcd’‘a(chǎn)b’3個(gè)字節(jié)‘a(chǎn)bc’4字節(jié)

4.字符串類型

文本類型用于表示大文本數(shù)據(jù),例如,文章內(nèi)容、評(píng)論、詳情等,它的類型分為如下4種:

數(shù)據(jù)類型儲(chǔ)存范圍
TINYTEXT0~255字節(jié)
TEXT0~65535字節(jié)
MEDIUMTEXT0~16777215字節(jié)
LONGTEXT0~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ù)取值范圍日期格式零值
YEAR11901~2155YYYY0000
DATE41000-01-01~9999-12-31YYYY-MM-DD0000-00-00
TIME3-838:59:59~ 838:59:59HH:MM:SS00:00:00
DATETIME81000-01-01 00:00:00~9999-12-31 23:59:59YYYY-MM-DD HH:MM:SS0000-00-00 00:00:00
TIMESTAMP41970-01-01 00:00:01~2038-01-19 03:14:07YYYY-MM-DD HH:MM:SS0000-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)樽址袷降摹?’表示的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ǔ)存范圍
TINYBLOB0~255字節(jié)
BLOB0~65535字節(jié)
MEDIUMBLOB0~16777215字節(jié)
LONGBLOB0~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)行效果展示:
MySQL中的基礎(chǔ)知識(shí)點(diǎn)有哪些
創(chuàng)建數(shù)據(jù)庫(kù)后查看該數(shù)據(jù)庫(kù)基本信息MySQL命令:

show create database db1;

運(yùn)行效果展示:
MySQL中的基礎(chǔ)知識(shí)點(diǎn)有哪些
刪除數(shù)據(jù)庫(kù)MySQL命令:

drop database db1;

運(yùn)行效果展示:
MySQL中的基礎(chǔ)知識(shí)點(diǎn)有哪些
查詢出MySQL中所有的數(shù)據(jù)庫(kù)MySQL命令:

show databases;

運(yùn)行效果展示:
MySQL中的基礎(chǔ)知識(shí)點(diǎn)有哪些
將數(shù)據(jù)庫(kù)的字符集修改為gbk MySQL命令:

alter database db1 character set gbk;

運(yùn)行效果展示:
MySQL中的基礎(chǔ)知識(shí)點(diǎn)有哪些
切換數(shù)據(jù)庫(kù) MySQL命令:

use db1;

運(yùn)行效果展示:
MySQL中的基礎(chǔ)知識(shí)點(diǎn)有哪些
查看當(dāng)前使用的數(shù)據(jù)庫(kù) MySQL命令:

select database();

運(yùn)行效果展示:
MySQL中的基礎(chǔ)知識(shí)點(diǎ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)行效果展示:
MySQL中的基礎(chǔ)知識(shí)點(diǎn)有哪些

2.2 查看數(shù)據(jù)表

示例:查看當(dāng)前數(shù)據(jù)庫(kù)中所有表 MySQL命令:

show tables;

運(yùn)行效果展示:
MySQL中的基礎(chǔ)知識(shí)點(diǎn)有哪些
示例:查表的基本信息 MySQL命令:

show create table student;

運(yùn)行效果展示:
MySQL中的基礎(chǔ)知識(shí)點(diǎn)有哪些
示例:查看表的字段信息 MySQL命令:

desc student;

運(yùn)行效果展示:
MySQL中的基礎(chǔ)知識(shí)點(diǎ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中的基礎(chǔ)知識(shí)點(diǎn)有哪些
示例:修改字段名 MySQL命令:

alter table stu change name sname varchar(10);

運(yùn)行效果展示:
MySQL中的基礎(chǔ)知識(shí)點(diǎn)有哪些
示例:修改字段數(shù)據(jù)類型 MySQL命令:

alter table stu modify sname int;

運(yùn)行效果展示:
MySQL中的基礎(chǔ)知識(shí)點(diǎn)有哪些
示例:增加字段 MySQL命令:

alter table stu add address varchar(50);

運(yùn)行效果展示:
MySQL中的基礎(chǔ)知識(shí)點(diǎn)有哪些
示例:刪除字段 MySQL命令:

alter table stu drop address;

運(yùn)效果展示:

MySQL中的基礎(chǔ)知識(shí)點(diǎn)有哪些

2.4 刪除數(shù)據(jù)表

語(yǔ)法:

drop table 表名;

示例:刪除數(shù)據(jù)表 MySQL命令:

drop table stu;

運(yùn)行效果展示:

MySQL中的基礎(chǔ)知識(shí)點(diǎn)有哪些

五、數(shù)據(jù)表的約束

為防止錯(cuò)誤的數(shù)據(jù)被插入到數(shù)據(jù)表,MySQL中定義了一些維護(hù)數(shù)據(jù)庫(kù)完整性的規(guī)則;這些規(guī)則常稱為表的約束。常見(jiàn)約束如下:

約束條件說(shuō)明
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ù)的正確性和唯一性。換句話說(shuō),表的約束實(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)行效果展示:
MySQL中的基礎(chǔ)知識(shí)點(diǎn)有哪些
設(shè)置主鍵約束(primary key)的第二·種方式
示例:MySQL命令:

create table student01(id intname varchar(20),primary key(id));

運(yùn)行效果展示:
MySQL中的基礎(chǔ)知識(shí)點(diǎn)有哪些

2.非空約束

非空約束即 NOT NULL指的是字段的值不能為空,基本的語(yǔ)法格式如下所示:

字段名 數(shù)據(jù)類型 NOT NULL;

示例:MySQL命令:

create table student02(id intname varchar(20) not null);

運(yùn)行效果展示:
MySQL中的基礎(chǔ)知識(shí)點(diǎ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)行效果展示:
MySQL中的基礎(chǔ)知識(shí)點(diǎn)有哪些

5.唯一性約束

唯一性約束即UNIQUE用于保證數(shù)據(jù)表中字段的唯一性,即表中字段的值不能重復(fù)出現(xiàn),其基本的語(yǔ)法格式如下所示:

字段名 數(shù)據(jù)類型 UNIQUE;

示例:MySQL命令:

create table student04(id int,name varchar(20) unique);

運(yùn)行效果展示:
MySQL中的基礎(chǔ)知識(shí)點(diǎn)有哪些

6.外鍵約束

外鍵約束即FOREIGN KEY常用于多張表之間的約束?;菊Z(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 student05(id);

運(yùn)行效果展示:
MySQL中的基礎(chǔ)知識(shí)點(diǎ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)行效果展示:
MySQL中的基礎(chǔ)知識(shí)點(diǎn)有哪些
外鍵的那個(gè)字段不在了證明刪除成功了

6.3 關(guān)于外鍵約束需要注意的細(xì)節(jié)

1、從表里的外鍵通常為主表的主鍵
2、從表里外鍵的數(shù)據(jù)類型必須與主表中主鍵的數(shù)據(jù)類型一致
3、主表發(fā)生變化時(shí)應(yīng)注意主表與從表的數(shù)據(jù)一致性問(wèn)題

六、數(shù)據(jù)表插入數(shù)據(jù)

在MySQL通過(guò)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)的。也就是說(shuō):每個(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)行效果展示:
MySQL中的基礎(chǔ)知識(shí)點(diǎ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)隔開(kāi)。
示例:向?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)行效果展示:
MySQL中的基礎(chǔ)知識(shí)點(diǎn)有哪些

七、更新數(shù)據(jù)

在MySQL通過(guò)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)行效果展示:
MySQL中的基礎(chǔ)知識(shí)點(diǎn)有哪些

3. UPDATE更新全部數(shù)據(jù)

示例:將所有記錄的age設(shè)置為18 MySQL命令:

update student set age=18;

運(yùn)行效果展示:
MySQL中的基礎(chǔ)知識(shí)點(diǎn)有哪些

八、刪除數(shù)據(jù)

在MySQL通過(guò)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)行效果展示:
MySQL中的基礎(chǔ)知識(shí)點(diǎn)有哪些

3. DELETE刪除全部數(shù)據(jù)

示例:刪除student表中的所有記錄 MySQL命令:

delete from student;

運(yùn)行效果展示:
MySQL中的基礎(chǔ)知識(shí)點(diǎn)有哪些

4. TRUNCATE和DETELE的區(qū)別

TRUNCATE和DETELE都能實(shí)現(xiàn)刪除表中的所有數(shù)據(jù)的功能,但兩者也是有區(qū)別的:
1、DELETE語(yǔ)句后可跟WHERE子句,可通過(guò)指定WHERE子句中的條件表達(dá)式只刪除滿足條件的部分記錄;但是,TRUNCATE語(yǔ)句只能用于刪除表中的所有記錄。
2、使用TRUNCATE語(yǔ)句刪除表中的數(shù)據(jù)后,再次向表中添加記錄時(shí)自動(dòng)增加字段的默認(rèn)初始值重新由1開(kāi)始;使用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)行效果展示:
MySQL中的基礎(chǔ)知識(shí)點(diǎn)有哪些

3.查詢指定字段(sid、sname)

查詢指定字段(sid、sname) MySQL命令:

select sid,sname from student;

運(yùn)行效果展示:
MySQL中的基礎(chǔ)知識(shí)點(diǎn)有哪些

4.常數(shù)的查詢

在SELECT中除了書(shū)寫(xiě)列名,還可以書(shū)寫(xiě)常數(shù)??梢杂糜跇?biāo)記
常數(shù)的查詢?nèi)掌跇?biāo)記 MySQL命令:

select sid,sname,'2021-03-02' from student;

運(yùn)行效果展示:
MySQL中的基礎(chǔ)知識(shí)點(diǎn)有哪些

5.從查詢結(jié)果中過(guò)濾重復(fù)數(shù)據(jù)

在使用DISTINCT 時(shí)需要注意:
在SELECT查詢語(yǔ)句中DISTINCT關(guān)鍵字只能用在第一個(gè)所查列名之前。
MySQL命令:

select distinct gender from student;

運(yùn)行效果展示:
MySQL中的基礎(chǔ)知識(shí)點(diǎn)有哪些

6.算術(shù)運(yùn)算符(舉例加運(yùn)算符)

在SELECT查詢語(yǔ)句中還可以使用加減乘除運(yùn)算符。
查詢學(xué)生10年后的年齡 MySQL命令:

 select sname,age+10 from student;

運(yùn)行效果展示:
MySQL中的基礎(chǔ)知識(shí)點(diǎ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ù)

在開(kāi)發(fā)中,我們常常有類似的需求:統(tǒng)計(jì)某個(gè)字段的最大值、最小值、 平均值等等。為此,MySQL中提供了聚合函數(shù)來(lái)實(shí)現(xiàn)這些功能。所謂聚合,就是將多行匯總成一行;其實(shí),所有的聚合函數(shù)均如此——輸入多行,輸出一行。聚合函數(shù)具有自動(dòng)濾空的功能,若某一個(gè)值為NULL,那么會(huì)自動(dòng)將其過(guò)濾使其不參與運(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)行效果展示:
MySQL中的基礎(chǔ)知識(shí)點(diǎn)有哪些

1.2、max()

計(jì)算指定列的最大值,如果指定列是字符串類型則使用字符串排序運(yùn)算

查詢?cè)搶W(xué)生表中年紀(jì)最大的學(xué)生
MySQL命令:

select max(age) from student;

運(yùn)行效果展示:
MySQL中的基礎(chǔ)知識(shí)點(diǎn)有哪些

1.3、min()

計(jì)算指定列的最小值,如果指定列是字符串類型則使用字符串排序運(yùn)算

查詢?cè)搶W(xué)生表中年紀(jì)最小的學(xué)生 MySQL命令:

select sname,min(age) from student;

運(yùn)行效果展示:
MySQL中的基礎(chǔ)知識(shí)點(diǎn)有哪些

1.4、sum()

計(jì)算指定列的數(shù)值和,如果指定列類型不是數(shù)值類型則計(jì)算結(jié)果為0
查詢?cè)搶W(xué)生表中年紀(jì)的總和 MySQL命令:

select sum(age) from student;

運(yùn)行效果展示:
MySQL中的基礎(chǔ)知識(shí)點(diǎn)有哪些

1.5、avg()

計(jì)算指定列的平均值,如果指定列類型不是數(shù)值類型則計(jì)算結(jié)果為

查詢?cè)搶W(xué)生表中年紀(jì)的平均數(shù) MySQL命令:

select avg(age) from student;

運(yùn)行效果展示:
MySQL中的基礎(chǔ)知識(shí)點(diǎn)有哪些

2.其他常用函數(shù)

這里我就不一一舉例了,基本混個(gè)眼熟,以后用到再細(xì)說(shuō)

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ǔ)句中通過(guò)WHERE子句指定查詢條件對(duì)查詢結(jié)果進(jìn)行過(guò)濾。
在開(kāi)始學(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)算符說(shuō)明
=等于
<>不等于
!=不等于
<小于
<=小于等于
>大于
>=大于等于

查詢年齡等于或大于17的學(xué)生的信息 MySQL命令:

select * from student where age>=17;

運(yùn)行效果展示:
MySQL中的基礎(chǔ)知識(shí)點(diǎ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)行效果展示:
MySQL中的基礎(chǔ)知識(shí)點(diǎn)有哪些
查詢sid為S_1001以外的學(xué)生的信息 MySQL命令:

select * from student where sid not in ('S_1001');

運(yùn)行效果展示:
MySQL中的基礎(chǔ)知識(shí)點(diǎ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)行效果展示:
MySQL中的基礎(chǔ)知識(shí)點(diǎn)有哪些
查詢不是15到18歲的學(xué)生信息 MySQL命令:

select * from student where age not between 15 and 18;

運(yùn)行效果展示:
MySQL中的基礎(chǔ)知識(shí)點(diǎn)有哪些

4.使用空值查詢

在MySQL中,使用 IS NULL關(guān)鍵字判斷字段的值是否為空值。請(qǐng)注意:空值NULL不同于0,也不同于空字符串
由于student表沒(méi)有空值就不演示查詢空值的了
查詢sname不為空值的學(xué)生信息 MySQL命令:

select * from student where sname is not null;

運(yùn)行效果展示:
MySQL中的基礎(chǔ)知識(shí)點(diǎ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)行效果展示:
MySQL中的基礎(chǔ)知識(shí)點(diǎ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)行效果展示:
MySQL中的基礎(chǔ)知識(shí)點(diǎ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)行效果展示:
MySQL中的基礎(chǔ)知識(shí)點(diǎn)有哪些

7.2 含有%通配的字符串

%用于匹配任意長(zhǎng)度的字符串。例如,字符串“a%”匹配以字符a開(kāi)始任意長(zhǎng)度的字符串
查詢學(xué)生姓名以li開(kāi)始的記錄 MySQL命令:

select * from student where sname like 'li%';

運(yùn)行效果展示:
MySQL中的基礎(chǔ)知識(shí)點(diǎn)有哪些
查詢學(xué)生姓名以g結(jié)尾的記錄 MySQL命令:

select * from student where sname like '%g';

運(yùn)行效果展示:
MySQL中的基礎(chǔ)知識(shí)點(diǎn)有哪些
查詢學(xué)生姓名包含s的記錄 MySQL命令:

select * from student where sname like '%s%';

運(yùn)行效果展示
MySQL中的基礎(chǔ)知識(shí)點(diǎn)有哪些

7.3 含有_通配的字符串

下劃線通配符只匹配單個(gè)字符,如果要匹配多個(gè)字符,需要連續(xù)使用多個(gè)下劃線通配符。例如,字符串“ab_”匹配以字符串“ab”開(kāi)始長(zhǎng)度為3的字符串,如abc、abp等等;字符串“a__d”匹配在字符“a”和“d”之間包含兩個(gè)字符的字符串,如"abcd"、"atud"等等。
查詢學(xué)生姓名以zx開(kāi)頭且長(zhǎng)度為4的記錄 MySQL命令:

select * from student where sname like 'zx__';

運(yùn)行效果展示
MySQL中的基礎(chǔ)知識(shí)點(diǎn)有哪些

查詢學(xué)生姓名以g結(jié)尾且長(zhǎng)度為4的記錄 MySQL命令:

select * from student where sname like '___g';

運(yùn)行效果展示
MySQL中的基礎(chǔ)知識(shí)點(diǎ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)行效果展示
MySQL中的基礎(chǔ)知識(shí)點(diǎn)有哪些

9.使用GROUP BY進(jìn)行分組查詢

GROUP BY 子句可像切蛋糕一樣將表中的數(shù)據(jù)進(jìn)行分組,再進(jìn)行查詢等操作。換言之,可通俗地理解為:通過(guò)GROUP BY將原來(lái)的表拆分成了幾張小表。
接下來(lái),我們通過(guò)一個(gè)例子開(kāi)始學(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)行效果展示
MySQL中的基礎(chǔ)知識(shí)點(diǎn)有哪些
統(tǒng)計(jì)部門編號(hào)大于1001的各部門員工個(gè)數(shù) MySQL命令:

select count(*), departmentnumber from employee where departmentnumber>1001 group by departmentnumber;

運(yùn)行效果展示
MySQL中的基礎(chǔ)知識(shí)點(diǎn)有哪些

9.2 GROUP BY和聚合函數(shù)以及HAVING一起使用

統(tǒng)計(jì)工資總和大于8000的部門 MySQL命令:

select sum(salary),departmentnumber from employee group by departmentnumber having sum(salary)>8000;

運(yùn)行效果展示
MySQL中的基礎(chǔ)知識(shí)點(diǎ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)行效果展示
MySQL中的基礎(chǔ)知識(shí)點(diǎn)有哪些
查詢所有學(xué)生并按照年紀(jì)大小降序排列 MySQL命令:

select * from student order by age desc;

運(yùn)行效果展示
MySQL中的基礎(chǔ)知識(shí)點(diǎ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)行效果展示
MySQL中的基礎(chǔ)知識(shí)點(diǎ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)行效果展示
MySQL中的基礎(chǔ)知識(shí)點(diǎn)有哪些

十三、表的關(guān)聯(lián)關(guān)系

在實(shí)際開(kāi)發(fā)中數(shù)據(jù)表之間存在著各種關(guān)聯(lián)關(guān)系。在此,介紹MySQL中數(shù)據(jù)表的三種關(guān)聯(lián)關(guān)系。
多對(duì)一
多對(duì)一(亦稱為一對(duì)多)是數(shù)據(jù)表中最常見(jiàn)的一種關(guān)系。例如:?jiǎn)T工與部門之間的關(guān)系,一個(gè)部門可以有多個(gè)員工;而一個(gè)員工不能屬于多個(gè)部門只屬于某個(gè)部門。在多對(duì)一的表關(guān)系 中,應(yīng)將外鍵建在多的一方否則會(huì)造成數(shù)據(jù)的冗余。
多對(duì)多
多對(duì)多是數(shù)據(jù)表中常見(jiàn)的一種關(guān)系。例如:學(xué)生與老師之間的關(guān)系,一個(gè)學(xué)生可以有多個(gè)老師而且一個(gè)老師有多個(gè)學(xué)生。通常情況下,為了實(shí)現(xiàn)這種關(guān)系需要定義一張中間表(亦稱為連接表)該表會(huì)存在兩個(gè)外鍵分別參照老師表和學(xué)生表。
一對(duì)一
在開(kāi)發(fā)過(guò)程中,一對(duì)一的關(guān)聯(lián)關(guān)系在數(shù)據(jù)庫(kù)中并不常見(jiàn);因?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)行效果展示
MySQL中的基礎(chǔ)知識(shí)點(diǎ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)行效果展示
MySQL中的基礎(chǔ)知識(shí)點(diǎ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è)要查詢的表,通過(guò)該語(yǔ)句可以查詢兩個(gè)表中所有的數(shù)據(jù)組合。
由于這個(gè)交叉連接查詢?cè)趯?shí)際運(yùn)用中沒(méi)有任何意義,所以只做為了解即可

2.內(nèi)連接查詢

內(nèi)連接(Inner Join)又稱簡(jiǎn)單連接或自然連接,是一種非常常見(jiàn)的連接查詢。內(nèi)連接使用比較運(yùn)算符對(duì)兩個(gè)表中的數(shù)據(jù)進(jìn)行比較并列出與連接條件匹配的數(shù)據(jù)行,組合成新的 記錄。也就是說(shuō)在內(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ù)mydbCREATE DATABASE mydb;-- 選擇數(shù)據(jù)庫(kù)mydbUSE 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)行效果展示
MySQL中的基礎(chǔ)知識(shí)點(diǎ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 條件

由此可見(jiàn),外連接的語(yǔ)法格式和內(nèi)連接非常相似,只不過(guò)使用的是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ù)mydbCREATE DATABASE mydb;-- 選擇數(shù)據(jù)庫(kù)mydbUSE 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í)沒(méi)有學(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)行效果展示
MySQL中的基礎(chǔ)知識(shí)點(diǎn)有哪些
展示結(jié)果分析:
1、分別找出Java班、C++班、Python班的學(xué)生
2、右表的王躍躍不滿足查詢條件故其沒(méi)有出現(xiàn)在查詢結(jié)果中
3、雖然左表的PHP班沒(méi)有學(xué)生,但是任然顯示了PHP的信息;但是,它對(duì)應(yīng)的學(xué)生名字為NULL

3.2 右(外)連接查詢

右(外)連接的結(jié)果包括RIGHT JOIN子句中指定的右表的所有記錄,以及所有滿足連接條件的記錄。如果右表的某條記錄在左表中沒(méi)有匹配,則左表將返回空值。
查詢每個(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)行效果展示
MySQL中的基礎(chǔ)知識(shí)點(diǎn)有哪些
展示結(jié)果分析:
1、分別找出Java班、C++班、Python班的學(xué)生
2、?左表的PHP班不滿足查詢條件故其沒(méi)有出現(xiàn)在查詢結(jié)果中
3、?雖然右表的jack沒(méi)有對(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é)果作為外層查詢的過(guò)濾條件。在子?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)算符前面我們提到過(guò)得,就是>、<、=、>=、<=、!=等
查詢張三同學(xué)所在班級(jí)的信息 MySQL命令:

select * from class where cid=(select classid from student where sname='張三');

運(yùn)行效果展示
MySQL中的基礎(chǔ)知識(shí)點(diǎn)有哪些
查詢比張三同學(xué)所在班級(jí)編號(hào)還大的班級(jí)的信息 MySQL命令:

select * from class where cid>(select classid from student where sname='張三');

運(yùn)行效果展示
MySQL中的基礎(chǔ)知識(shí)點(diǎ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)行效果展示
MySQL中的基礎(chǔ)知識(shí)點(diǎ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)行效果展示
MySQL中的基礎(chǔ)知識(shí)點(diǎn)有哪些

4.帶ALL關(guān)鍵字的子查詢

ALL關(guān)鍵字與ANY有點(diǎn)類似,只不過(guò)帶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)行效果展示
MySQL中的基礎(chǔ)知識(shí)點(diǎn)有哪些

總結(jié)

重要(從關(guān)鍵字分析):
查詢語(yǔ)句的書(shū)寫(xiě)順序和執(zhí)行順序
select ===> from ===> where ===> group by ===> having ===> order by ===> limit
查詢語(yǔ)句的執(zhí)行順序
from ===> where ===> group by ===> having ===> select ===> order by ===> limi

基于復(fù)習(xí),樂(lè)于分享 所以有了這篇文章?。?!
MySQL中的基礎(chǔ)知識(shí)點(diǎn)有哪些

以上是“MySQL中的基礎(chǔ)知識(shí)點(diǎn)有哪些”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI