mySQL學(xué)習(xí)記錄

基礎(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ù)的安全性和完整性。

數(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

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ù)
image.png

表:

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);
image.png

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;
查詢(xún)所有列與math + english的和并使用別名”總成績(jī)”
查詢(xún)姓名、年齡邓萨,將每個(gè)人的年齡增加10歲

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
image.png
//查詢(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, '蘭陵王', '刺客');
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末勒庄,一起剝皮案震驚了整個(gè)濱河市串前,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌实蔽,老刑警劉巖荡碾,帶你破解...
    沈念sama閱讀 207,248評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異局装,居然都是意外死亡坛吁,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門(mén)铐尚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)拨脉,“玉大人,你說(shuō)我怎么就攤上這事宣增∶蛋颍” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,443評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵爹脾,是天一觀的道長(zhǎng)帖旨。 經(jīng)常有香客問(wèn)我箕昭,道長(zhǎng),這世上最難降的妖魔是什么解阅? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,475評(píng)論 1 279
  • 正文 為了忘掉前任落竹,我火速辦了婚禮,結(jié)果婚禮上瓮钥,老公的妹妹穿的比我還像新娘。我一直安慰自己烹吵,他們只是感情好碉熄,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著肋拔,像睡著了一般锈津。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上凉蜂,一...
    開(kāi)封第一講書(shū)人閱讀 49,185評(píng)論 1 284
  • 那天琼梆,我揣著相機(jī)與錄音,去河邊找鬼窿吩。 笑死茎杂,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的纫雁。 我是一名探鬼主播煌往,決...
    沈念sama閱讀 38,451評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼轧邪!你這毒婦竟也來(lái)了刽脖?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,112評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤忌愚,失蹤者是張志新(化名)和其女友劉穎曲管,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體硕糊,經(jīng)...
    沈念sama閱讀 43,609評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡院水,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了简十。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片衙耕。...
    茶點(diǎn)故事閱讀 38,163評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖勺远,靈堂內(nèi)的尸體忽然破棺而出橙喘,到底是詐尸還是另有隱情,我是刑警寧澤胶逢,帶...
    沈念sama閱讀 33,803評(píng)論 4 323
  • 正文 年R本政府宣布厅瞎,位于F島的核電站饰潜,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏和簸。R本人自食惡果不足惜彭雾,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望锁保。 院中可真熱鬧薯酝,春花似錦、人聲如沸爽柒。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,357評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)浩村。三九已至做葵,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間心墅,已是汗流浹背酿矢。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,590評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留怎燥,地道東北人瘫筐。 一個(gè)月前我還...
    沈念sama閱讀 45,636評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像铐姚,于是被迫代替她去往敵國(guó)和親严肪。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容