PS:絕不眼高手低,從基礎(chǔ)做起。咱也不知道sql語(yǔ)句寫(xiě)在哪里扑毡,就直接用代碼塊呈現(xiàn)了,這樣看起來(lái)方便一些盛险。
(1)先來(lái)講一些注意事項(xiàng):
選中Fn+F12格式化瞄摊。選中Fn+F9執(zhí)行。";"分割語(yǔ)句苦掘。雙擊字段快捷輸入换帜,這樣輸入時(shí)字段是著重號(hào)引起來(lái)。著重號(hào)一般用來(lái)區(qū)分是字段還是關(guān)鍵字鹤啡,是關(guān)鍵字的時(shí)候引起來(lái)惯驼,不是的時(shí)候可不用(手打時(shí))。
(2)表中字段含義:
進(jìn)階一 查詢
語(yǔ)法:select 查詢列表 from 表名;
特點(diǎn):
1递瑰、可以查:字段祟牲、常量值、表達(dá)式抖部、函數(shù)
2说贝、查詢的結(jié)果是一個(gè)虛擬表格
#選用操作的庫(kù)
USE `myemployees`;
#顯示表的結(jié)構(gòu)
DESC `departments`;
#1.查詢字段
#連接字符串用concat
SELECT
CONCAT(`last_name`, '-',`first_name`) AS 姓名
FROM
`employees` ;
#去重 在一次執(zhí)行中只能去一個(gè)字段的重
SELECT DISTINCT `department_id` FROM `employees`;
#有null值返回指定值,不是null值顯示原值
SELECT `last_name` 姓,IFNULL(`commission_pct`,0) AS 獎(jiǎng)金率
FROM `employees`
#2.查詢常量值
SELECT '粉紅狐貍'; #字符型和日期型要用單引號(hào)引起來(lái)慎颗,數(shù)值型不需要
SELECT '100';
SELECT 100;
#3.查詢表達(dá)式
SELECT 100%98 AS 取模;
SELECT 100%98 余數(shù);#取別名可以用空格
SELECT 100%98 AS "out put";#別名為關(guān)鍵字建議雙引號(hào)引起來(lái)乡恕,單引號(hào)也可以
#4.查詢函數(shù)
SELECT VERSION();
#5.+在Mysql中只有一個(gè)功能:運(yùn)算符
SELECT 99+1; #兩個(gè)都是數(shù)值
SELECT '98'+1; #能轉(zhuǎn)換成數(shù)字的字符,試圖轉(zhuǎn)換成數(shù)字俯萎,再運(yùn)算
SELECT '粉紅狐貍'+1;#不能轉(zhuǎn)換成數(shù)字的字符傲宜,轉(zhuǎn)換成0,再運(yùn)算
SELECT NULL+1;#只要有null結(jié)果就是null
進(jìn)階二 條件查詢
語(yǔ)法:select 查詢列表 from 表 where 篩選條件
執(zhí)行過(guò)程:先查表夫啊,再看條件函卒,再查詢
條件分類:
1、條件表達(dá)式:< > != <> (又大于又小于就是不等于,推薦寫(xiě)這個(gè))<= >=
2撇眯、邏輯運(yùn)算符(用于連接條件表達(dá)式):&& || 报嵌!躁愿,推薦寫(xiě) and or not
3、模糊查詢:
like :與通配符搭配查詢字符型或者數(shù)值型都可以沪蓬,%任意多個(gè)字符,說(shuō)不清是什么字符来候,包含0個(gè)字符 _只匹配一個(gè)字符 跷叉。 (如果字段里有null值,like+通配符是無(wú)法匹配的)
between and :取值區(qū)間[<= ,>=]
in|not in : 判斷字段是否在in的列表里营搅,不支持通配符查詢云挟,因?yàn)閕n等價(jià)于==
is null | is not null :只能判斷null值
#案例1:查詢工資在1萬(wàn)到2萬(wàn)之間的員工姓名,工資转质,獎(jiǎng)金
SELECT `last_name` ,`salary` ,`salary`*12*IFNULL(`commission_pct`,0) AS 獎(jiǎng)金
FROM `employees`
WHERE `salary` >=10000 AND `salary`<=20000;
SELECT `last_name` ,`salary` ,`salary`*12*(1+IFNULL(`commission_pct`,0)) AS 年薪
FROM `employees`
WHERE `salary` BETWEEN 10000 AND 20000; #between and 包含端點(diǎn)值园欣,臨界值順序不能顛倒
#案例2:查詢員工姓名中包含字符a的員工信息
SELECT * FROM employees WHERE last_name LIKE '%a%';
#案例3:查詢員工姓名中第二個(gè)字符為"_"的員工信息
SELECT * FROM employees WHERE last_name LIKE '_\_%';
SELECT * FROM employees WHERE last_name LIKE '_$_%' ESCAPE '$';#escape 表示后面的字符是轉(zhuǎn)義字符,$可任意
#案例4:查詢工種編號(hào)為AD_PRES休蟹,AD_VP,IT_PROG的員工姓名和工種編號(hào)
SELECT last_name,job_id FROM employees WHERE job_id IN ('AD_PRES','AD_VP','IT_PROG');
#查詢工種編號(hào)不為‘IT’的員工信息
SELECT * FROM employees WHERE job_id <> 'IT' ;#不能用is not
#案例5:查詢有獎(jiǎng)金的員工姓名和獎(jiǎng)金率
SELECT last_name ,`commission_pct` FROM employees WHERE `commission_pct`IS NOT NULL;#= 或者<> 不能去判斷null值
#案例6:查詢沒(méi)有獎(jiǎng)金的員工姓名和獎(jiǎng)金率 安全等于<=> 等價(jià)于==
SELECT last_name ,`commission_pct` FROM employees WHERE `commission_pct` <=> NULL;
SELECT last_name ,salary FROM employees WHERE salary <=> 12000;
/*
is null:只能判斷是否等于null值沸枯,可讀性高
<=> :既能判斷是否是null值,也能判斷普通值赂弓,但可讀性差绑榴,建議用is null
*/
進(jìn)階三 排序 order by 放在最后面
語(yǔ)法:select 查詢列表 from 表 where 條件 order by 排序列表 【asc|desc】
執(zhí)行順序:從哪個(gè)表篩選什么條件,再去查找盈魁,最后排序
特點(diǎn):默認(rèn)升序asc
#案例1.查詢部門(mén)編號(hào)>90,按照入職時(shí)間先后順序進(jìn)行排序
SELECT * FROM employees WHERE `department_id`>90 ORDER BY `hiredate`;#時(shí)間早的值較小
#案例2.查詢員工信息翔怎,按照入職時(shí)間先后順序、月薪和姓名長(zhǎng)度降序杨耙、進(jìn)行排序【怎么只能有兩個(gè)排序字段赤套?第三個(gè)不管用了呢】
SELECT `last_name`,`hiredate`,`salary`,LENGTH(last_name) 姓名長(zhǎng)度
FROM employees
ORDER BY `hiredate` ASC ,`salary` DESC,姓名長(zhǎng)度 DESC;
進(jìn)階四 函數(shù)
函數(shù)分為單行函數(shù),聚合函數(shù)(統(tǒng)計(jì)函數(shù))
1珊膜、單行函數(shù):給一個(gè)值返回一個(gè)值
2容握、統(tǒng)計(jì)函數(shù):給多個(gè)值返回一個(gè)值(下一篇更新)
一、單行函數(shù)
1.1字符型函數(shù)
#length :獲取參數(shù)值的字節(jié)個(gè)數(shù)(不是字符個(gè)數(shù))在utf8中漢字占3個(gè)字符辅搬,在jbk中漢子占兩個(gè)字符唯沮;英文字母均占一個(gè)字符
SHOW VARIABLES LIKE '%char%' #看字符集
SELECT LENGTH('粉紅狐貍');
#concat : 拼接字符串
SELECT CONCAT('粉紅狐貍','_','最好看');
#upper、lower : 全部變成大寫(xiě)堪遂、小寫(xiě)
SELECT CONCAT(UPPER(last_name),'_',LOWER(first_name)) FROM employees;
#substr | substring : 截取字符串 索引從1開(kāi)始
#一個(gè)數(shù)值參數(shù)時(shí)介蛉,返回從開(kāi)始索引的位置到最后
SELECT SUBSTR('乘風(fēng)破浪的小姐姐',6);#返回“小姐姐”
#兩個(gè)數(shù)值參數(shù)時(shí),返回從開(kāi)始索引的位置溶褪,指定字符長(zhǎng)度的子串
SELECT SUBSTR('乘風(fēng)破浪的小姐姐',1,4);#返回“乘風(fēng)破浪”
#案例:首字母大寫(xiě)币旧,其余小寫(xiě),下劃線拼接
SELECT CONCAT(UPPER(SUBSTR(last_name,1,1)),
LOWER(SUBSTR(last_name,2)),
'_',
LOWER(first_name)
) FROM employees;
#instr :返回在字符串中第一次出現(xiàn)的索引猿妈,找不到返回0
SELECT INSTR('紅色高跟鞋','高跟鞋') #返回3
#trim去掉前后空格,或者去掉前后的指定字符
SELECT LENGTH(TRIM(' 楊冪 ')); #2*3=6
SELECT TRIM('a' FROM 'aaaaaaaa楊aaaa冪aaaa')#若為aa 則以aa為單位進(jìn)行匹配
#lpad left_pad | rpad right_pad : 參數(shù)代表總長(zhǎng)度,原有數(shù)值的個(gè)數(shù)超過(guò)指定長(zhǎng)度從右邊截?cái)?SELECT LPAD('楊冪',10,'*') AS result
#replace : 凡是能夠匹配上的都替換掉
SELECT REPLACE('周芷若周芷若張無(wú)忌愛(ài)上了周芷若','周芷若','趙敏') result
1.2 數(shù)學(xué)函數(shù)
#round : 四舍五入
SELECT ROUND(-1.55); #先計(jì)算正數(shù)的四舍五入值吹菱,再加符號(hào)
SELECT ROUND(-1.567,2); #四舍五入巍虫,小數(shù)點(diǎn)保留2位
#ceil :向上取整,返回>=該參數(shù)的最小整數(shù)
SELECT CEIL(-1.01);
#floor : 返回<=該參數(shù)的最大整數(shù)
SELECT FLOOR(-1.01);
#truncate :截?cái)啵诙€(gè)參數(shù)表示小數(shù)點(diǎn)后保留的位數(shù)
SELECT TRUNCATE(1.79999,1)
#mod : 取余 符號(hào)看被除數(shù) 10%3 看10
/*
a-a/b*b java中除法左右兩邊都是整數(shù)取整
mod(-10,-3) : -10 - (-10)/(-3)*(-3)
mod(10,-3) : 10 - (10)/(-3)*(-3)
*/
SELECT MOD(-10,-3)
SELECT MOD(10,-3)
SELECT -10/-3
1.3 日期函數(shù)
SELECT NOW(); #日期+時(shí)間
SELECT CURDATE(); #日期
SELECT CURTIME(); #時(shí)間
#可以獲取年鳍刷、月占遥、日、時(shí)输瓜、分瓦胎、秒
SELECT MONTH(NOW());
SELECT MONTHNAME(NOW()); #英文的月份
#將字符串轉(zhuǎn)換成日期
SELECT STR_TO_DATE('1996-5-15','%Y-%c-%d')
#在一定的業(yè)務(wù)場(chǎng)景下使用解析用戶返回給的日期字符串
SELECT * FROM `employees` WHERE `hiredate`=STR_TO_DATE('4-3 1992','%c-%d %Y');
#date_format 將日期轉(zhuǎn)換成字符
SELECT DATE_FORMAT(NOW(),'%y年-%m月-%d日') result;
1.4其他函數(shù)
SELECT VERSION();
SELECT DATABASE();
SELECT USER();
1.5 流程控制函數(shù)
#if函數(shù)
SELECT
last_name,
commission_pct,
IF(
commission_pct,
'有獎(jiǎng)金 嘻嘻',
'沒(méi)獎(jiǎng)金 呵呵'
) AS 備注
FROM
employees
#case使用一 case后面加字段,功能相當(dāng)于等于的判斷尤揣,when后面加的是常量
/*
case 需要判斷的字段或表達(dá)式
when 常量1 then 要顯示的值1或者語(yǔ)句1
when 常量2 then 要顯示的值2或者語(yǔ)句2
...
else 要顯示的值n或者語(yǔ)句n(默認(rèn))
end
搭配select時(shí) case-end充當(dāng)?shù)氖潜磉_(dá)式搔啊,then后面顯示的是值
*/
/*案例:查詢員工的工資,要求:
部門(mén)號(hào)=30北戏,顯示的工資為1.1倍
部門(mén)號(hào)=40负芋,顯示的工資為1.2倍
部門(mén)號(hào)=50,顯示的工資為1.3倍
其他部門(mén)嗜愈,顯示的工資為原工資
*/
SELECT
last_name,
department_id,
salary,
CASE department_id
WHEN 30 THEN salary * 1.1
WHEN 40 THEN salary * 1.2
WHEN 50 THEN salary * 1.3
ELSE salary
END AS 工資
FROM
employees
#case使用二 case后面不加?xùn)|西旧蛾,判斷的條件在when后面寫(xiě),相當(dāng)于是區(qū)間的判斷
/*
case
when 條件1 then 要顯示的值1或者語(yǔ)句1
when 條件2 then 要顯示的值2或者語(yǔ)句2
...
else 要顯示的值n或者語(yǔ)句n(默認(rèn))
end
搭配select時(shí) case-end充當(dāng)?shù)氖潜磉_(dá)式蠕嫁,then后面顯示的是值
*/
/*案例:查詢員工的工資蚜点,要求:
工資>20000,顯示級(jí)別A
工資>15000,顯示級(jí)別B
工資>10000,顯示級(jí)別C
否則,顯示級(jí)別D
*/
SELECT
last_name,
department_id,
salary 原工資,
CASE
WHEN salary>20000 THEN 'A'
WHEN salary>15000 THEN 'B'
WHEN salary>10000 THEN 'C'
ELSE 'D'
END AS 工資級(jí)別
FROM
employees
總結(jié) 單行函數(shù)
字符函數(shù)
length , concat , substr , instr , trim ,
upper , lower , lpad , rpad , replace
數(shù)學(xué)函數(shù)
round , ceil , floor, truncate, mod
日期函數(shù)
now , curdate, curtime ,
year , month, monthname, day, hour, minute, second
str_to_date , date_format
其他函數(shù)
version , database, user
控制函數(shù)
if , case
二拌阴、分組函數(shù) :用來(lái)統(tǒng)計(jì)
分類:sum avg min max count
特點(diǎn):
1.sum avg :只處理數(shù)值型 min max count:可以處理任何類型
2.以上函數(shù)都忽略null值绍绘。
3.可以和dinstinct搭配 去重
4.count 的詳細(xì)用法
count(*),count(1)表的統(tǒng)計(jì)行數(shù)迟赃,一般使用count(*)
5.和分組函數(shù)一同查詢的字段陪拘,要求是出現(xiàn)在group by 后的字段
因?yàn)榉纸M函數(shù)只返回一個(gè)值,加上其他字段纤壁,返回的數(shù)據(jù)表不規(guī)范
select sum(salary),last_name from 表 這樣是不可以的左刽,sum只返回一個(gè)值,但last_name有多個(gè)值
SELECT SUM(DISTINCT salary), SUM(salary) FROM employees
SELECT DATEDIFF(NOW(),'1996-06-30') 地球居住天數(shù);
參考來(lái)源:https://www.bilibili.com/video/BV12b411K7Zu?from=search&seid=14676118147617784537