寫在前面:2020年9月20日萍聊,星期日,今天是打卡的一天悦析,也是我來到深圳的第一天寿桨。當(dāng)我離開學(xué)校的時候,我知道强戴,我離開了一個最安逸的地方亭螟,面對的將是這個現(xiàn)實(shí)的世界。不管結(jié)果是好是壞骑歹,我邁出了這一步预烙。出發(fā)吧,該去遠(yuǎn)方了道媚。
對于SQL的學(xué)習(xí)扁掸,有點(diǎn)陌生翘县,也有點(diǎn)熟悉。大概是大學(xué)的時候?qū)W過谴分,但是有沒有好好學(xué)吧锈麸。這周要惡補(bǔ)一下。由于時間的關(guān)系牺蹄,這次學(xué)的不是很多忘伞,什么時候才有時間好好學(xué)呢,要自己擠時間吧…
1.SQL : 結(jié)構(gòu)化查詢語言
啟動服務(wù)net start mysql
停止服務(wù)net stop mysql
登錄 mysql -h 主機(jī)名 -P 端口號 -u 用戶名 -p密碼
退出exit
show databases;
use 庫名;
show tables;
show tables from 庫名;不換庫
select database();
create table 表名(字段1 字段類型,字段2 字段類型);
desc 表名;
select * from 表名;
select version();查看版本
說明:SQL 語法不區(qū)分大小寫沙兰,關(guān)鍵字大寫氓奈,表名字段名小寫
命令以分號結(jié)尾
-- 注釋
/* 多行注釋*/
2.DQL查詢語句
1)基礎(chǔ)查詢
select distinct 字段1 as 別名1,字段2 as 別名2 ... from 表名; -- as可省略
select concat(字段1,字段2,字段3) as 別名 from 庫名;
select ifnull(字段名, 返回值) as 別名;
2)條件查詢
條件運(yùn)算符 > < = >= <=<>
邏輯運(yùn)算符and or not
3)模糊查詢
like -- 配合通配符
% -- 任意個字符
_ -- 單個字符
\ -- 轉(zhuǎn)義
escape -- 指定轉(zhuǎn)義
[not] between 區(qū)間頭 and 區(qū)間尾 -- (含首尾,不可交換區(qū)間首尾)
in (值1,值2...)
is [not] null
<=> -- 安全等于
4)排序查詢
order by?排序字段1(可以是表達(dá)式,別名) asc | desc (默認(rèn)asc),排序字段2 [desc]
5)單行函數(shù)
A.字符類
concate() -- 拼接
length() -- 字節(jié)長度
upper() -- 轉(zhuǎn)大寫
lower() -- 轉(zhuǎn)小寫
substr(原字符串,初始索引,截取長度) -- 截子串
instr(原字符串,子串) -- 子串第一次出現(xiàn)索引,無則0
trim() -- 去前后空格
trim(指定字符 from 原字符串) -- 去前后指定字符
lpad(原字符串,總長度,指定填充符) -- 左填充
rpad() -- 右填充
replace(原字符串,要換字符串,替換字符串) -- 替換
B.數(shù)學(xué)類
round(值,精度) -- 四舍五入
ceil() -- 向上取整
floor() -- 向下取整
truncate() -- 截?cái)?/p>
mod() -- 模
rand() (0,1] -- 隨機(jī)數(shù)
C.日期類
now() -- 當(dāng)前系統(tǒng)日期+時間
curdate() -- 當(dāng)前系統(tǒng)日期
curtime() -- 當(dāng)前系統(tǒng)時間
year() month() monthname() day() hour()minute() second()
-- 年月英文月日時分秒
str_to_date() -- 日期轉(zhuǎn)換
date_format() -- 日期格式化
datediff(被減數(shù)日期,減數(shù)日期) -- 日期差天數(shù)
D.系統(tǒng)類
version() -- 當(dāng)前版本
database() -- 當(dāng)前庫
user() -- 當(dāng)前用戶
password('字符') -- 加密
md5('字符') -- md5加密
E.條件分支
if(真值表達(dá)式,真執(zhí)行,假執(zhí)行) 條件執(zhí)行
case 條件表達(dá)式
when 常量1 then 返回值1
when 常量2 then 返回值2
...
else 返回值n+1
end
case
when 條件1 then 返回值1
when 條件2 then 返回值2
...
else 返回值n+1
end
6)分組函數(shù)(聚合函數(shù))
sum([distinct] 數(shù)值) -- 非空和
avg(數(shù)值) -- 非空均值
max(字段) -- 非空最大值
min(字段) -- 非空最小值
count([distinct] 字段) -- 非空計(jì)數(shù)
count(*|1) -- 快速統(tǒng)計(jì)總行數(shù)
7)分組查詢
select 分組函數(shù),分組字段...
where 分組前篩選條件,數(shù)據(jù)源和字段為原始表
group by 分組字段...
having 分組后篩選條件,數(shù)據(jù)源為分組后的結(jié)果集,字段為select后的字段
order by 排序字段[desc];
8)連接查詢(多表查詢)
笛卡爾積 : 多表直接查詢結(jié)果行數(shù)為行1 * 行2 * ...
內(nèi)連接
A.等值連接
select 別名1.字段1,別名2字段2
from 表1 別名1,表2 別名2(表改了別名,select若帶表名則必須用別名)...
where 別名1.字段1=別名2.字段2
and ...
and 篩選條件
group by 分組字段
having 篩選條件
order by 排序字段;
B.非等值連接
select 字段1,字段2
from 表1 別名1,表2 別名2
where 別名1.字段11 between 別名2.字段21 and 別名2.字段22
and ...;
C.自連接
select 別名1.字段1,別名1.字段2...,別名2.字段1,別名2.字段2...
from 表名別名1,表名別名2;
D.內(nèi)連接 inner join (表交集)
select 字段1,字段2...
from 表1 別名1
[inner] join 表2 別名2
on 連接條件1(等值條件|不等值條件)
[inner] join 表3 別名3
on 連接條件2
...
where 篩選條件
group by 分組字段
having 篩選條件
order by 排序字段
...;
外連接(主表并集)
A.左連接left [outer] join
select 字段1,字段2...
from 主表別名1
left join 從表別名2
on 連接條件
where 別名2.id is null
...;
B.右連接 right [outer] join (交換連接表順序等同于左連接)
select 字段1,字段2...
from 從表別名1
right join 主表別名2
on 連接條件
where 別名1.id is null
...;
C.全外連接 full [outer] join (全表并集)
select 字段1,字段2
from 表1 別名1
full join 表2 別名2
on 連接條件
where 別名1.字段1 is null or 別名2.字段2 is null
...;
D.交叉連接 cross join (笛卡爾積)
select 字段1,字段2
from 表1 別名1
cross join 表2 別名2;
9)子查詢
select 僅標(biāo)量子查詢(單行單列)
from 僅表子查詢(多行多列)
where | having 標(biāo)量子查詢
列子查詢(單列)
行子查詢(單行)
exists 表子查詢
A.where或having后的子查詢_標(biāo)量子查詢(搭配> < = >= <= <>)
select 字段
from 表名
where 字段>? <? =?>=? <=? <>(
???select字段 from 表 where 字段=值
)
group by 字段
having 字段> < = >=? <=? <> (標(biāo)量子查詢);
B. where或having后的子查詢_列子查詢(搭配in,not in,any,some,all)
select 字段
from 表名
where 字段[not] in(
? ??select [distinct]字段
???from表名
???where條件
)
...;
in() 等價于=any()
not in() 等價于<>all()
>any() 等價于>min()
>all() 等價于>max()
<any() 等價于
<all() 等價于
C. where或having后的子查詢_行子查詢
select 字段
from 表名
where (字段1,字段2...) = > < >= <= <> (
???select min(字段1),max(字段2)...
???from表名
???...
)
...;
D.select后的子查詢
select 字段2,(
???select字段1 from 表1 where 篩選條件
)
from 表2;
E.from后的子查詢
select 別名1.*,別名2.字段
from (
???select字段1,字段2
???from表1
???group by分組字段
) 別名1
inner join 表2 別名2
on 表1.字段1 between 字段3 and 字段4
...;
F.exists后的子查詢(相關(guān)子查詢)
select exists(select...);
-- 子查詢結(jié)果存在僧凰,查詢結(jié)果為1
-- 子查詢結(jié)果不存在,查詢結(jié)果為0
select 字段
from 表
where exists(select...);
10)分頁查詢
select ...
...
limit offset(起始索引從0開始熟丸,0可省略),size(條目個數(shù));
limit (page-1)*size? size?--分頁公式
11)聯(lián)合查詢
select ...
...
union [all]?--帶all不去重
select ...??--每個查詢列數(shù)必須相同训措,以第一個select字段命名
...
union
...;