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

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

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

  • 前言

知識無底,學海無涯,知識點雖然簡單,但是比較多,所以將MySQL的基礎寫出來,方便自己以后查找,還有就是分享給大家。

一、SQL簡述

1.SQL的概述

Structure Query Language(結構化查詢語言)簡稱SQL,它被美國國家標準局(ANSI)確定為關系型數據庫語言的美國標準,后被國際化標準組織(ISO)采納為關系數據庫語言的國際標準。數據庫管理系統可以通過SQL管理數據庫;定義和操作數據,維護數據的完整性和安全性。

2.SQL的優點


2、絕大多數重要的數據庫管理系統均支持SQL
3、高度過程化;用SQL操作數據庫時大部分的工作由DBMS自動完成

3.SQL的分類


2、DML(Data Manipulation Language) 數據操作語言,用來操作數據庫中表里的數據;常用語句:INSERT、 UPDATE、 DELETE
3、DCL(Data Control Language) 數據控制語言,用來操作訪問權限和安全級別; 常用語句:GRANT、DENY
4、DQL(Data Query Language) 數據查詢語言,用來查詢數據 常用語句:SELECT

二、數據庫的三大范式


2、第二范式(2NF)是在第一范式(
3、第三范式(3NF)是在第二范式的基礎上建立起來的,即滿足第三范式必須要先滿足第二范式。第三范式(3NF)要求:表中的非主鍵列必須和主鍵直接相關而不能間接相關;也就是說:非主鍵列之間不能相關依賴。

三、數據庫的數據類型

使用MySQL數據庫存儲數據時,不同的數據類型決定了 MySQL存儲數據方式的不同。為此,MySQL數據庫提供了多種數據類型,其中包括整數類型、浮點數類型、定點 數類型、日期和時間類型、字符串類型、二進制…等等數據類型。

1.整數類型

根據數值取值范圍的不同MySQL 中的整數類型可分為5種,分別是TINYINT、SMALUNT、MEDIUMINT、INT和 BIGINT。下圖列舉了 MySQL不同整數類型所對應的字節大小和取值范圍而最常用的為INT類型的,

數據類型

字節數

無符號數的取值范圍

有符號數的取值范圍

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.浮點數類型和定點數類型

在MySQL數據庫中使用浮點數和定點數來存儲小數。浮點數的類型有兩種:單精度浮點數類型(FLOAT)和雙精度浮點數類型(DOUBLE)。而定點數類型只有一種即DECIMAL類型。下圖列舉了 MySQL中浮點數和定點數類型所對應的字節大小及其取值范圍:

數據類型

字節數

有符號的取值范圍

無符號的取值范圍

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類型相同。但是,請注意:DECIMAL類型的有效取值范圍是由M和D決定的。其中,M表示的是數據的長 度,D表示的是小數點后的長度。比如,將數據類型為DECIMAL(6,2)的數據6.5243 插人數據庫后顯示的結果為6.52

3.字符串類型

在MySQL中常用CHAR 和 VARCHAR 表示字符串。兩者不同的是:VARCHAR存儲可變長度的字符串。
當數據為CHAR(M)類型時,不管插入值的長度是實際是多少它所占用的存儲空間都是M個字節;而VARCHAR(M)所對應的數據所占用的字節數為實際長度加1

插入值

CHAR(3)

存儲需求

VARCHAR(3)

存儲需求

‘’

‘’

3個字節

‘’

1個字節

‘a’

‘a’

3個字節

‘a’

2個字節

‘ab’

‘ab’

3個字節

‘ab’

3個字節

‘abc’

‘ab’

3個字節

‘abc’

4個字節

‘abcd’

‘ab’

3個字節

‘abc’

4字節

4.字符串類型

文本類型用于表示大文本數據,例如,文章內容、評論、詳情等,它的類型分為如下4種:

數據類型

儲存范圍

TINYTEXT

0~255字節

TEXT

0~65535字節

MEDIUMTEXT

0~16777215字節

LONGTEXT

0~4294967295字節

5.日期與時間類型

MySQL提供的表示日期和時間的數據類型分別是 :YEAR、DATE、TIME、DATETIME 和 TIMESTAMP。下圖列舉了日期和時間數據類型所對應的字節數、取值范圍、日期格式以及零值:

數據類型

字節數

取值范圍

日期格式

零值

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位字符串或數字表示,范圍為’1901’—'2155’或1901—2155。例如,輸人 ‘2019’或2019插人到數據庫中的值均為2019。
2、使用兩位字符串表示,范圍為’00’—‘99’。其中,‘00’—'69’范圍的值會被轉換為 2000—2069范圍的YEAR值,‘70’—'99’范圍的值會被轉換為1970—1999范圍的YEAR 值。例如,輸人’19’插人到數據庫中的值為2019。
3、使用兩位數字表示,范圍為1—99。其中,1—69范圍的值會被轉換為2001— 2069范圍的YEAR值,70—99范圍的值會被轉換為1970—1999范圍的YEAR值。例 如,輸人19插入到數據庫中的值為2019。
請注意:當使用YEAR類型時,一定要區分’0’和0。因為字符串格式的’0’表示的YEAR值是2000而數字格式的0表示的YEAR值是0000。

5.2 TIME類型

TIME類型用于表示時間值,它的顯示形式一般為HH:MM:SS,其中,HH表示小時, MM表示分,SS表示秒。在MySQL中,可以使用以下3種格式指定TIME類型的值。
1、以’D HH:MM:SS’字符串格式表示。其中,D表示日可取0—34之間的值, 插人數據時,小時的值等于(DX24+HH)。例如,輸入’2 11:30:50’插人數據庫中的日期為59:30:50。
2、以’HHMMSS’字符串格式或者HHMMSS數字格式表示。 例如,輸人’115454’或115454,插入數據庫中的日期為11:54:54
3、使用CURRENT_TIME或NOW()輸人當前系統時間。

5.3 DATETIME類型

DATETIME類型用于表示日期和時間,它的顯示形式為’YYYY-MM-DD HH: MM:SS’,其中,YYYY表示年,MM表示月,DD表示日,HH表示小時,MM表示分,SS 表示秒。在MySQL中,可以使用以下4種格式指定DATETIME類型的值。
?以’YYYY-MM-DD HH:MM:SS’或者’YYYYMMDDHHMMSS’字符串格式表示的日期和時間,取值范圍為’1000-01-01 00:00:00’—‘9999-12-3 23:59:59’。例如,輸人’2019-01-22 09:01:23’或 ‘20140122_0_90123’插人數據庫中的 DATETIME 值都為 2019-01-22 09:01:23。
1、以’YY-MM-DD HH:MM:SS’或者’YYMMDDHHMMSS’字符串格式表示的日期和時間,其中YY表示年,取值范圍為’00’—‘99’。與DATE類型中的YY相同,‘00’— '69’范圍的值會被轉換為2000—2069范圍的值,‘70’—'99’范圍的值會被轉換為1970—1999范圍的值。
2、以YYYYMMDDHHMMSS或者YYMMDDHHMMSS數字格式表示的日期 和時間。例如,插入20190122090123或者190122090123,插人數據庫中的DATETIME值都 為 2019-01-22 09:01:23。
3、使用NOW來輸人當前系統的日期和時間。

5.4 TIMESTAMP類型

TIMESTAMP類型用于表示日期和時間,它的顯示形式與DATETIME相同但取值范圍比DATETIME小。在此,介紹幾種TIMESTAMP類型與DATATIME類型不同的形式:
1、使用CURRENT_TIMESTAMP輸人系統當前日期和時間。
2、輸人NULL時系統會輸人系統當前日期和時間。
3、無任何輸人時系統會輸入系統當前日期和時間。

6.二進制類型

在MySQL中常用BLOB存儲二進制類型的數據,例如:圖片、PDF文檔等。BLOB類型分為如下四種:

數據類型

儲存范圍

TINYBLOB

0~255字節

BLOB

0~65535字節

MEDIUMBLOB

0~16777215字節

LONGBLOB

0~4294967295字節

四、數據庫、數據表的基本操作

1.數據庫的基本操作

MySQL安裝完成后,要想將數據存儲到數據庫的表中,首先要創建一個數據庫。創 建數據庫就是在數據庫系統中劃分一塊空間存儲數據,語法如下:

 create database 數據庫名稱;

創建一個叫db1的數據庫MySQL命令:

-- 創建一個叫db1的數據庫
show create database db1;

運行效果展示:

 

創建數據庫后查看該數據庫基本信息MySQL命令:

show create database db1;

運行效果展示:

 

刪除數據庫MySQL命令:

 drop database db1;

運行效果展示:

 

查詢出MySQL中所有的數據庫MySQL命令:

 show databases;

運行效果展示:

 

將數據庫的字符集修改為gbk MySQL命令:

 alter database db1 character set gbk;

運行效果展示:

 

切換數據庫 MySQL命令:

use db1;

運行效果展示:

 

查看當前使用的數據庫 MySQL命令:

 select database();

運行效果展示:

 

2.數據表的基本操作

數據庫創建成功后可在該數據庫中創建數據表(簡稱為表)存儲數據。請注意:在操作數據表之前應使用“USE 數據庫名;”指定操作是在哪個數據庫中進行先關操作,否則會拋出“No database selected”錯誤。
語法如下:

  create table 表名(
         字段1 字段類型,
         字段2 字段類型,
         …
         字段n 字段類型
);

2.1 創建數據表

示例:創建學生表 MySQL命令:

  create table student( id int, name varchar(20), gender varchar(10), birthday date );

運行效果展示:

 

2.2 查看數據表

示例:查看當前數據庫中所有表 MySQL命令:

 show tables;

運行效果展示:

 

示例:查表的基本信息 MySQL命令:

 show create table student;

運行效果展示:

 

示例:查看表的字段信息 MySQL命令:

 desc student;

運行效果展示:

 

2.3 修改數據表

有時,希望對表中的某些信息進行修改,例如:修改表名、修改字段名、修改字段 數據類型…等等。在MySQL中使用alter table修改數據表.
示例:修改表名 MySQL命令:

 alter table student rename to stu;

運行效果展示:

 

示例:修改字段名 MySQL命令:

 alter table stu change name sname varchar(10);

運行效果展示:

 

示例:修改字段數據類型 MySQL命令:

 alter table stu modify sname int;

運行效果展示:

 

示例:增加字段 MySQL命令:

 alter table stu add address varchar(50);

運行效果展示:

 

示例:刪除字段 MySQL命令:

 alter table stu drop address;

運行效果展示:

 

2.4 刪除數據表

語法:

 drop table 表名;

示例:刪除數據表 MySQL命令:

 drop table stu;

運行效果展示:

 

五、數據表的約束

為防止錯誤的數據被插入到數據表,MySQL中定義了一些維護數據庫完整性的規則;這些規則常稱為表的約束。常見約束如下:

約束條件

說明

PRIMARY KEY

主鍵約束用于唯一標識對應的記錄

FOREIGN KEY

外鍵約束

NOT NULL

非空約束

UNIQUE

唯一性約束

DEFAULT

默認值約束,用于設置字段的默認值

以上五種約束條件針對表中字段進行限制從而保證數據表中數據的正確性和唯一性。換句話說,表的約束實際上就是表中數據的限制條件。

1.主鍵約束

主鍵約束即primary key用于唯一的標識表中的每一行。被標識為主鍵的數據在表中是唯一的且其值不能為空。這點類似于我們每個人都有一個身份證號,并且這個身份證號是唯一的。
主鍵約束基本語法:

 字段名 數據類型 primary key;

設置主鍵約束(primary key)的第一種方式
示例:MySQL命令:

 create table student(id int primary key,name varchar(20));

運行效果展示:

 

設置主鍵約束(primary key)的第二·種方式
示例:MySQL命令:

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

運行效果展示:

 

2.非空約束

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

 字段名 數據類型 NOT NULL;

示例:MySQL命令:

 create table student02(id int
name varchar(20) not null);

運行效果展示:

 

3.默認值約束

默認值約束即DEFAULT用于給數據表中的字段指定默認值,即當在表中插入一條新記錄時若未給該字段賦值,那么,數據庫系統會自動為這個字段插人默認值;其基本的語法格式如下所示:

 字段名 數據類型 DEFAULT 默認值;

示例:MySQL命令:

 create table student03(id int,name varchar(20),gender varchar(10) default 'male'
);

運行效果展示:

 

5.唯一性約束

唯一性約束即UNIQUE用于保證數據表中字段的唯一性,即表中字段的值不能重復出現,其基本的語法格式如下所示:

字段名 數據類型 UNIQUE;

示例:MySQL命令:

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

運行效果展示:

 

6.外鍵約束

外鍵約束即FOREIGN KEY常用于多張表之間的約束。基本語法如下:

 -- 在創建數據表時語法如下:
CONSTRAINT 外鍵名 FOREIGN KEY (從表外鍵字段) REFERENCES 主表 (主鍵字段)
-- 將創建數據表創號后語法如下:ALTER TABLE 從表名 ADD CONSTRAINT 外鍵名 FOREIGN KEY (從表外鍵字段) REFERENCES 主表 (主鍵字段);

示例:創建一個學生表 MySQL命令:

 create table student05(id int primary key,name varchar(20));

示例:創建一個班級表 MySQL命令:

 create table class(classid int primary key,studentid int
);

示例:學生表作為主表,班級表作為副表設置外鍵, MySQL命令:

 alter table class add constraint fk_class_studentid foreign key(studentid) references student(id);

運行效果展示:

 

6.1 數據一致性概念

大家知道:建立外鍵是為了保證數據的完整和統一性。但是,如果主表中的數據被刪除或修改從表中對應的數據該怎么辦呢?很明顯,從表中對應的數據也應該被刪除,否則數據庫中會存在很多無意義的垃圾數據。

6.2 刪除外鍵

語法如下:

 alter table 從表名 drop foreign key 外鍵名;

示例:刪除外鍵 MySQL命令:

 alter table class drop foreign key fk_class_studentid;

運行效果展示:

 

外鍵的那個字段不在了證明刪除成功了

6.3 關于外鍵約束需要注意的細節

1、從表里的外鍵通常為主表的主鍵
2、從表里外鍵的數據類型必須與主表中主鍵的數據類型一致
3、主表發生變化時應注意主表與從表的數據一致性問題

六、數據表插入數據

在MySQL通過INSERT語句向數據表中插入數據。在此,我們先準備一張學生表,代碼如下:

  create table student( id int, name varchar(30), age int, gender varchar(30) );

1. 為表中所有字段插入數據

每個字段與其值是嚴格一一對應的。也就是說:每個值、值的順序、值的類型必須與對應的字段相匹配。但是,各字段也無須與其在表中定義的順序一致,它們只要與 VALUES中值的順序一致即可。
語法如下:

INSERT INTO 表名(字段名1,字段名2,...) VALUES (值 1,值 2,...);

示例:向學生表中插入一條學生信息 MySQL命令:

 insert into student (id,name,age,gender) values (1,'bob',16,'male');

運行效果展示:

 

2. 為表中指定字段插入數據

語法如下:

 INSERT INTO 表名(字段名1,字段名2,...) VALUES (值 1,值 2,...);

插入數據的方法基本和為表中所有字段插入數據,一樣,只是需要插入的字段由你自己指定

3. 同時插入多條記錄

語法如下:

 INSERT INTO 表名 [(字段名1,字段名2,...)]VALUES (值 1,值 2,…),(值 1,值 2,…),...;

在該方式中:(字段名1,字段名2,…)是可選的,它用于指定插人的字段名;(值 1,值 2,…),(值 1,值 2,…)表示要插人的記錄,該記錄可有多條并且每條記錄之間用逗號隔開。
示例:向學生表中插入多條學生信息 MySQL命令:

 insert into student (id,name,age,gender) values (2,'lucy',17,'female'),(3,'jack',19,'male'),(4,'tom',18,'male');

運行效果展示:

 

七、更新數據

在MySQL通過UPDATE語句更新數據表中的數據。在此,我們將就用六中的student學生表

1. UPDATE基本語法

 UPDATE 表名 SET 字段名1=值1[,字段名2 =值2,…] [WHERE 條件表達式];

在該語法中:字段名1、字段名2…用于指定要更新的字段名稱;值1、值 2…用于表示字段的新數據;WHERE 條件表達式 是可選的,它用于指定更新數據需要滿足的條件

2. UPDATE更新部分數據

示例:將name為tom的記錄的age設置為20并將其gender設置為female MySQL命令:

 update student set age=20,gender='female' where name='tom';

運行效果展示:

 

3. UPDATE更新全部數據

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

 update student set age=18;

運行效果展示:

 

八、刪除數據

在MySQL通過DELETE語句刪除數據表中的數據。在此,我們先準備一張數據表,代碼如下:

 -- 創建學生表
 create table student( id int, name varchar(30), age int, gender varchar(30) );
 -- 插入數據
 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基本語法

在該語法中:表名用于指定要執行刪除操作的表;[WHERE 條件表達式]為可選參數用于指定刪除的條件。

 DELETE FROM 表名 [WHERE 條件表達式];

2. DELETE刪除部分數據

示例:刪除age等于14的所有記錄 MySQL命令:

 delete from student where age=14;

運行效果展示:

 

3. DELETE刪除全部數據

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

 delete from student;

運行效果展示:

 

4. TRUNCATE和DETELE的區別

TRUNCATE和DETELE都能實現刪除表中的所有數據的功能,但兩者也是有區別的:
1、DELETE語句后可跟WHERE子句,可通過指定WHERE子句中的條件表達式只刪除滿足條件的部分記錄;但是,TRUNCATE語句只能用于刪除表中的所有記錄。
2、使用TRUNCATE語句刪除表中的數據后,再次向表中添加記錄時自動增加字段的默認初始值重新由1開始;使用DELETE語句刪除表中所有記錄后,再次向表中添加記錄時自動增加字段的值為刪除時該字段的最大值加1
3、DELETE語句是DML語句,TRUNCATE語句通常被認為是DDL語句

九、MySQL數據表簡單查詢

1.簡單查詢概述

簡單查詢即不含where的select語句。在此,我們講解簡單查詢中最常用的兩種查詢:查詢所有字段和查詢指定字段。
在此,先準備測試數據,代碼如下:

 -- 創建數據庫
DROP DATABASE IF EXISTS mydb;
CREATE DATABASE mydb;
USE mydb;

-- 創建student表
CREATE TABLE student (    sid CHAR(6),    sname VARCHAR(50),    age INT,    gender VARCHAR(50) DEFAULT 'male'
);

-- 向student表插入數據
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;

運行效果展示:

 

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

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

 select sid,sname from student;

運行效果展示:

 

4.常數的查詢

在SELECT中除了書寫列名,還可以書寫常數。可以用于標記
常數的查詢日期標記 MySQL命令:

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

運行效果展示:

 

5.從查詢結果中過濾重復數據

在使用DISTINCT 時需要注意:
在SELECT查詢語句中DISTINCT關鍵字只能用在第一個所查列名之前。
MySQL命令:

select distinct gender from student;

運行效果展示:

 

6.算術運算符(舉例加運算符)

在SELECT查詢語句中還可以使用加減乘除運算符。
查詢學生10年后的年齡 MySQL命令:

  select sname,age+10 from student;

運行效果展示:

 

十、函數

在此,先準備測試數據,代碼如下:

 -- 創建數據庫
DROP DATABASE IF EXISTS mydb;
CREATE DATABASE mydb;
USE mydb;

-- 創建student表
CREATE TABLE student (    sid CHAR(6),    sname VARCHAR(50),    age INT,    gender VARCHAR(50) DEFAULT 'male'
);

-- 向student表插入數據
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.聚合函數

在開發中,我們常常有類似的需求:統計某個字段的最大值、最小值、 平均值等等。為此,MySQL中提供了聚合函數來實現這些功能。所謂聚合,就是將多行匯總成一行;其實,所有的聚合函數均如此——輸入多行,輸出一行。聚合函數具有自動濾空的功能,若某一個值為NULL,那么會自動將其過濾使其不參與運算。
聚合函數使用規則:
只有SELECT子句和HAVING子句、ORDER BY子句中能夠使用聚合函數。例如,在WHERE子句中使用聚合函數是錯誤的。
接下來,我們學習常用聚合函數。

1.1、count()

統計表中數據的行數或者統計指定列其值不為NULL的數據個數
查詢有多少該表中有多少人
MySQL命令:

 select count(*) from student;

運行效果展示:

 

1.2、max()

計算指定列的最大值,如果指定列是字符串類型則使用字符串排序運算

查詢該學生表中年紀最大的學生
MySQL命令:

 select max(age) from student;

運行效果展示:

 

1.3、min()

計算指定列的最小值,如果指定列是字符串類型則使用字符串排序運算

查詢該學生表中年紀最小的學生 MySQL命令:

 select sname,min(age) from student;

運行效果展示:

 

1.4、sum()

計算指定列的數值和,如果指定列類型不是數值類型則計算結果為0
查詢該學生表中年紀的總和 MySQL命令:

 select sum(age) from student;

運行效果展示:

 

1.5、avg()

計算指定列的平均值,如果指定列類型不是數值類型則計算結果為

查詢該學生表中年紀的平均數 MySQL命令:

 select avg(age) from student;

運行效果展示:

 

2.其他常用函數

這里我就不一一舉例了,基本混個眼熟,以后用到再細說

2.1、時間函數

 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、字符串函數

 --連接函數
SELECT CONCAT ()
--SELECT INSTR ();
--統計長度
SELECT LENGTH();

2.3、數學函數

 -- 絕對值
SELECT ABS(-136);
-- 向上取整
SELECT FLOOR(3.14);
-- 向下取整
SELECT CEILING(3.14);

十一、條件查詢

數據庫中存有大量數據,我們可根據需求獲取指定的數據。此時,我們可在查詢語句中通過WHERE子句指定查詢條件對查詢結果進行過濾。
在開始學習條件查詢之前,我們先準備測試數據,代碼如下:

 -- 創建數據庫
DROP DATABASE IF EXISTS mydb;
CREATE DATABASE mydb;
USE mydb;

-- 創建student表
CREATE TABLE student (    sid CHAR(6),    sname VARCHAR(50),    age INT,    gender VARCHAR(50) DEFAULT 'male'
);

-- 向student表插入數據
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.使用關系運算符查詢

在WHERE中可使用關系運算符進行條件查詢,常用的關系運算符如下所示:

關系運算符

說明

=

等于

<>

不等于

!=

不等于

<

小于

<=

小于等于

>

大于

>=

大于等于

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

 select * from student where age>=17;

運行效果展示:

 

2.使用IN關鍵字查詢

IN關鍵字用于判斷某個字段的值是否在指定集合中。如果字段的值恰好在指定的集合中,則將字段所在的記錄將査詢出來。

查詢sid為S_1002和S_1003的學生信息 MySQL命令:

 select * from student where sid in ('S_1002','S_1003');

運行效果展示:

 

查詢sid為S_1001以外的學生的信息 MySQL命令:

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

運行效果展示:

 

3.使用BETWEEN AND關鍵字查詢

BETWEEN AND用于判斷某個字段的值是否在指定的范圍之內。如果字段的值在指定范圍內,則將所在的記錄將查詢出來
查詢15到18歲的學生信息 MySQL命令:

 select * from student where age between 15 and 18;

運行效果展示:

 

查詢不是15到18歲的學生信息 MySQL命令:

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

運行效果展示:

 

4.使用空值查詢

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

 select * from student where sname is not null;

運行效果展示:

 

5.使用AND關鍵字查詢

在MySQL中可使用AND關鍵字可以連接兩個或者多個查詢條件。
查詢年紀大于15且性別為male的學生信息 MySQL命令:

 select * from student where age>15 and gender='male';

運行效果展示:

 

6.使用OR關鍵字查詢

在使用SELECT語句查詢數據時可使用OR關鍵字連接多個査詢條件。在使用OR關鍵字時,只要記錄滿足其中任意一個條件就會被查詢出來
查詢年紀大于15或者性別為male的學生信息 MySQL命令:

 select * from student where age>15 or gender='male';

運行效果展示:

 

7.使用LIKE關鍵字查詢

MySQL中可使用LIKE關鍵字可以判斷兩個字符串是否相匹配

7.1 普通字符串

查詢sname中與wang匹配的學生信息 MySQL命令:

 select * from student where sname like 'wang';

運行效果展示:

 

7.2 含有%通配的字符串

%用于匹配任意長度的字符串。例如,字符串“a%”匹配以字符a開始任意長度的字符串
查詢學生姓名以li開始的記錄 MySQL命令:

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

運行效果展示:

 

查詢學生姓名以g結尾的記錄 MySQL命令:

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

運行效果展示:

 

查詢學生姓名包含s的記錄 MySQL命令:

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

運行效果展示

 

7.3 含有_通配的字符串

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

 select * from student where sname like 'zx__';

運行效果展示

 

查詢學生姓名以g結尾且長度為4的記錄 MySQL命令:

 select * from student where sname like '___g';

運行效果展示

 

8.使用LIMIT限制查詢結果的數量

當執行查詢數據時可能會返回很多條記錄,而用戶需要的數據可能只是其中的一條或者幾條
查詢學生表中年紀最小的3位同學 MySQL命令:


select * from student order by age asc limit 3;

運行效果展示

 

9.使用GROUP BY進行分組查詢

GROUP BY 子句可像切蛋糕一樣將表中的數據進行分組,再進行查詢等操作。換言之,可通俗地理解為:通過GROUP BY將原來的表拆分成了幾張小表。
接下來,我們通過一個例子開始學習GROUP BY,代碼如下

 -- 創建數據庫
DROP DATABASE IF EXISTS mydb;
CREATE DATABASE mydb;
USE mydb;

-- 創建員工表
CREATE TABLE employee (    id int,    name varchar(50),    salary int,    departmentnumber int
);

-- 向員工表中插入數據
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和聚合函數一起使用

統計各部門員工個數 MySQL命令:

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

運行效果展示

 

統計部門編號大于1001的各部門員工個數 MySQL命令:

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

運行效果展示

 

9.2 GROUP BY和聚合函數以及HAVING一起使用

統計工資總和大于8000的部門 MySQL命令:

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

運行效果展示

 

10.使用ORDER BY對查詢結果排序

從表中査詢出來的數據可能是無序的或者其排列順序不是我們期望的。為此,我們可以使用ORDER BY對查詢結果進行排序
其語法格式如下所示:

 SELECT 字段名1,字段名2,…
FROM 表名
ORDER BY 字段名1 [ASC 丨 DESC],字段名2 [ASC | DESC];

在該語法中:字段名1、字段名2是查詢結果排序的依據;參數 ASC表示按照升序排序,DESC表示按照降序排序;默認情況下,按照ASC方式排序。通常情況下,ORDER BY子句位于整個SELECT語句的末尾。
查詢所有學生并按照年紀大小升序排列 MySQL命令:

 select * from student order by age asc;

運行效果展示

 

查詢所有學生并按照年紀大小降序排列 MySQL命令:

 select * from student order by age desc;

運行效果展示

 

十二、別名設置

在査詢數據時可為表和字段取別名,該別名代替表和字段的原名參與查詢操作。
操作的表事先已準備

1.為表取別名

在查詢操作時,假若表名很長使用起來就不太方便,此時可為表取一個別名,用該別名來代替表的名稱。語法格式如下所示:

 SELECT * FROM 表名 [AS] 表的別名 WHERE .... ;

將student改為stu查詢整表 MySQL命令:

 select * from student as stu;

運行效果展示

 

2.為字段取別名

在查詢操作時,假若字段名很長使用起來就不太方便,此時可該字段取一個別名,用該別名來代替字段的名稱。語法格式如下所示:

 SELECT 字段名1 [AS] 別名1 , 字段名2 [AS] 別名2 , ... FROM 表名 WHERE ... ;

將student中的name取別名為“姓名” 查詢整表 MySQL命令:

 select name as '姓名',id from student;

運行效果展示

 

十三、表的關聯關系

在實際開發中數據表之間存在著各種關聯關系。在此,介紹MySQL中數據表的三種關聯關系。
多對一
多對一(亦稱為一對多)是數據表中最常見的一種關系。例如:員工與部門之間的關系,一個部門可以有多個員工;而一個員工不能屬于多個部門只屬于某個部門。在多對一的表關系 中,應將外鍵建在多的一方否則會造成數據的冗余。
多對多
多對多是數據表中常見的一種關系。例如:學生與老師之間的關系,一個學生可以有多個老師而且一個老師有多個學生。通常情況下,為了實現這種關系需要定義一張中間表(亦稱為連接表)該表會存在兩個外鍵分別參照老師表和學生表。
一對一
在開發過程中,一對一的關聯關系在數據庫中并不常見;因為以這種方式存儲的信息通常會放在同一張表中。
接下來,我們來學習在一對多的關聯關系中如果添加和刪除數據。先準備一些測試數據,代碼如下:

 DROP TABLE IF EXISTS student;
DROP TABLE IF EXISTS class;

-- 創建班級表
CREATE TABLE class(    cid int(4) NOT NULL PRIMARY KEY,    cname varchar(30) );

-- 創建學生表
CREATE TABLE student(    sid int(8) NOT NULL PRIMARY KEY,    sname varchar(30),    classid int(8) NOT NULL
);

-- 為學生表添加外鍵約束
ALTER TABLE student ADD CONSTRAINT fk_student_classid FOREIGN KEY(classid) REFERENCES class(cid);
-- 向班級表插入數據
INSERT INTO class(cid,cname)VALUES(1,'JAVA');
INSERT INTO class(cid,cname)VALUES(2,'Python');

-- 向學生表插入數據
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.關聯查詢

查詢Java班的所有學生 MySQL命令:

 select * from student where classid=(select cid from class where cname='Java');

運行效果展示

 

2.關于關聯關系的刪除數據

請從班級表中刪除Java班級。在此,請注意:班級表和學生表之間存在關聯關系;要刪除Java班級,應該先刪除學生表中與該班相關聯的學生。否則,假若先刪除Java班那么學生表中的cid就失去了關聯
刪除Java班 MySQL命令:

 delete from student where classid=(select cid from class where cname='Java');
delete from class where cname='Java';

運行效果展示

 

十四、多表連接查詢

1.交叉連接查詢

交叉連接返回的結果是被連接的兩個表中所有數據行的笛卡兒積;比如:集合A={a,b},集合B={0,1,2},則集合A和B的笛卡爾積為{(a,0),(a,1),(a,2),(b,0),(b,1),(b,2)}。所以,交叉連接也被稱為笛卡爾連接,其語法格式如下:

 SELECT * FROM 表1 CROSS JOIN 表2;

在該語法中:CROSS JOIN用于連接兩個要查詢的表,通過該語句可以查詢兩個表中所有的數據組合。
由于這個交叉連接查詢在實際運用中沒有任何意義,所以只做為了解即可

2.內連接查詢

內連接(Inner Join)又稱簡單連接或自然連接,是一種非常常見的連接查詢。內連接使用比較運算符對兩個表中的數據進行比較并列出與連接條件匹配的數據行,組合成新的 記錄。也就是說在內連接查詢中只有滿足條件的記錄才能出現在查詢結果中。其語法格式如下:

 SELECT 查詢字段1,查詢字段2, ... FROM 表1 [INNER] JOIN 表2 ON 表1.關系字段=表2.關系字段

在該語法中:INNER JOIN用于連接兩個表,ON來指定連接條件;其中INNER可以省略。

準備數據,代碼如下:

 -- 若存在數據庫mydb則刪除
DROP DATABASE IF EXISTS mydb;
-- 創建數據庫mydb
CREATE DATABASE mydb;
-- 選擇數據庫mydb
USE mydb;

-- 創建部門表
CREATE TABLE department(  did int (4) NOT NULL PRIMARY KEY,   dname varchar(20));

-- 創建員工表
CREATE TABLE employee (  eid int (4) NOT NULL PRIMARY KEY,   ename varchar (20),   eage int (2),   departmentid int (4) NOT NULL
);

-- 向部門表插入數據
INSERT INTO department VALUES(1001,'財務部');
INSERT INTO department VALUES(1002,'技術部');
INSERT INTO department VALUES(1003,'行政部');
INSERT INTO department VALUES(1004,'生活部');
-- 向員工表插入數據
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;

運行效果展示

 

3.外連接查詢

在使用內連接查詢時我們發現:返回的結果只包含符合查詢條件和連接條件的數據。但是,有時還需要在返回查詢結果中不僅包含符合條件的數據,而且還包括左表、右表或兩個表中的所有數據,此時我們就需要使用外連接查詢。外連接又分為左(外)連接和右(外)連接。其語法格式如下:

 SELECT 查詢字段1,查詢字段2, ... FROM 表1 LEFT | RIGHT [OUTER] JOIN 表2 ON 表1.關系字段=表2.關系字段 WHERE 條件

由此可見,外連接的語法格式和內連接非常相似,只不過使用的是LEFT [OUTER] JOIN、RIGHT [OUTER] JOIN關鍵字。其中,關鍵字左邊的表被稱為左表,關鍵字右邊的表被稱為右表;OUTER可以省略。
在使用左(外)連接和右(外)連接查詢時,查詢結果是不一致的,具體如下:
1、LEFT [OUTER] JOIN 左(外)連接:返回包括左表中的所有記錄和右表中符合連接條件的記錄。
2、RIGHT [OUTER] JOIN 右(外)連接:返回包括右表中的所有記錄和左表中符合連接條件的記錄。

先準備數據,代碼如下:

-- 若存在數據庫mydb則刪除
DROP DATABASE IF EXISTS mydb;
-- 創建數據庫mydb
CREATE DATABASE mydb;
-- 選擇數據庫mydb
USE mydb;

-- 創建班級表
CREATE TABLE class(  cid int (4) NOT NULL PRIMARY KEY,   cname varchar(20));

-- 創建學生表
CREATE TABLE student (  sid int (4) NOT NULL PRIMARY KEY,   sname varchar (20),   sage int (2),   classid int (4) NOT NULL
);
-- 向班級表插入數據
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 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);

準備這組數據有一定的特點,為的是讓大家直觀的看出左連接與右連接的不同之處
1、班級編號為1004的PHP班級沒有學生
2、學號為5的學生王躍躍班級編號為1009,該班級編號并不在班級表中

3.1 左(外)連接查詢

左(外)連接的結果包括LEFT JOIN子句中指定的左表的所有記錄,以及所有滿足連接條件的記錄。如果左表的某條記錄在右表中不存在則在右表中顯示為空。
查詢每個班的班級ID、班級名稱及該班的所有學生的名字 MySQL命令:

 select class.cid,class.cname,student.sname from class left outer join student on class.cid=student.classid;

運行效果展示

 

展示結果分析:
1、分別找出Java班、C++班、Python班的學生
2、右表的王躍躍不滿足查詢條件故其沒有出現在查詢結果中
3、雖然左表的PHP班沒有學生,但是任然顯示了PHP的信息;但是,它對應的學生名字為NULL

3.2 右(外)連接查詢

右(外)連接的結果包括RIGHT JOIN子句中指定的右表的所有記錄,以及所有滿足連接條件的記錄。如果右表的某條記錄在左表中沒有匹配,則左表將返回空值。
查詢每個班的班級ID、班級名稱及該班的所有學生的名字 MySQL命令:

 select class.cid,class.cname,student.sname from class right outer join student on class.cid=student.classid;

運行效果展示

 

展示結果分析:
1、分別找出Java班、C++班、Python班的學生
2、?左表的PHP班不滿足查詢條件故其沒有出現在查詢結果中
3、?雖然右表的jack沒有對應班級,但是任然顯示王躍躍的信息;但是,它對應的班級以及班級編號均為NULL

十五、子查詢

子查詢是指一個查詢語句嵌套在另一個查詢語句內部的查詢;該查詢語句可以嵌套在一個 SELECT、SELECT…INTO、INSERT…INTO等語句中。在執行查詢時,首先會執行子查詢中的語句,再將返回的結果作為外層查詢的過濾條件。在子査詢中通常可以使用比較運算符和IN、EXISTS、ANY、ALL等關鍵字。

準備數據,代碼如下:

 DROP TABLE IF EXISTS student;
DROP TABLE IF EXISTS class;

-- 創建班級表
CREATE TABLE class(  cid int (4) NOT NULL PRIMARY KEY,   cname varchar(20));

-- 創建學生表
CREATE TABLE student (  sid int (4) NOT NULL PRIMARY KEY,   sname varchar (20),   sage int (2),   classid int (4) NOT NULL
);

-- 向班級表插入數據
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');

-- 向學生表插入數據
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.帶比較運算符的子查詢

比較運算符前面我們提到過得,就是>、<、=、>=、<=、!=等
查詢張三同學所在班級的信息 MySQL命令:

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

運行效果展示

 

查詢比張三同學所在班級編號還大的班級的信息 MySQL命令:

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

運行效果展示

 

2.帶EXISTS關鍵字的子查詢

EXISTS關鍵字后面的參數可以是任意一個子查詢, 它不產生任何數據只返回TRUE或FALSE。當返回值為TRUE時外層查詢才會 執行
假如王五同學在學生表中則從班級表查詢所有班級信息 MySQL命令:

 select * from class where exists (select * from student where sname='王五');

運行效果展示

 

3.帶ANY關鍵字的子查詢

ANY關鍵字表示滿足其中任意一個條件就返回一個結果作為外層查詢條件。

查詢比任一學生所屬班級號還大的班級編號 MySQL命令:

 select * from class where cid > any (select classid from student);

運行效果展示

 

4.帶ALL關鍵字的子查詢

ALL關鍵字與ANY有點類似,只不過帶ALL關鍵字的子査詢返回的結果需同時滿足所有內層査詢條件。

查詢比所有學生所屬班級號還大的班級編號 MySQL命令:

 select * from class where cid > all (select classid from student);

運行效果展示

 

總結

重要(從關鍵字分析):
查詢語句的書寫順序和執行順序
select ===> from ===> where ===> group by ===> having ===> order by ===> limit
查詢語句的執行順序
from ===> where ===> group by ===> having ===> select ===> order by ===> limi

分享到:
標簽:基礎 SQL
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定