基礎(chǔ)知識(shí):
數(shù)據(jù)庫(kù):存儲(chǔ)數(shù)據(jù)的倉(cāng)庫(kù)要出,本質(zhì)是一個(gè)文件系統(tǒng)鸳惯,數(shù)據(jù)庫(kù)按照特定的格式將數(shù)據(jù)存儲(chǔ)起來(lái)。
常用數(shù)據(jù)庫(kù):MySQL励烦、Oracle
- MySQL:開(kāi)源免費(fèi)的數(shù)據(jù)庫(kù),小型的數(shù)據(jù)庫(kù)已經(jīng)被Oracle收購(gòu)了泼诱。
- Oracle:收費(fèi)的大型數(shù)據(jù)庫(kù)坛掠,Oracle公司的產(chǎn)品。Oracle收購(gòu)SUN公司坷檩,收購(gòu)MySQL却音。
- DB2:IBM公司的數(shù)據(jù)庫(kù)產(chǎn)品改抡,收費(fèi)的矢炼。常用在銀行系統(tǒng)。
- SQL server:Microsoft公司收費(fèi)的中型的數(shù)據(jù)庫(kù)阿纤。c#句灌、.net等語(yǔ)言常使用。
- SyBase:已經(jīng)淡出歷史舞臺(tái)。提供了一個(gè)非常專(zhuān)業(yè)數(shù)據(jù)建模的工具PowerDesigner胰锌。
- SQLite:嵌入式的小型數(shù)據(jù)庫(kù)骗绕,應(yīng)用在手機(jī)端。
數(shù)據(jù)庫(kù)管理系統(tǒng)(DataBase Management System资昧,DBMS):指一種操作和管理數(shù)據(jù)庫(kù)的大型軟件酬土,用于建立、使用和維護(hù)數(shù)據(jù)庫(kù)格带,對(duì)數(shù)據(jù)庫(kù)進(jìn)行統(tǒng)一管理和控制撤缴,以保證數(shù)據(jù)庫(kù)的安全性和完整性。
MySQL安裝成功后叽唱,數(shù)據(jù)庫(kù)中會(huì)存在一些默認(rèn)數(shù)據(jù)庫(kù)屈呕,是默認(rèn)生成的,不要去刪除棺亭,刪除后無(wú)法找回虎眨。
什么是SQL:結(jié)構(gòu)化查詢(xún)語(yǔ)言(Structured Query Language),簡(jiǎn)稱(chēng)SQL, SQL語(yǔ)句就是對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作的一種語(yǔ)言镶摘。
SQL是數(shù)據(jù)庫(kù)管理系統(tǒng)都需要遵循的規(guī)范嗽桩。不同的數(shù)據(jù)庫(kù)生產(chǎn)廠商都支持SQL語(yǔ)句,但都有特有內(nèi)容钉稍。
SQL通用語(yǔ)法(規(guī)范)
- SQL語(yǔ)句可以單行或多行書(shū)寫(xiě)涤躲,以分號(hào)結(jié)尾。
- 可使用空格和縮進(jìn)來(lái)增強(qiáng)語(yǔ)句的可讀性贡未。(多個(gè)空格和縮進(jìn)也可以)
- MySQL數(shù)據(jù)庫(kù)的SQL語(yǔ)句不區(qū)分大小寫(xiě)种樱,關(guān)鍵字建議使用大寫(xiě)。 SELECT * FROM student; ---底層對(duì)于關(guān)鍵字會(huì)轉(zhuǎn)換成大寫(xiě)俊卤。
SQL比較運(yùn)算符
>大于
<小于
<=小于等于
>=大于等于
=等于
<>嫩挤、!=不等于
MySQL數(shù)據(jù)庫(kù)約束:
主鍵約束
唯一約束
非空約束
SQL邏輯運(yùn)算符
and 多個(gè)條件同時(shí)滿(mǎn)足
or 多個(gè)條件其中一個(gè)滿(mǎn)足
not 不滿(mǎn)足
MySQL數(shù)據(jù)類(lèi)型:
類(lèi)型 | 描述 |
---|---|
int | 整型(默認(rèn)11個(gè)長(zhǎng)度) |
double | 浮點(diǎn)型 |
varchar | 字符串型 |
data | 日期類(lèi)型:yyyy-MM-dd |
詳細(xì)的數(shù)據(jù)類(lèi)型如下(不建議詳細(xì)閱讀!)
分類(lèi) | 類(lèi)型名稱(chēng) | 說(shuō)明 |
---|---|---|
整數(shù)類(lèi)型 | tinyInt | 很小的整數(shù) |
? | smallint | 小的整數(shù) |
? | mediumint | 中等大小的整數(shù) |
? | int(integer) | 普通大小的整數(shù) |
小數(shù)類(lèi)型 | float | 單精度浮點(diǎn)數(shù) |
? | double | 雙精度浮點(diǎn)數(shù) |
? | decimal(m,d) | 壓縮嚴(yán)格的定點(diǎn)數(shù) |
日期類(lèi)型 | year | YYYY 1901~2155 |
? | time | HH:MM:SS -838:59:59~838:59:59 |
? | date | YYYY-MM-DD 1000-01-01~9999-12-3 |
? | datetime | YYYY-MM-DD HH:MM:SS 1000-01-01 00:00:00~ 9999-12-31 23:59:59 |
? | timestamp | YYYY-MM-DD HH:MM:SS 19700101 00:00:01 UTC~2038-01-19 03:14:07UTC |
文本消恍、二進(jìn)制類(lèi)型 | CHAR(M) | M為0~255之間的整數(shù) --適合存儲(chǔ)性別等已知長(zhǎng)度且穩(wěn)定的數(shù)據(jù) |
? | VARCHAR(M) | M為0~65535之間的整數(shù) (沒(méi)有默認(rèn)的長(zhǎng)度值) |
? | TINYBLOB | 允許長(zhǎng)度0~255字節(jié) |
? | BLOB | 允許長(zhǎng)度0~65535字節(jié) |
? | MEDIUMBLOB | 允許長(zhǎng)度0~167772150字節(jié) |
? | LONGBLOB | 允許長(zhǎng)度0~4294967295字節(jié) |
? | TINYTEXT | 允許長(zhǎng)度0~255字節(jié) |
? | TEXT | 允許長(zhǎng)度0~65535字節(jié) |
? | MEDIUMTEXT | 允許長(zhǎng)度0~167772150字節(jié) |
? | LONGTEXT | 允許長(zhǎng)度0~4294967295字節(jié) |
? | VARBINARY(M) | 允許長(zhǎng)度0~M個(gè)字節(jié)的變長(zhǎng)字節(jié)字符串 |
? | BINARY(M) | 允許長(zhǎng)度0~M個(gè)字節(jié)的定長(zhǎng)字節(jié)字符串 |
基礎(chǔ)常用語(yǔ)句:
創(chuàng)建db2數(shù)據(jù)庫(kù)岂昭,并使用:
CREATE DATABASE db2;
USE db2;
庫(kù):
CREATE DATABASE 數(shù)據(jù)庫(kù)名; //創(chuàng)建數(shù)據(jù)庫(kù)
SHOW DATABASES; //查看所有數(shù)據(jù)庫(kù)
SELECT DATABASE(); //查看正在使用的數(shù)據(jù)庫(kù)
USE 數(shù)據(jù)庫(kù)名; //使用/切換數(shù)據(jù)庫(kù)
SHOW CREATE DATABASE 數(shù)據(jù)庫(kù)名; //查看指定數(shù)據(jù)庫(kù)的定義信息
DROP DATABASE 數(shù)據(jù)庫(kù)名; //刪除數(shù)據(jù)庫(kù)
表:
CREATE TABLE 新表名 LIKE 舊表名; //快速創(chuàng)建一個(gè)表結(jié)構(gòu)相同的表
CREATE TABLE 表名 (字段名1 字段類(lèi)型1, 字段名2 字段類(lèi)型2…); //創(chuàng)建表
SHOW TABLES; //查看此數(shù)據(jù)庫(kù)下所有的表
DESC 表名; //查看表結(jié)構(gòu)
DROP TABLE 表名; //刪除表
DROP TABLE IF EXISTS 表名; //判斷表是否存在并刪除表
SHOW CREATE TABLE 表名; //查看指定表定義信息
RENAME TABLE 表名 TO 新表名; //修改表名
ALTER TABLE 表名 DROP 列名; //刪除列
INSERT INTO 表名 (字段名1, 字段名2, 字段名3…) VALUES (值1, 值2, 值3); //插入數(shù)據(jù)
INSERT INTO 表名1 SELECT * FROM 表名2; //將表名2中的數(shù)據(jù)復(fù)制到表名1中
//如果只想復(fù)制student表中name,age字段數(shù)據(jù)到student2表中使用如下格式
INSERT INTO student2(name,age) SELECT name,age FROM student;
//不帶條件修改數(shù)據(jù)
UPDATE 表名 SET 字段名=值;
UPDATE student SET sex='女';
//帶條件修改數(shù)據(jù):
UPDATE 表名 SET 字段名=值 WHERE 字段名=值;
UPDATE student SET sex='男' WHERE id=2;
//一次修改多個(gè)列,把id為3的學(xué)生狠怨,年齡改成26歲约啊,address改成北京
UPDATE student SET age=26, address='北京' WHERE id=3;
//帶條件刪除數(shù)據(jù),刪除id為3的記錄
DELETE FROM student WHERE id=3;
查:
SELECT * FROM student;
SELECT id,name,age,sex,address,phone,birthday,math,english FROM student;
//查詢(xún)時(shí)給列佣赖、表指定別名需要使用AS關(guān)鍵字, 注意:AS可以省略不寫(xiě)
SELECT 字段名1 AS 別名, 字段名2 AS 別名... FROM 表名;
//查詢(xún)指定列并且結(jié)果不出現(xiàn)重復(fù)數(shù)據(jù):
SELECT DISTINCT 字段名 FROM 表名;
//查詢(xún)name恰矩,age列并且結(jié)果不出現(xiàn)重復(fù)name:
SELECT DISTINCT NAME, age FROM student;
//查詢(xún)math + english的和
SELECT math + english FROM student;
//查詢(xún)math + english的和使用別名”總成績(jī)”
SELECT math + english 總成績(jī) FROM student;
//查詢(xún)所有列與math + english的和并使用別名”總成績(jī)”
SELECT *, math + english 總成績(jī) FROM student;
其他語(yǔ)句:SQL標(biāo)準(zhǔn)中的Join的類(lèi)型
- 內(nèi)連接 INNER
- 全外連接 FULL OUTER
- 左外連接 LEFT OUTER
- 右外連接 RIGHT OUTER
- 交叉連接 CROSS
inner join 用于將兩張表(A和B表)的列組合在一起,產(chǎn)生新的結(jié)果表憎蛤。
SQL語(yǔ)句分類(lèi):
1.DDL(Data Definition Language)數(shù)據(jù)定義語(yǔ)言
用來(lái)定義數(shù)據(jù)庫(kù)對(duì)象:數(shù)據(jù)庫(kù)外傅,表纪吮,列等。關(guān)鍵字:create, drop(刪除),alter(修改)等
2.DML(Data Manipulation Language)數(shù)據(jù)操作語(yǔ)言
用來(lái)對(duì)數(shù)據(jù)庫(kù)中表的數(shù)據(jù)進(jìn)行增刪改萎胰。關(guān)鍵字:insert(增加), delete(刪除), update(修改)等
3.DQL(Data Query Language)數(shù)據(jù)查詢(xún)語(yǔ)言
用來(lái)查詢(xún)數(shù)據(jù)庫(kù)中表的記錄(數(shù)據(jù))碾盟。關(guān)鍵字:select, where等
4.DCL(Data Control Language)數(shù)據(jù)控制語(yǔ)言(了解)
用來(lái)定義數(shù)據(jù)庫(kù)的訪問(wèn)權(quán)限和安全級(jí)別,及創(chuàng)建用戶(hù)技竟。關(guān)鍵字:GRANT冰肴, REVOKE等
各種SQL語(yǔ)句用法:
1.DDL(Data Definition Language)語(yǔ)句,數(shù)據(jù)定義語(yǔ)言
1.1DDL語(yǔ)句操作數(shù)據(jù)庫(kù)
1.1.1創(chuàng)建數(shù)據(jù)庫(kù)
//1.1.1.1直接創(chuàng)建數(shù)據(jù)庫(kù)
CREATE DATABASE 數(shù)據(jù)庫(kù)名;
CREATE DATABASE db1;
//1.1.1.2判斷是否存在并創(chuàng)建數(shù)據(jù)庫(kù)
CREATE DATABASE IF NOT EXISTS 數(shù)據(jù)庫(kù)名;
CREATE DATABASE IF NOT EXISTS db2;
//1.1.1.3創(chuàng)建數(shù)據(jù)庫(kù)并指定字符集(編碼表)
//數(shù)據(jù)庫(kù)安裝的時(shí)候默認(rèn)使用的是UTF形式(萬(wàn)國(guó)形式)的榔组,gdk是TUF8的一個(gè)子集嚼沿,屬于中國(guó)的,包含大多數(shù)漢字瓷患。
CREATE DATABASE 數(shù)據(jù)庫(kù)名 CHARACTER SET 字符集;
CREATE DATABASE db3 CHARACTER SET gbk;
1.1.2修改數(shù)據(jù)庫(kù)
//修改數(shù)據(jù)庫(kù)字符集格式
ALTER DATABASE 數(shù)據(jù)庫(kù)名 DEFAULT CHARACTER SET 字符集;
//將db3數(shù)據(jù)庫(kù)的字符集改成utf8
ALTER DATABASE db3 DEFAULT CHARACTER SET utf8;
1.1.3刪除數(shù)據(jù)庫(kù)
DROP DATABASE 數(shù)據(jù)庫(kù)名;
DROP DATABASE db2;
1.1.4使用數(shù)據(jù)庫(kù)
//1.1.4.1查看正在使用的數(shù)據(jù)庫(kù):
SELECT DATABASE();
//1.1.4.2使用/切換數(shù)據(jù)庫(kù):
USE 數(shù)據(jù)庫(kù)名;
USE db1;
1.2DDL語(yǔ)句操作表 >前提先使用某個(gè)數(shù)據(jù)庫(kù)
1.2.1創(chuàng)建表
CREATE TABLE 表名 (字段名1 字段類(lèi)型1, 字段名2 字段類(lèi)型2…);
CREATE TABLE 表名 (
字段名1 字段類(lèi)型1,
字段名2 字段類(lèi)型2
);
//創(chuàng)建student表包含id,name,birthday字段
CREATE TABLE student (
id INT,
name VARCHAR(20),
birthday DATE
);
1.2.2查看表
SHOW TABLES;
//查看表結(jié)構(gòu)
DESC 表名;
//查看創(chuàng)建表:
SHOW CREATE TABLE 表名;
//快速創(chuàng)建一個(gè)表結(jié)構(gòu)相同的表
CREATE TABLE 新表名 LIKE 舊表名;
1.2.3刪除表
//直接刪除表:
DROP TABLE 表名;
//判斷表是否存在并刪除表:
DROP TABLE IF EXISTS 表名;
1.2.4修改表(修改表結(jié)構(gòu)使用不是很頻繁骡尽,只需要了解,等需要使用的時(shí)候再回來(lái)查即可)
//1.2.4.1添加表列:
ALTER TABLE 表名 ADD 列名 類(lèi)型;
//為學(xué)生表添加一個(gè)新的字段remark,類(lèi)型為varchar(20)
ALTER TABLE student ADD remark VARCHAR(20);
//1.2.4.2修改列類(lèi)型
ALTER TABLE 表名 MODIFY列名 新的類(lèi)型;
//將student表中的remark字段的改成varchar(100)
ALTER TABLE student MODIFY remark VARCHAR(100);
//1.2.4.3修改列名
ALTER TABLE 表名 CHANGE 舊列名 新列名 類(lèi)型;
//將student表中的remark字段名改成intro擅编,類(lèi)型varchar(30)
ALTER TABLE student CHANGE remark intro varchar(30);
//1.2.4.4刪除列
ALTER TABLE 表名 DROP 列名;
//刪除student表中的字段intro
ALTER TABLE student DROP intro;
//1.2.4.5修改表名
RENAME TABLE 表名 TO 新表名;
//將學(xué)生表student改名成student2
RENAME TABLE student TO student2;
1.2.4.6修改字符集
ALTER TABLE 表名 character set 字符集;
//將sutden2表的編碼修改成gbk
ALTER TABLE student2 character set gbk;
2.DML(Data Query Language)語(yǔ)句
INSERT INTO 表名 //表示往哪張表中添加數(shù)據(jù)
(字段名1, 字段名2, …) //要給哪些字段設(shè)置值
VALUES (值1, 值2, …); //設(shè)置具體的值
注意:
值與字段必須對(duì)應(yīng)攀细,個(gè)數(shù)相同,類(lèi)型相同
值的數(shù)據(jù)大小必須在字段的長(zhǎng)度范圍內(nèi)
除了數(shù)值類(lèi)型外爱态,其它的字段類(lèi)型的值必須使用引號(hào)引起谭贪。(建議單引號(hào))
如果要插入空值,可以不寫(xiě)字段锦担,或者插入null
2.1插入全部字段
//所有的字段名都寫(xiě)出來(lái)
INSERT INTO 表名 (字段名1, 字段名2, 字段名3…) VALUES (值1, 值2, 值3);
//向表中插入所有字段俭识,所有的字段名都寫(xiě)出來(lái)
INSERT INTO student(id,name,age,sex,address,phone,birthday,math,english)values(2,'小美',18,'女','上海市','18888888888','2011-12-12',65.5,99.2);
//不寫(xiě)字段名
INSERT INTO 表名 VALUES (值1, 值2, 值3…);
2.2插入部分?jǐn)?shù)據(jù)
//沒(méi)有添加數(shù)據(jù)的字段會(huì)使用NULL
INSERT INTO 表名 (字段名1, 字段名2, ...) VALUES (值1, 值2, ...);
INSERT INTO student (id,name,age,sex,address)values(1,'張三',19,'男','北京市');
//不寫(xiě)字段名
INSERT INTO student values(3,'小明',27,'男','深圳市','13333333333','2000-11-06',95.5,92);
2.3蠕蟲(chóng)復(fù)制:在已有的數(shù)據(jù)基礎(chǔ)之上,將原來(lái)的數(shù)據(jù)進(jìn)行復(fù)制洞渔,插入到對(duì)應(yīng)的表中
//將表名2中的數(shù)據(jù)復(fù)制到表名1中
INSERT INTO 表名1 SELECT * FROM 表名2;
//將student表中的數(shù)據(jù)添加到student2表中
INSERT INTO student SELECT * FROM student2;
//如果只想復(fù)制student表中name,age字段數(shù)據(jù)到student2表中使用如下格式
INSERT INTO student2(name,age) SELECT name,age FROM student;
2.4更新表記錄
//不帶條件修改數(shù)據(jù)
UPDATE 表名 SET 字段名=值;
//帶條件修改數(shù)據(jù)
UPDATE 表名 SET 字段名=值 WHERE 字段名=值;
//不帶條件修改數(shù)據(jù)套媚,將所有的性別改成女
UPDATE student SET sex='女';
//帶條件修改數(shù)據(jù),將id號(hào)為2的學(xué)生性別改成男
UPDATE student SET sex='男' WHERE id=2;
//一次修改多個(gè)列磁椒,把id為3的學(xué)生堤瘤,年齡改成26歲,address改成北京
UPDATE student SET age=26, address='北京' WHERE id=3;
2.5刪除表記錄
//不帶條件刪除數(shù)據(jù)
DELETE FROM 表名;
//帶條件刪除數(shù)據(jù)
DELETE FROM 表名 WHERE 字段名=值;
//帶條件刪除數(shù)據(jù)浆熔,刪除id為3的記錄
DELETE FROM student WHERE id=3;
//不帶條件刪除數(shù)據(jù),刪除表中的所有數(shù)據(jù)
DELETE FROM student;
truncate刪除表記錄
TRUNCATE TABLE 表名;
truncate和delete的區(qū)別
delete是將表中的數(shù)據(jù)一條一條刪除
truncate是將整個(gè)表摧毀本辐,重新創(chuàng)建一個(gè)新的表,新的表結(jié)構(gòu)和原來(lái)表結(jié)構(gòu)一模一樣
3.DQL(Data Query Language)語(yǔ)句
3.1查詢(xún)表所有數(shù)據(jù)
SELECT * FROM 表名;
SELECT * FROM student;
3.2查詢(xún)指定列
SELECT 字段名1, 字段名2, 字段名3, ... FROM 表名;
SELECT id,name,age,sex,address,phone,birthday,math,english FROM student;
3.3別名查詢(xún)
//查詢(xún)時(shí)給列、表指定別名需要使用AS關(guān)鍵字
//使用別名的好處是方便觀看和處理查詢(xún)到的數(shù)據(jù)
//注意:AS可以省略不寫(xiě)
SELECT 字段名1 AS 別名, 字段名2 AS 別名... FROM 表名;
//查詢(xún)sudent表中name 和 age 列医增,name列的別名為”姓名”慎皱,age列的別名為”年齡”:
SELECT NAME AS 姓名, age AS 年齡 FROM student;
3.4清除重復(fù)值
//查詢(xún)指定列并且結(jié)果不出現(xiàn)重復(fù)數(shù)據(jù)
SELECT DISTINCT 字段名 FROM 表名;
//查詢(xún)name,age列并且結(jié)果不出現(xiàn)重復(fù)name:
SELECT DISTINCT NAME, age FROM student;
3.5查詢(xún)結(jié)果參與運(yùn)算
參與運(yùn)算的必須是數(shù)值類(lèi)型
//某列數(shù)據(jù)和固定值運(yùn)算:
SELECT 列名1 + 固定值 FROM 表名;
//某列數(shù)據(jù)和其他列數(shù)據(jù)參與運(yùn)算:
SELECT 列名1 + 列名2 FROM 表名;
//查詢(xún)math + english的和
SELECT math + english FROM student;
//查詢(xún)math + english的和使用別名”總成績(jī)”
SELECT math + english 總成績(jī) FROM student;
//查詢(xún)所有列與math + english的和并使用別名”總成績(jī)”
SELECT *, math + english 總成績(jī) FROM student;
查詢(xún)姓名叶骨、年齡茫多,將每個(gè)人的年齡增加10歲
SELECT name, age + 10 FROM student;
3.6條件查詢(xún)
//查詢(xún)攻擊大于350的英雄
SELECT * FROM hero where attack>350;
//查詢(xún)不是熱門(mén)的英雄 1:熱門(mén) 0:非熱門(mén)
SELECT * FROM hero WHERE is_hot<>1; SELECT * FROM hero WHERE is_hot!=1;
3.7 邏輯查詢(xún)
//查詢(xún)id是1或3或5的英雄
SELECT * FROM hero WHERE id=1 OR id=3 OR id=5;
3.8 in關(guān)鍵字
in里面的每個(gè)數(shù)據(jù)都會(huì)作為一次條件地梨,只要滿(mǎn)足條件的就會(huì)顯示
//語(yǔ)法格式
SELECT 字段名 FROM 表名 WHERE 字段 in (數(shù)據(jù)1, 數(shù)據(jù)2...);
//查詢(xún)id是1或3或5的英雄
SELECT * FROM hero WHERE id in(1,3,5);
//查詢(xún)id不是1或3或5的英雄
SELECT * FROM hero WHERE id not in(1,3,5);
3.9范圍查詢(xún)
BETWEEN 值1 AND 值2 表示從值1到值2范圍,包頭又包尾
//查詢(xún)英雄上架日期大于等于2013-01-01小于等于2017-01-01之間的英雄
SELECT * FROM hero WHERE grounding_date BETWEEN '2013-01-01' AND '2017-01-01';
SELECT * FROM hero WHERE grounding_date >='2013-01-01' AND grounding_date<='2017-01-01';
3.10模糊查詢(xún)
MySQL通配符有兩個(gè):
%: 表示0個(gè)或多個(gè)字符(任意個(gè)字符)
_: 表示一個(gè)字符
//LIKE表示模糊查詢(xún)
SELECT * FROM 表名 WHERE 字段名 LIKE '通配符字符串';
//查詢(xún)姓孫的英雄
SELECT * FROM hero WHERE name LIKE '孫%';
//查詢(xún)姓名中包含’孫’字的英雄
SELECT * FROM hero WHERE name LIKE '%孫%';
//查詢(xún)姓孫缔恳,且姓名有三個(gè)字的英雄
SELECT * FROM hero WHERE name LIKE '孫__';
3.11排序查詢(xún)
通過(guò)ORDER BY子句宝剖,可以將查詢(xún)出的結(jié)果進(jìn)行排序(排序只是顯示方式,不會(huì)影響數(shù)據(jù)庫(kù)中數(shù)據(jù)的順序)
ASC: 升序, 默認(rèn)是升序
DESC: 降序
SELECT 字段名 FROM 表名 WHERE 字段=值 ORDER BY 字段名 [ASC|DESC];
單列排序
//查詢(xún)年齡小于等于35歲的英雄歉甚,按照年齡升序排列
SELECT * FROM hero WHERE age<=35 ORDER BY age ASC;
組合排序:組合排序就是先按第一個(gè)字段進(jìn)行排序万细,如果第一個(gè)字段相同,才按第二個(gè)字段進(jìn)行排序纸泄,依次類(lèi)推赖钞。
//查詢(xún)年齡小于等于35歲的英雄,按照年齡升序排列聘裁,如果年齡相同按照生命的降序排列
SELECT * FROM hero WHERE age<=35 ORDER BY age ASC,life desc;
3.12聚合函數(shù)
之前我們做的查詢(xún)都是橫向查詢(xún)雪营,它們都是根據(jù)條件一行一行的進(jìn)行判斷,而使用聚合函數(shù)查詢(xún)是縱向查詢(xún)衡便,它是對(duì)一列的值進(jìn)行計(jì)算献起,然后返回一個(gè)結(jié)果值。另外聚合函數(shù)會(huì)忽略空值.
五個(gè)聚合函數(shù):
count: 統(tǒng)計(jì)指定列記錄數(shù)镣陕,記錄為NULL的不統(tǒng)計(jì)
sum: 計(jì)算指定列的數(shù)值和谴餐,如果不是數(shù)值類(lèi)型,那么計(jì)算結(jié)果為0
max: 計(jì)算指定列的最大值
min: 計(jì)算指定列的最小值
avg: 計(jì)算指定列的平均值呆抑,如果不是數(shù)值類(lèi)型岂嗓,那么計(jì)算結(jié)果為0
聚合函數(shù)的使用:寫(xiě)在 SQL語(yǔ)句SELECT后 字段名的地方
SELECT 字段名... FROM 表名;
SELECT COUNT(age) FROM 表名;
//查詢(xún)英雄總數(shù)
SELECT COUNT(max_score) FROM hero //我們發(fā)現(xiàn)對(duì)于NULL的記錄不會(huì)統(tǒng)計(jì)
//只要使用全部字段作為衡量標(biāo)準(zhǔn)既不會(huì)有遺漏的錯(cuò)誤統(tǒng)計(jì)出現(xiàn)
SELECT COUNT(*) FROM hero
//查詢(xún)年齡大于40的總數(shù)
SELECT COUNT(*) FROM hero WHERE age>35;
//查詢(xún)所用英雄的總評(píng)分
SELECT SUM(max_score) FROM hero
//查詢(xún)英雄評(píng)分的平均分
SELECT AVG(max_score) FROM hero
查詢(xún)英雄評(píng)分的最高分
SELECT MAX(max_score) FROM hero
3.13分組
分組查詢(xún)是指使用 GROUP BY語(yǔ)句對(duì)查詢(xún)信息進(jìn)行分組,相同數(shù)據(jù)作為一組
GROUP BY怎么分組的鹊碍?將分組字段結(jié)果中相同內(nèi)容作為一組
SELECT 字段1,字段2... FROM 表名 GROUP BY 分組字段 [HAVING 條件];
//這句話會(huì)將sex相同的數(shù)據(jù)作為一組厌殉,但是會(huì)返回每組的第一條,沒(méi)有任何意義
SELECT * FROM hero GROUP BY sex;
分組的目的就是為了統(tǒng)計(jì)侈咕,一般分組會(huì)跟聚合函數(shù)一起使用年枕。
分組后聚合函數(shù)不是操作所有數(shù)據(jù),而是操作一組數(shù)據(jù)乎完。
SELECT SUM(life) FROM hero GROUP BY sex
//查詢(xún)年齡大于25歲的人,按性別分組,統(tǒng)計(jì)每組的人數(shù),并只顯示性別人數(shù)大于2的數(shù)據(jù)
//并只顯示性別人數(shù)>2的數(shù)據(jù)屬于分組后的條件,對(duì)于分組后的條件需要使用having子句
SELECT sex,count(*) FROM hero WHERE age<30 GROUP BY sex HAVING COUNT(*)>2;
having與where的區(qū)別
- having是在分組后對(duì)數(shù)據(jù)進(jìn)行過(guò)濾.
- where是在分組前對(duì)數(shù)據(jù)進(jìn)行過(guò)濾
- having后面可以使用聚合函數(shù)
- where后面不可以使用聚合函數(shù)
3.4 LIMIT語(yǔ)句
LIMIT是限制的意思熏兄,所以LIMIT的作用就是限制查詢(xún)記錄的條數(shù)。
LIMIT語(yǔ)法格式:
LIMIT offset,length; 或者limit length;
offset是指偏移量树姨,可以認(rèn)為是跳過(guò)的記錄數(shù)量摩桶,默認(rèn)為0
length是指需要顯示的總記錄數(shù)
SELECT *|字段列表 [as 別名] FROM 表名 [WHERE子句] [GROUP BY子句][HAVING子句][ORDER BY子句][LIMIT子句];
//查詢(xún)hero表中數(shù)據(jù),從第三條開(kāi)始顯示帽揪,顯示6條
SELECT * FROM student3 LIMIT 2,6;
LIMIT的使用場(chǎng)景:分頁(yè)
每頁(yè)顯示5條
//-- 第一頁(yè): LIMIT 0,5; 跳過(guò)0條硝清,顯示5條
//-- 第二頁(yè): LIMIT 5,5; 跳過(guò)5條,顯示5條
//-- 第三頁(yè): LIMIT 10,5; 跳過(guò)10條转晰,顯示5條
SELECT * FROM hero LIMIT 0,5;
SELECT * FROM hero LIMIT 5,5;
SELECT * FROM hero LIMIT 10,5;
注意:
如果第一個(gè)參數(shù)是0可以簡(jiǎn)寫(xiě):
SELECT * FROM student3 LIMIT 0,5;
SELECT * FROM student3 LIMIT 5;
LIMIT 10芦拿,5; – 不夠5條士飒,有多少顯示多少
4.DCL語(yǔ)句
4.1
數(shù)據(jù)約束
對(duì)表中的數(shù)據(jù)進(jìn)行進(jìn)一步的限制,保證數(shù)據(jù)的正確性蔗崎、有效性和完整性酵幕。
約束種類(lèi):
- PRIMARY KEY: 主鍵
- UNIQUE: 唯一
- NOT NULL: 非空
- DEFAULT: 默認(rèn)
- FOREIGN KEY: 外鍵
1主鍵約束 PRIMARY KEY
1.1主鍵的特點(diǎn)
- 主鍵必須包含唯一的值
- 主鍵列不能包含NULL值
1.2主鍵的作用
用來(lái)唯一標(biāo)識(shí)一條記錄,每個(gè)表都應(yīng)該有一個(gè)主鍵缓苛,并且每個(gè)表只能有一個(gè)主鍵芳撒。
1.3哪個(gè)字段應(yīng)該作為表的主鍵?
通常不用業(yè)務(wù)字段作為主鍵未桥,單獨(dú)給每張表設(shè)計(jì)一個(gè)id的字段笔刹,把id作為主鍵。主鍵是給數(shù)據(jù)庫(kù)和程序使用的冬耿,不是給最終的客戶(hù)使用的舌菜。所以主鍵有沒(méi)有含義沒(méi)有關(guān)系,只要不重復(fù)亦镶,非空就行酷师。
1.4創(chuàng)建主鍵:
在創(chuàng)建表的時(shí)候給字段添加主鍵
字段名 字段類(lèi)型 PRIMARY KEY
//創(chuàng)建英雄表hero1, 包含字段(id, name, age)將id做為主鍵
CREATE TABLE hero1(
id int PRIMARY Key,
name varchar(20),
age int);
1.5刪除主鍵:
ALTER TABLE 表名 DROP PRIMARY KEY;
//刪除hero1表的主鍵
ALTER TABLE hero1 DROP PRIMARY KEY;
1.5自增主鍵:
主鍵如果讓我們自己添加很有可能重復(fù),我們通常希望在每次插入新記錄時(shí),數(shù)據(jù)庫(kù)自動(dòng)生成主鍵字段的值
AUTO_INCREMENT 表示自動(dòng)增長(zhǎng)(字段類(lèi)型必須是整數(shù)類(lèi)型)
創(chuàng)建英雄表hero2, 包含字段(id, name, age)將id做為主鍵并自動(dòng)增長(zhǎng)
CREATE TABLE hero2(
id int PRIMARY Key AUTO_INCREMENT,
name varchar(20),
age int
);
默認(rèn)地AUTO_INCREMENT 的開(kāi)始值是1,如果希望修改起始值,請(qǐng)使用下列SQL語(yǔ)法:
ALTER TABLE 表名 AUTO_INCREMENT=起始值;
DELETE和TRUNCATE的區(qū)別
DELETE 刪除表中的數(shù)據(jù)染乌,但不重置AUTO_INCREMENT的值山孔。
TRUNCATE 摧毀表,重建表荷憋,AUTO_INCREMENT重置為1
2唯一約束 UNIQUE
2.1唯一約束的特點(diǎn)
在這張表中這個(gè)字段的值不能重復(fù)
2.2 唯一約束的基本格式
字段名 字段類(lèi)型 UNIQUE
2.3 創(chuàng)建唯一約束
//創(chuàng)建英雄表hero3, 包含字段(id, name),name這一列設(shè)置唯一約束,不能出現(xiàn)同名的英雄
CREATE TABLE hero3 (
id INT,
NAME VARCHAR(20) UNIQUE
);
3非空約束 NOT NULL
這個(gè)字段必須設(shè)置值,不能是NULL
3.1創(chuàng)建非空約束
字段名 字段類(lèi)型 NOT NULL
//創(chuàng)建表英雄表hero4, 包含字段(id,name,gender)其中name不能為NULL
CREATE TABLE hero4 (
id INT,
NAME VARCHAR(20) NOT NULL,
gender CHAR(2)
);
4默認(rèn)值約束 DEFAULT
往表中添加數(shù)據(jù)時(shí),如果不指定這個(gè)字段的數(shù)據(jù),就使用默認(rèn)值
3.1創(chuàng)建默認(rèn)值約束
字段名 字段類(lèi)型 DEFAULT 默認(rèn)值
//創(chuàng)建一個(gè)英雄表 hero5台颠,包含字段(id,name,location), 默認(rèn)的定位是射手
CREATE TABLE hero5 (
id INT,
NAME VARCHAR(20),
location VARCHAR(50) DEFAULT '射手'
);
//添加一條記錄,使用默認(rèn)值
INSERT INTO hero5 (id, NAME) VALUES (1, '后羿');
//添加一條記錄,不使用默認(rèn)地址
INSERT INTO hero5 VALUES (2, '蘭陵王', '刺客');