SQL的分類
DDL: 數(shù)據(jù)定義語言
DML: 數(shù)據(jù)操作語言
DQL: 數(shù)據(jù)查詢語言
DCL: 數(shù)據(jù)控制語言
DTL: 事務(wù)處理語言
創(chuàng)建數(shù)據(jù)庫
創(chuàng)建數(shù)據(jù)庫 create database databaseName(數(shù)據(jù)庫名字);
查詢數(shù)據(jù)庫 show databases;
刪除數(shù)據(jù)庫 drop database databaseName;
使用數(shù)據(jù)庫 use databaseName;
show create database databaseName 創(chuàng)建數(shù)據(jù)庫的一個(gè)簡要描述哈踱,可以看到數(shù)據(jù)庫的默認(rèn)字符集
創(chuàng)建表格
create table 表名(字段名 數(shù)據(jù)類型, 字段名 數(shù)據(jù)類型); 創(chuàng)建數(shù)據(jù)表的方式
創(chuàng)建表格 create table tablename(id int not null auto_increment primary key,name varchar(20));
--id自增--
drop table tableName; 刪除數(shù)據(jù)表格
desc tableName; 可以查看表的詳細(xì)信息
show create table tableName 創(chuàng)建數(shù)據(jù)表格的一個(gè)簡要描述开镣,可以看到數(shù)據(jù)表格的默認(rèn)存儲(chǔ)引擎和字符集
例如:
create table stuInfo(
#字段名 字段數(shù)據(jù)類型
#學(xué)生ID
stuId int,
#姓名 varchar(30) char(30)
#varchar是一個(gè)可變長數(shù)據(jù)
stuName varchar(30),
#性別 tinyint 1個(gè)字節(jié)
stuGender tinyint,
#年齡 tinyint 1個(gè)字節(jié)邪财,保存年齡足夠
stuAge tinyint
);
修改默認(rèn)存儲(chǔ)引擎和字符集的方式
方式1:
engine=MyISAM default charset=GBK;
例如:
create table test (
name varchar(15),
age int
)engine=MyISAM default charset=GBK;
方式2:
修改數(shù)據(jù)的配置文件质欲,一處修改嘶伟,處處可用
my.ini
文件位置:
C:\ProgramData\MySQL\MySQL Server 5.7\my.ini
備注:ProgramData該文件夾是一個(gè)隱藏文件,需要開始系統(tǒng)的顯示隱藏文件夾
大約在98 ~ 103
- show character set; 查看當(dāng)前MySQL支持的所有字符集
- show engines; 查看當(dāng)前MySQL支持的所有存儲(chǔ)引擎
修改表 alter
添加新字段
alter table tableName add xinxi text;
alter table tableName add name int after age;(在年齡后添加新字段name)
修改老字段的數(shù)據(jù)類型
alter table tableName modify name char(29);
刪除已有字段
alter table tableName drop age;
刪除table數(shù)據(jù)
delete from tableName;
delete from tableName where name="張三";
truncate table stuInfo;
JⅥ7哒ā5粞佟7镅Α缤苫!慎用,小心從刪除到跑路哈哈
修改已有字段的字段名和數(shù)據(jù)類型
alte table tableName change name mingZi char(30);#(數(shù)據(jù)庫不區(qū)分大小寫)把字段name改為mingZi 并修改數(shù)據(jù)類型為char(30)
插入數(shù)據(jù)
#按照數(shù)據(jù)庫字段順序插入一條完整的數(shù)據(jù)
insert into tableName(Id, name,sex, age)
values(1, "張三", '男', 16);插入的時(shí)候要求順序一致
#選中一些字段添加數(shù)據(jù) 剩余數(shù)據(jù)會(huì)按照默認(rèn)值處理
insert into tableName(Id, name) values(2, "李四");
#不需要指定字段名墅拭,但是要求插入的數(shù)據(jù)是和字段順序一致
insert into tableName values(3, "王五", '男', 50);
查詢數(shù)據(jù)
select * from tableName;
暫時(shí)可以使用谍婉,但是在實(shí)際的開發(fā)場景中,不會(huì)這么使用镀迂,會(huì)按照業(yè)務(wù)的需求唤蔗,盡量少的查詢數(shù)據(jù)
實(shí)際上:
select 字段1, 字段2 from 表名;
從指定的數(shù)據(jù)表中妓柜,獲取指定字段的信息
select 字段 from 表名 where 條件;
從指定的數(shù)據(jù)表中,獲取指定的字段信息藏雏,但是有條件限制
select distinct 字段 from 表名;
從指定的數(shù)據(jù)表中塌衰,獲取指定的字段信息,但是會(huì)過濾掉重復(fù)信息
MySQL常用數(shù)據(jù)類型
- 數(shù)值類:tinyint杯巨,int服爷,float获诈, double
- 文本類:text,tinytext笼踩,longtext
-
時(shí)間:date亡嫌,timestamp 時(shí)間戳, 默認(rèn)可以設(shè)置current_timestamp于购,這樣可以幫助我們記錄當(dāng)前時(shí)間
例如:用戶的登錄時(shí)間,用戶注冊時(shí)間斑胜,訂單生成時(shí)間 - 二進(jìn)制:blob
數(shù)據(jù)庫大文件處理方法
一般情況下:圖片嫌吠,視頻居兆,大體積文本竹伸,一般不會(huì)直接保存到數(shù)據(jù)庫,這樣過多的占用數(shù)據(jù)庫的空間會(huì)降低數(shù)據(jù)庫的使用效率吧享,通常是采用一下方法:
1.視頻上傳到服務(wù)器
2.服務(wù)器接受到視頻譬嚣。放到服務(wù)器指定的保存視頻的文件夾下
3.保存時(shí)會(huì)給視頻按照時(shí)間和隨機(jī)數(shù)關(guān)系給視頻重新命名拜银,防止同一個(gè)文件名存在
4.將保存視頻文件的服務(wù)器地址,放入到數(shù)據(jù)庫中
5.之后就可以通過數(shù)據(jù)庫操灿,查詢到視頻地址泵督,通過地址直接訪問
MySQL四中數(shù)據(jù)類型:布爾類型小腊、微整形、枚舉類型本缠、集合類型
- 布爾類型
MySQL數(shù)據(jù)庫數(shù)據(jù)類型分類中確實(shí)存在布爾類型入问,但是MySQL數(shù)據(jù)庫并沒有真正實(shí)現(xiàn)布爾類型,而是借助微整型的方式實(shí)現(xiàn)峻村,并且創(chuàng)建數(shù)據(jù)庫表結(jié)構(gòu)的時(shí)候锡凝,即使字段定義屬性設(shè)置為布爾類型BOOL或布爾類型BOOLEAN,都會(huì)被默認(rèn)改寫成TINYINT
MySQL數(shù)據(jù)庫產(chǎn)品沒有真正實(shí)現(xiàn)對布爾類型的支持张肾,建議大家不要使用MySQL布爾類型BOOL或布爾類型BOOLEAN吞瞪,而是使用數(shù)據(jù)庫類型微整型TINYINT替代驾孔。
-
enum:枚舉
處理互斥的關(guān)系 例如:性別翠勉,籍貫,單選
每一個(gè)選項(xiàng)表示的數(shù)值是從1開始
例如:
create table test(
enumValue('河南', '山西', '福建')
)
河南 對應(yīng)的枚舉值為1
山西 對應(yīng)的枚舉值為2
枚舉優(yōu)點(diǎn):
- MySQL枚舉類型的枚舉元素允許最大65535個(gè)荆虱,基本夠絕大多數(shù)業(yè)務(wù)場景使用朽们;
- 引入枚舉類型數(shù)據(jù)存儲(chǔ)骑脱,有利于縮減數(shù)據(jù)庫存儲(chǔ)數(shù)據(jù)的容量,尤其能達(dá)到減少數(shù)據(jù)庫瓶頸最大的物理IO犁跪,邏輯IO也能減小坷衍,提高主機(jī)的處理能力条舔;
- 引入枚舉類型數(shù)據(jù)存儲(chǔ)孟抗,有利于簡化工程師的代碼復(fù)雜度钻心、工作量铅协,增加代碼的可讀性和可維護(hù)性狐史;
- 可以通過枚舉類型元素值訪問數(shù)據(jù),也可以根據(jù)枚舉類型元素編號進(jìn)行訪問數(shù)據(jù)苍柏;
枚舉缺點(diǎn)
- MySQL數(shù)據(jù)庫枚舉類型的引入试吁,可能給軟件程序的版本發(fā)布楼咳,存在遺忘數(shù)據(jù)庫結(jié)構(gòu)變更的隱患;
- MySQL數(shù)據(jù)庫枚舉類型字段的元素增加治唤,必須以尾部追加的方式,否則影響數(shù)據(jù)庫提供數(shù)據(jù)服務(wù)柜裸;
- 枚舉類型字段不再需要的元素粱锐,也不能進(jìn)行刪除怜浅,否則影響數(shù)據(jù)庫提供數(shù)據(jù)服務(wù);
- MySQL數(shù)據(jù)庫枚舉類型的字段定義屬性元素值搀暑,不能隨意調(diào)整其順序跨琳,否則影響數(shù)據(jù)庫提供數(shù)據(jù)服務(wù)脉让;
數(shù)據(jù)庫枚舉類型是一種有應(yīng)用場景廣泛的數(shù)據(jù)類型功炮,若是拋開網(wǎng)站程序或軟件版本發(fā)布薪伏,可能會(huì)導(dǎo)致開發(fā)工程師與數(shù)據(jù)庫維護(hù)人員之間沒有配合好的問題粗仓,非常推薦大家把枚舉類型引入到生產(chǎn)環(huán)境的數(shù)據(jù)庫應(yīng)用中潦牛,對企業(yè)而言也可以起到節(jié)省人力、物理等成本朴爬。建議大家使用枚舉類型的時(shí)候召噩,盡量把可能需要用到的枚舉元素逸爵,都寫到MySQL數(shù)據(jù)庫表字段的定義屬性中师倔,減少出現(xiàn)漏做DDL變更的故障。
- set:集合
處理并列關(guān)系疲恢,例如:多選
集合優(yōu)點(diǎn):
- 數(shù)據(jù)庫的數(shù)據(jù)存儲(chǔ)容量相應(yīng)縮小瓷胧,利于減少數(shù)據(jù)操縱的邏輯IO和物理IO搓萧;
- 集合類型的數(shù)據(jù)讀取方便瘸洛,可根據(jù)字符串值,也可以根據(jù)字符串集合的順序編號羊精;
- 集合類型字段的定義屬性維護(hù)與其他數(shù)據(jù)類型類似,并不特殊化读规;
- 開發(fā)工程師束亏,不需要借助額外的集合元素編碼表或程序中使用編號替代集合的字符串元素阵具,達(dá)到減少開發(fā)成本阳液、提高代碼的可讀性和可維護(hù)性;
集合缺點(diǎn):
- 集合類型字段的集合元素限制最大為64個(gè)东跪;
- 集合類型字段的定義屬性的集合元素虽填,刪除導(dǎo)致鎖表而影響數(shù)據(jù)服務(wù)提供曹动;
- 集合類型字段的定義屬性的集合元素增加墓陈,只能以尾部追加的方式,若是此特性沒有掌握熬的,則會(huì)導(dǎo)致數(shù)據(jù)服務(wù)提供受影響赊级;
MySQL數(shù)據(jù)庫支持集合類型理逊,對解決一些特殊的業(yè)務(wù)場景提供了非常好的解決方案晋被,經(jīng)典應(yīng)用場景案例:
人才招聘網(wǎng)站的用戶刚盈,設(shè)置工作意向城市一項(xiàng)藕漱,則往往會(huì)選擇1-3個(gè)城市崭闲,甚至更多城市刁俭,采用集合類型字段作為數(shù)據(jù)存儲(chǔ)結(jié)果的話牍戚,將可以大量簡化程序復(fù)雜度虑粥,以及大規(guī)模降低數(shù)據(jù)存儲(chǔ)的容量娩贷,唯一的遺憾則是集合元素限制為64個(gè),會(huì)導(dǎo)致無法滿足招聘網(wǎng)站后期業(yè)務(wù)發(fā)展需要但荤。
電子商務(wù)等行業(yè)特點(diǎn):
- 數(shù)據(jù)分類的種類較多腹躁,往往超過總數(shù)64的限制南蓬;
- 公司或產(chǎn)品開發(fā)維護(hù)的技術(shù)工程師更迭頻繁赘方;
- 電子商務(wù)、招聘網(wǎng)站等行業(yè)的產(chǎn)品運(yùn)營周期長炕淮;
- 多數(shù)公司的軟件程序版本發(fā)布流程不健全涂圆;
- 數(shù)據(jù)庫維護(hù)人員和開發(fā)工程師的工作配合润歉,容易出現(xiàn)信息同步不到位或不周全的情況颈抚;
- 用戶的數(shù)據(jù)安全性和正確性,對企業(yè)非常重要锚赤,往往都是花費(fèi)較貴的推廣費(fèi)用吸引而來的萌朱;
MySQL數(shù)據(jù)庫中采用集合類型存儲(chǔ)數(shù)據(jù)晶疼,生產(chǎn)環(huán)境的網(wǎng)站程序或軟件版本更新發(fā)布時(shí)翠霍,一旦出現(xiàn)數(shù)據(jù)庫維護(hù)人員沒有優(yōu)先更新數(shù)據(jù)庫表字段的定義屬性,則會(huì)導(dǎo)致重大的數(shù)據(jù)丟失事故零如,給企業(yè)造成直接的經(jīng)濟(jì)損失考蕾。
網(wǎng)絡(luò)游戲行業(yè)的特點(diǎn):
- 有大量業(yè)務(wù)是分類不多的數(shù)據(jù)需要存儲(chǔ)(注:往往是幾個(gè)分類肖卧,最多不超過30個(gè)分類)掸鹅;
- 網(wǎng)絡(luò)游戲行業(yè)要求開發(fā)成本降低、開發(fā)速度快等特點(diǎn)葵姥;
- 網(wǎng)絡(luò)游戲公司采用的數(shù)據(jù)庫服務(wù)器的硬件配置差榔幸,甚至單硬盤的主機(jī)支撐多個(gè)數(shù)據(jù)庫提供數(shù)據(jù)服務(wù)牡辽,主機(jī)的存儲(chǔ)空間也有限敞临;
- 網(wǎng)絡(luò)游戲產(chǎn)品的生命周期絕大部分不超過5年挺尿,一般的網(wǎng)絡(luò)游戲產(chǎn)品運(yùn)營1年以上就很少再更新軟件的版本编矾;
網(wǎng)絡(luò)游戲產(chǎn)品使用MySQL數(shù)據(jù)庫集合類型字段存儲(chǔ)業(yè)務(wù)數(shù)據(jù)窄俏,是非常值得推薦的方式蹂匹,對開發(fā)人員而言,跟使用其他數(shù)據(jù)類型是一樣的凹蜈,也無額外學(xué)習(xí)成本限寞,還可以為企業(yè)降低開發(fā)成本、硬件資源成本仰坦。
數(shù)據(jù)庫常用操作
學(xué)生資料與成績查詢
- 創(chuàng)建表
CREATE TABLE student (
id INT(10) NOT NULL UNIQUE PRIMARY KEY ,
name VARCHAR(20) NOT NULL ,
sex VARCHAR(4) ,
birth YEAR,
department VARCHAR(20) ,
address VARCHAR(50)
);
向student表插入記錄的INSERT語句如下:
INSERT INTO student VALUES( 901,'張老大', '男',1985,'計(jì)算機(jī)系', '北京市海淀區(qū)');
INSERT INTO student VALUES( 902,'張老二', '男',1986,'中文系', '北京市昌平區(qū)');
INSERT INTO student VALUES( 903,'張三', '女',1990,'中文系', '湖南省永州市');
INSERT INTO student VALUES( 904,'李四', '男',1990,'英語系', '遼寧省阜新市');
INSERT INTO student VALUES( 905,'王五', '女',1991,'英語系', '福建省廈門市');
INSERT INTO student VALUES( 906,'王六', '男',1988,'計(jì)算機(jī)系', '湖南省衡陽市');
CREATE TABLE score (
id INT(10) NOT NULL UNIQUE PRIMARY KEY AUTO_INCREMENT ,
stu_id INT(10) NOT NULL ,
c_name VARCHAR(20) ,
grade INT(10)
);
向score表插入記錄的INSERT語句如下:
INSERT INTO score VALUES(NULL,901, '計(jì)算機(jī)',98);
INSERT INTO score VALUES(NULL,901, '英語', 80);
INSERT INTO score VALUES(NULL,902, '計(jì)算機(jī)',65);
INSERT INTO score VALUES(NULL,902, '中文',88);
INSERT INTO score VALUES(NULL,903, '中文',95);
INSERT INTO score VALUES(NULL,904, '計(jì)算機(jī)',70);
INSERT INTO score VALUES(NULL,904, '英語',92);
INSERT INTO score VALUES(NULL,905, '英語',94);
INSERT INTO score VALUES(NULL,906, '計(jì)算機(jī)',90);
INSERT INTO score VALUES(NULL,906, '英語',85);
-
查詢所有記錄
SELECT * FROM student
SELECT * FROM score
-
查詢student表的第2條到4條記錄
SELECT * FROM student LIMIT 1,3;
-
從student表查詢所有學(xué)生的學(xué)號(id)履植、姓名(name)和院系(department)的信息
SELECT id,name,department FROM student;
-
從student表中查詢計(jì)算機(jī)系和英語系的學(xué)生的信息
SELECT * FROM student WHERE department IN ('計(jì)算機(jī)系','英語系');
- 從student表中查詢年齡18~22歲的學(xué)生信息
SELECT id,name,sex,2013-birth AS age,department,address
FROM student
WHERE year(now())-birth BETWEEN 22 AND 30;
SELECT id,name,sex,2013birth AS age,department,address
FROM student
WHERE 2018-birth>=22 AND 2018-birth<=30;
-查詢每個(gè)院系有多少人
SELECT department,COUNT(id) FROM student GROUP BY department;
- 查詢每個(gè)科目的最高分
SELECT c_name,MAX(grade) FROM score GROUP BY c_name;
- 查詢李四的考試科目(c_name)和考試成績(grade)
SELECT c_name,grade FROM score WHERE
stu_id=(SELECT id FROM student WHERE name='李四');
- 所有學(xué)生的信息和考試信息
SELECT student.id,name,sex,birth,department,address,c_name,grade
FROM student,score
WHERE student.id=stu_id;
- 計(jì)算每個(gè)學(xué)生的總成績
SELECT student.id,name,department SUM(grade) FROM student,score
WHERE student.id=stu_id
GROUP BY id;
-- GROUP BY name;
- 計(jì)算每個(gè)考試科目的平均成績
SELECT c_name,AVG(grade) FROM score GROUP BY c_name;
- 查詢計(jì)算機(jī)成績低于95的學(xué)生信息
SELECT*FROMstudent
WHEREid IN (
SELECT stu_id FROM score WHERE c_name = '計(jì)算機(jī)' AND grade < 95);
- 查詢同時(shí)參加計(jì)算機(jī)和英語考試的學(xué)生的信息
SELECT * FROM student WHERE id IN(
SELECT stu_id FROM score
WHERE c_name='英語' AND stu_id IN(
SELECT stu_id FROM score WHERE c_name='計(jì)算機(jī)')
);
- 將計(jì)算機(jī)考試成績按從高到低進(jìn)行排序
SELECT stu_id,grade FROM score WHERE c_name='計(jì)算機(jī)'
ORDER BY grade DESC;
- 查詢姓張或者姓王的同學(xué)的姓名悄晃、院系和考試科目及成績
SELECT name,department,c_name,grade FROM student,score
WHERE (name LIKE '張%' OR '王%')
AND student.id=stu_id;
- 查詢都是湖南的學(xué)生的姓名玫霎、年齡、院系和考試科目及成績
SELECT student.id,name,department,c_name,grade FROM student,score
WHERE address LIKE '湖南%' AND stu.id=student.id;
``
#未完待續(xù)妈橄。庶近。。眷蚓。鼻种。。溪椎。普舆。