sql語氣查詢去重的兩種方法 以下兩種都可以進行去重查詢,區別是: 用distinct去重,只能查詢到去重的屬性那一列,無法查詢其他欄位 用group by分組查詢,可以根據需求查詢對應的其他欄位,推薦用group by 第一種:使用distinct(關鍵詞distinct用於返回唯一不同的值) s ...
sql語氣查詢去重的兩種方法
以下兩種都可以進行去重查詢,區別是: 用distinct去重,只能查詢到去重的屬性那一列,無法查詢其他欄位 用group by分組查詢,可以根據需求查詢對應的其他欄位,推薦用group by
第一種:使用distinct(關鍵詞distinct用於返回唯一不同的值)
select distinct university from user_profile;
第二種:使用group by按照university進行分組
select university from user_profile group by university;
sql的模糊查詢
這道題主要考察的是模糊查詢 欄位名 like '匹配內容'
_ :下劃線 代表匹配任意一個字元;
% :百分號 代表匹配0個或多個字元;
[]: 中括弧 代表匹配[ ]中的任意一個字元(若要比較的字元是連續的,則可以用連字元“-”表 達 );
[^]: ^尖冒號 代表 非,取反的意思;不匹配[ ]中的任意一個字元。。
tips:面試常問的一個問題:你瞭解哪些資料庫優化技術? SQL語句優化也屬於資料庫優化一部分,而我們的like模糊查詢會引起全表掃描,速度比較慢,應該儘量避免使用like關鍵字進行模糊查詢。
sql中的日期函數
知識
日期函數
DAYOFWEEK(date)
返回日期date的星期索引(1=星期天,2=星期一, ……7=星期六)。這些索引值對應於ODBC標準。
1
select DAYOFWEEK('1998-02-03')
-> 3
WEEKDAY(date)
返回date的星期索引(0=星期一,1=星期二, ……6= 星期天)。
1
mysql> select WEEKDAY('1997-10-04 22:23:00');
-> 5
DAYOFMONTH(date)
返回date的月份中日期,在1到31範圍內。
1
mysql> select DAYOFMONTH('1998-02-03');
-> 3
DAYOFYEAR(date)
返回date在一年中的日數, 在1到366範圍內。
1
mysql> select DAYOFYEAR('1998-02-03');
-> 34
MONTH(date)
返回date的月份,範圍1到12。
1
mysql> select MONTH('1998-02-03');
-> 2
DAYNAME(date)
返回date的星期名字。
1
mysql> select DAYNAME("1998-02-05");
-> 'Thursday'
MONTHNAME(date)
返回date的月份名字。
1
mysql> select MONTHNAME("1998-02-05");
-> 'February'
QUARTER(date)
返回date一年中的季度,範圍1到4。
1
mysql> select QUARTER('98-04-01');
-> 2
WEEK(date)
對於星期天是一周的第一天的地方,有一個單個參數,返回date的周數,範圍在0到52。
1
mysql> select WEEK('1998-02-20');
-> 7
WEEK(date,first)
2個參數形式WEEK()允許你指定星期是否開始於星期天或星期一。
如果第二個參數是0,星期從星期天開始,
如果第二個參數是1,從星期一開始。
1
mysql> select WEEK('1998-02-20',0);
-> 7
1
mysql> select WEEK('1998-02-20',1);
-> 8
YEAR(date)
返回date的年份,範圍在1000到9999。
1
mysql> select YEAR('98-02-03');
-> 1998
HOUR(time)
返回time的小時,範圍是0到23。
1
mysql> select HOUR('10:05:03');
-> 10
MINUTE(time)
返回time的分鐘,範圍是0到59。
1
mysql> select MINUTE('98-02-03 10:05:03');
-> 5
SECOND(time)
回來time的秒數,範圍是0到59。
1
mysql> select SECOND('10:05:03');
-> 3
PERIOD_ADD(P,N)
增加N個月到階段P(以格式YYMM或YYYYMM)。以格式YYYYMM返回值。註意階段參數P不是日期值。
1
mysql> select PERIOD_ADD(9801,2);
-> 199803
PERIOD_DIFF(P1,P2)
返回在時期P1和P2之間月數,P1和P2應該以格式YYMM或YYYYMM。註意,時期參數P1和P2不是日期值。
1
mysql> select PERIOD_DIFF(9802,199703);
-> 11
mysql字元串截取之substring_index
substring_index()函數用來截取字元串
substring_index(str,delim,count)
str:要處理的字元串
delim:分隔符
count:計數
示例:
如 str=www.wiki.com
則 substring_index(str,'.',1) 處理的結果是:www
substring_index(str,'.',2) 得到的結果是:www.wiki
也就是說,如果count是正數,那麼就是從左往右數,第N個分隔符的左邊的全部內容,
相反,如果是負數,那麼就是從右邊開始數,第N個分隔符右邊的所有內容。
如:
substring_index(str,'.',-2) 得到的結果為:http://wikibt.com
如果要中間的的 wiki 怎麼辦?
很簡單的,需要從兩個方向截取:
先截取從右數第二個分隔符的右邊的全部內容,再截取從左數的第一個分隔符的左邊的全部內容:
substring_index(substring_index(str,'.',-2),'.',1);
sql中字元串的切割、截取、刪除、替換、計算字元串的長度函數
select
-- 替換法 replace(string, '被替換部分','替換後的結果')
-- device_id, replace(blog_url,'http:/url/','') as user_name
-- 截取法 substr(string, start_point, length*可選參數*)
-- device_id, substr(blog_url,11,length(blog_url)-10) as user_nam
-- 刪除法 trim('被刪除欄位' from 列名)
-- device_id, trim('http:/url/' from blog_url) as user_name
-- 欄位切割法 substring_index(string, '切割標誌', 位置數(負號:從後面開始))
device_id, substring_index(blog_url,'/',-1) as user_name
from user_submit;
字元串的截取:substring(字元串,起始位置,截取字元數)
字元串的拼接:concat(字元串1,字元串2,字元串3,...)
字母大寫:upper(字元串)
計算字元串長度函數
char_length(字元串列名)
sql的高級語法:視窗函數
見鏈接:https://zhuanlan.zhihu.com/p/92654574
補充視窗函數:
lead的寫法:(偏移標的,偏移量,null)
ifnull(A,B):A非空返回A,A是空值返回B
返回 2020 年 1 月的所有訂單的訂單號和訂單日期的解法
字元串匹配(近似查找法)
用like來查找
select order_num, order_date
from Orders
where order_date like '2020-01%'
order by order_date
切割字元串
select order_num, order_date
from Orders
where left(order_date, 7) = '2020-01'
order by order_date
字元串比較
select *
from Orders
where order_date >= '2020-01-01 00:00:00' and order_date <= '2020-01-31 23:59:59'
order by order_date;
用正則來查找(效率不如like,能用like就用like)
select order_num, order_date
from Orders
where order_date regexp '2020-01'
order by order_date
時間函數匹配
select order_num, order_date
from Orders
where year(order_date) = '2020' and month(order_date) = '1'
order by order_date
利用date_format函數 (參考其中的匹配規則進行匹配)
select order_num, order_date
from Orders
where date_format(order_date, '%Y-%m')='2020-01'
order by order_date