MySQL和SQL
MySQL,一個關系型數(shù)據(jù)庫管理系統(tǒng),用來持久化保存數(shù)據(jù)。SQL,結構化查詢語言,通過SQL可以操作數(shù)據(jù)庫。
SQL語句分類:
- DDL,數(shù)據(jù)定義語言(Data Definition Language),用來操作數(shù)據(jù)庫、操作表;
- DML,數(shù)據(jù)操縱語言(Data Manipulation Language),用來操作表中的記錄——增、刪、改;
- DQL,數(shù)據(jù)查詢語言(Data Query Language),用來操作表中的記錄——查;
- DCL,數(shù)據(jù)控制語言(Data Control Language),用來對用戶權限進行設置。
SQL的數(shù)據(jù)類型
- 數(shù)值類型
分類 | 大小 | 范圍 | 格式 | 用途 |
---|---|---|---|---|
TINYINT | 1bytes | (-128, 127) | (0, 255) | 小整數(shù)值 |
SMALLINT | 2bytes | (-32 768,32 767) | (0,65 535) | 大整數(shù)值 |
MEDIUMINT | 3bytes | (-8 388 608,8 388 607) | (0,16 777 215) | 大整數(shù)值 |
INT或INTEGER | 4bytes | (-2 147 483 648,2 147 483 647) | (0,4 294 967 295) | 大整數(shù)值 |
BIGINT | 8bytes | 略 | 略 | 極大整數(shù)值 |
FLOAT | 4bytes | 略 | 略 | 單精度浮點值 |
DOUBLE | 8bytes | 略 | 略 | 雙精度浮點值 |
DECIMAL | 對DECIMAL(M,D), 若M>D,是M+2,否則為D+2 | 依賴于M和D的值 | 依賴于M和D的值 | 小整數(shù)值 |
注:
(1)float/double在db中存儲的是近似值,而decimal則是以字符串形式進行保存的;
(2)decimal(M,D)的規(guī)則和float/double相同,但float/double在不指定M、D時默認按照實際精度來處理而decimal在不指定M、D時默認為decimal(10, 0) ;
(3)BOOL或BOOLEAN類型使用0或1表示真假。
- 日期和時間類型
分類 | 大小 | 范圍 | 格式 | 用途 |
---|---|---|---|---|
DATE | 3bytes | 1000-01-01/9999-12-31 | YYYY-MM-DD | 小整數(shù)值 |
TIME | 3bytes | '-838:59:59'/'838:59:59' | HH:MM:SS | 時間值或持續(xù)時間 |
YEAR | 1bytes | 1901/2155 | YYYY | 年份值 |
DATETIME | 8bytes | 1000-01-01 00:00:00/9999-12-31 23:59:59 | YYYY-MM-DD HH:MM:SS | 混合日期和時間值 |
TIMESTAMP | 4bytes | 1970-01-01 00:00:00/2038。結束時間是第 2147483647 秒,北京時間 2038-1-19 11:14:07,格林尼治時間 2038年1月19日 凌晨 03:14:07 | YYYYMMDD HHMMSS | 混合日期和時間值,時間戳 |
- 字符串類型(包含文件類型)
分類 | 大小 | 用途 |
---|---|---|
CHAR | 0~255bytes | 定長字符串 |
VARVHAR | 0~65535bytes | 變長字符串 |
TINYBLOB | 0~255bytes | 不超過 255 個字符的二進制字符串 |
TINYTEXT | 0~255bytes | 短文本字符串 |
BLOB | 0~255bytes | 二進制形式的長文本數(shù)據(jù) |
TEXT | 0~65535bytes | 長文本數(shù)據(jù) |
MEDIUMBLOB | 0~65535bytes | 二進制形式的中等長度文本數(shù)據(jù) |
MEDIUMTEXT | 0~16777215bytes | 中等長度文本數(shù)據(jù) |
LONGBLOB | 略 | 二進制形式的極大文本數(shù)據(jù) |
LONGTEXT | 略 | 極大文本數(shù)據(jù) |
注:
(1)一般在數(shù)據(jù)庫里面很少存文件的內容, 一般存文件的路徑;
(2)一般不使用二進制存, 使用varchar(n)存文件的路徑
DDL——操作庫、操作表
一、用DDL操作庫
- 創(chuàng)建數(shù)據(jù)庫
create database 數(shù)據(jù)庫名 [character set 字符集][collate 校對規(guī)則]
-- 注: []是可選的意思
- 查看所有數(shù)據(jù)庫
show databases;
- 查看數(shù)據(jù)庫的定義結構
show create database 數(shù)據(jù)庫名;
- 刪除數(shù)據(jù)庫(危險操作)
drop database 數(shù)據(jù)庫名;
- 修改數(shù)據(jù)庫
alter database 數(shù)據(jù)庫名 character set 字符集;
-- 注:1.此語句修改字符集;2.是utf8,而不是utf-8
- 切換數(shù)據(jù)庫
use 數(shù)據(jù)庫名;
-- 注: 在創(chuàng)建表之前一定要用此句指定數(shù)據(jù)庫
二、用DDL操作表
- 創(chuàng)建表
create table 表名(
列名 類型[(寬度)] [約束] [約束條件] [comment '字段說明'],
列名 類型[(寬度)] [約束] [comment '字段說明'],
...
列名 類型[(寬度)] [約束] [comment '字段說明']
);
-- 注:列叫字段;行叫記錄
注:
約束,即規(guī)則、限制,作用是保證用戶插入的數(shù)據(jù)保存到數(shù)據(jù)庫中是復合規(guī)范的。主鍵約束關鍵字:primary key;唯一約束關鍵字:unique;非空約束關鍵字:not null
約束注意事項:
- not null: 非空 ; eg: username varchar(40) not null username這個列不能有null值
- unique:唯一約束, 后面的數(shù)據(jù)不能和前面重復; eg: cardNo char(18) unique; cardNo 列里面不可以有重復數(shù)據(jù)
- primary key;主鍵約束(非空+唯一); 一般用在表的id列上面. 一張表基本上都有id列的, id列作為唯一標識的
- id int primary key auto_increment; id不需要我們自己維護了, 插入數(shù)據(jù)的時候直接插入null, 自動的增長進行填充進去, 避免重復了. auto_increment: 自動增長,必須是設置了primary key之后,才可以使用auto_increment
- 先設置了primary key 才能設置auto_increment
- 只有當設置了auto_increment 才可以插入null 自己維護 否則插入null會報錯
- 查看表
show tables;--查看所有的表
desc 表名;--查看表的定義結構
- 修改表
-- 修改表
-- 語法: alter table 表名 add 列名 類型 [約束]; 增加列
-- 需求:為學生表增加一個成績列
alter table student add score double;
-- 語法: alter table 表名 modify 列名 新類型 新約束; 修改列的類型約束
-- 需求: 修改name的類型和約束
alter table student modify name varchar(40) not null;
-- 語法: alter table 表名 change 舊列名 新列名 類型 約束; 修改列的名稱,類型,約束
-- 需求: 修改sex列名為gender
alter table student change sex gender varchar(13) not null;
-- 語法: alter table 表名 drop 列名; 刪除列
-- 需求: 刪除score
alter table student drop score;
-- 語法: rename table 舊表名 to 新表名; 修改表名
rename table student to stu;
- 刪除表
-- 刪除表
-- drop table 表名;
-- 需求: 刪除stu表
drop table stu;
DML——操作表記錄——增刪改
-- 創(chuàng)建一張商品表(商品id,商品名稱,商品價格,商品數(shù)量)
create table product(
id int primary key auto_increment,
pname varchar(100),
price double,
num int
)
- 插入指定列
insert into 表(列,列..) values(值,值..);
--eg:
insert into product(pname,price) values('Mac',18888);
- 插入所有列
insert into 表 values(值,值....);
-- eg:
insert into product values(null,'蘋果電腦',18000.0,10);
insert into product values(null,'華為5G手機',30000,20);
insert into product values(null,'小米手機',1800,30);
insert into product values(null,'iPhonex',8000,10);
insert into product values(null,'蘋果電腦',8000,100);
insert into product values(null,'iPhone7',6000,200);
insert into product values(null,'iPhone6s',4000,1000);
insert into product values(null,'iPhone6',3500,100);
insert into product values(null,'iPhone5s',3000,100);
insert into product values(null,'方便面',4.5,1000);
insert into product values(null,'咖啡',11,200);
insert into product values(null,'礦泉水',3,500);
- 更新記錄
update 表名 set 列 =值, 列 =值 [where 條件]
-- 更新記錄
-- 語法: update 表名 set 列 =值, 列 =值 [where 條件]
-- 需求:修改商品所有的價格為5000
update product set price = 5000;
-- 需求: 修改id為2的商品數(shù)量和價格
update product set price = 8000,num = 20 where id = 2;
-- 將商品名是Mac的價格修改為18000元
update product set price = 18000 where pname = 'Mac'
-- 將商品名是Mac的價格修改為17000,數(shù)量修改為5
update product set price = 17000,num = 5 where pname = 'Mac'
-- 將商品名是方便面的商品的價格在原有基礎上增加2元
update product set price = price + 2 where pname = '方便面'
- 刪除記錄
方式一:delete
delete from 表 [where 條件]
方式二:truncate
truncate table 表;
--eg:
-- 刪除記錄
-- 語法一: delete from 表名 [where 條件]
-- 刪除表中名稱為’Mac’的記錄
delete from product where pname = 'Mac'
-- 刪除價格小于5001的商品記錄
delete from product where price < 5001
-- 刪除表中的所有記錄
delete from product
-- 語法二: truncate table 表名;
truncate table product
delete 和truncate區(qū)別
- DELETE 刪除表中的數(shù)據(jù),表結構還在; 刪除后的數(shù)據(jù)可以找回,一條一條的刪除。
- TRUNCATE 刪除是把表直接DROP掉,然后再創(chuàng)建一個同樣的新表。刪除的數(shù)據(jù)不能找回。執(zhí)行速度比DELETE快。
物理刪除與邏輯刪除
- 物理刪除: 真正的刪除了, 數(shù)據(jù)不在, 使用delete就屬于物理刪除
- 邏輯刪除: 沒有真正的刪除, 數(shù)據(jù)還在. 搞一個標記, 其實邏輯刪除是更新 eg: state 1 啟用 0禁用
DQL——操作表記錄——查詢
- 簡單查詢
select [*] [列名 ,列名] [列名 as 別名 ...] [distinct 字段] from 表名 [where 條件]
--eg:
-- 基本查詢語法: select [*][列名,列名][distinct 列名] from 表名 [where 條件]
-- 查詢所有的列語法 : select * from 表名
-- 需求: 查詢product表中的所有數(shù)據(jù)
select * from product;
-- 查詢某張表特定列 : select 列名,類名,... from 表名
-- 需求: 查詢product表中的pname,price字段的值
select pname,price from product
-- 去重查詢 : select distinct 列名 from 表名
-- 需求: 查詢price字段,去重 單個字段去重
select distinct price from product
-- 需求: 查詢pname,price字段,同時去重 多個字段去重
select distinct pname,price from product
-- 注意: distinct前面不能有字段名
select id,distinct price from product -- 報錯
-- 別名查詢
-- 對字段取別名: select 字段 as 別名,字段 as 別名,... from 表名
-- 注意: as可以省略 一般都會省略
select pname as 商品名稱,num as 商品數(shù)量 from product
select pname 商品名稱,num 商品數(shù)量 from product
-- 對表取別名:select 表1別名.字段名,... from 表1 as 表1別名
-- 注意: as可以省略 一般都會省略
select p.pname,p.num from product as p;
select p.pname,p.num from product p;
-- 運算查詢(+,-,*,/等) null和其他數(shù)據(jù)進行運算得到是null
-- 需求: 計算每個商品的總價(單價*數(shù)量)
select price ,num from product
select price * num from product
select price * num 總價 from product
select price * ifnull(num,0) 總價 from product
- 條件查詢
select ... from 表 where 條件
--取出表中的每條數(shù)據(jù),滿足條件的記錄就返回,不滿足條件的記錄不返回
(1)between...and... 區(qū)間查詢
eg: where price between 1000 and 3000 相當于 1000<=price<=3000
(2)in(值,值..)
-- 查詢id為1,3,5,7的
select * from t_product where id = 1
select * from t_product where id = 3
select * from t_product where id = 5
select * from t_product where id = 7
select * from t_product where id in(1,3,5,7)
(3)like 模糊查詢 一般和_或者%一起使用
- _ 占一位
- % 占0或者n位
name like '張%' --查詢姓張的用戶, 名字的字數(shù)沒有限制
name like '張_' --查詢姓張的用戶 并且名字是兩個字的
(4)and 多條件同時滿足
where 條件1 and 條件2 and 條件3
(5)or 任意條件滿足
where 條件1 or 條件2 or 條件3
- 排序查詢
order by 列 asc/desc, 列 asc/desc;
asc: 升序【默認值】 order by 列;
desc: 降序
(1)單列排序
SELECT 字段名 FROM 表名
[WHERE 條件]
ORDER BY 字段名 [ASC|DESC]; --ASC: 升序,默認值; DESC: 降序
--eg:練習: 以分數(shù)降序查詢所有的學生
select * from student order by score desc;
(2)組合排序
SELECT 字段名 FROM 表名
WHERE 字段=值
ORDER BY 字段名1 [ASC|DESC], 字段名2 [ASC|DESC];
--eg:以分數(shù)降序查詢所有的學生, 如果分數(shù)一致,再以age降序
select * from student order by score desc ,age desc;
- 分組查詢
分組的目的就是為了統(tǒng)計,一般分組會跟聚合函數(shù)一起使用。單獨分組,沒有意義, 返回每一組的第一條記錄.
where 條件 group by 列 [having 條件]
(1)只分組
SELECT 字段1,字段2... FROM 表名 [where 條件] GROUP BY 列 [HAVING 條件];
--eg 根據(jù)性別分組, 統(tǒng)計每一組學生的總人數(shù)
SELECT sex, count(*) FROM student GROUP BY sex
(2)分組后篩選——having
--eg:練習根據(jù)性別分組, 統(tǒng)計每一組學生的總人數(shù)> 5的(分組后篩選)
SELECT sex, count(*) FROM student GROUP BY sex HAVING count(*) > 5
-- 練習復雜: 統(tǒng)計sid為8之前的的, 根據(jù)性別分組, 每一組學生的總人數(shù) > 2的(分組后篩選)
select sex,count(*) from student where sid < 8 group by sex having count(*) > 2
where和having的區(qū)別
where 子句1) 對查詢結果進行分組前,將不符合where條件的行去掉,即在分組之前過濾數(shù)據(jù),即先過濾再分組。2) where后面不可以使用聚合函數(shù)
having字句1) having 子句的作用是篩選滿足條件的組,即在分組之后過濾數(shù)據(jù),即先分組再過濾。2) having后面可以使用聚合函數(shù)
- 分頁查詢
LIMIT a,b;
a:起始行數(shù),從0開始計數(shù),如果省略,默認就是0; a=(當前頁碼-1)*b;
b: 返回的行數(shù)
select ... from .... limit a ,b.
-- eg: 分頁查詢學生, 每一頁查詢4條 b=4; a=(當前頁碼-1)*b;
-- 需求: 分頁查詢學生, 每一頁查詢4條
select * from student limit 0,4; -- 第1頁
select * from student limit 4,4; -- 第2頁
select * from student limit 8,4; -- 第3頁
-- 【a=(當前頁碼-1)*b,b】
- 查詢語法總結
select...from...
select...from...where...
select...from...where...order by...
select...from...where...group by...
select...from...where...limit a,b
select...from...where...group by...having....order by...limit