DQL-MySQL

Data QueryLanguage 數據查詢語言

 

基礎查詢:select 查詢列表 from 表名;

查詢列表可以是表中字段,常量值,表達式,函數

取別名:as(可省略)

去重:查詢字段名前加distinct

+的作用:加法,有字符串試圖轉換,轉換不了直接爲0,有null結果爲null

concat(str1,str2…)拼接字符串,有null則全部爲null

ifnull(可能爲空字段,爲空時值)   null字段操作

 

條件查詢:select 查詢列表 from 表名 where 篩選條件

條件運算符:>  <  =  !=  <>  >=  <=

邏輯表達式:&&  ||  !  and  or  not

模糊查詢:like   between and    in     is null  is not null

like:%包含任意字符;_包含一個字符;查詢下劃線用轉義,escape  “$”自定義轉義符

between and:等價於>=…   and  <=…  語句簡潔,包含臨界值,範圍數值不能顛倒

in:某字段值是否屬於in列表某項,列表項值類型兼容,比or簡潔

is null is not null

安全等於:<=> 可判空或其他數值: <=> null 等於空 ;可讀性差; 

 

排序查詢:篩選條件後order by     desc降序     asc升序(默認)  

相同值排序亂序解決:加入唯一性字段排序,例如id

支持按別名、按函數、按多字段

一般放於最後(limit子句除外)

 

常見函數:

length(字節個數):中文gbk一個漢字佔兩個字節,utf8佔三個字節

upper()  lower()大小寫轉化

substr(字段,索引位置截取) 索引從1開始   同substring()

substr(字段,指定索引位置,字符長度)

instr(給定字段,查詢字段) 查出需要查詢字段的起始索引,查不出爲0

trim(指定內容 from 給定字段)  去除給定字段前後指定內容

lpad(給定字段,填充後總長度,填充內容)  左填充

rpad(給定字段,填充後總長度,填充內容)  右填充

replace(給定字段,需要替換的內容,替換成的內容)

 

數學函數:

round(數字)  四捨五入

round(數字,小數點後取位數)  四捨五入

ceil(數字) 向上取整,返回>=該數字的最小整數

floor(數字) 向下取整,返回<=該數字的最大整數

truncate(數字,截斷小數點後幾位)

mod(被除數,除數) 取模  符號同被除數

 

 

 

日期函數

#返回日期日期比較大小,>0 DATE1大,<0 +++DATE2大

DATEDIFF(DATE1,DATE2);

#返回當前系統年月日時分秒

SELECT NOW();

#時間戳,適用於datetime

SELECT CURRENT_TIMESTAMP();

 

#返回年月日

SELECT CURDATE();

SELECT CURRENT_DATE();

 

#返回時分秒

SELECT CURTIME();

SELECT CURRENT_TIME();

 

#年

SELECT YEAR(NOW());

 

#年加今年第幾周

SELECT YEARWEEK(NOW());

 

#年加?

SELECT YEARWEEK(NOW(),2);

 

#月

SELECT MONTH(NOW());

#英文幾月

SELECT MONTHNAME(NOW());

 

#日

SELECT DAY(NOW());

SELECT DATEDIFF('2018-5-2','2018-4-22'); 前面日期減後面日期的天數

 

#星期幾

SELECT DAYNAME(NOW());

#本月第幾天

SELECT DAYOFMONTH('2017-9-4');

#1-7:星期天到週六

SELECT DAYOFWEEK(NOW());

#今年第幾天

SELECT DAYOFYEAR(NOW());

 

#日期格式化:都轉化爲1990-3-23

SELECT STR_TO_DATE('1990-3/23','%Y-%c/%d');

#日期轉化爲指定字符串

SELECT DATE_FORMAT(NOW(),'%Y年%c月%d日');

其他函數:

SELECT VERSION();

SELECT DATABASE();

SELECT USER();

 

流程控制函數:

#同三元運算符

SELECT IF(10>11,'大','小');

 

#case:

一、同switch case

SELECT CASE 'ok'

WHEN 'o' THEN 'o'

WHEN 'o1' THEN 'o1'

WHEN 'o2' THEN 'o2'

ELSE 'ok1'

END AS result;

二、多重if

SELECT CASE

WHEN 1>2 THEN '1>2'

WHEN 2>2 THEN '2>2'

WHEN 3>2 THEN '3>2'

END AS result;

 

分組函數:用作統計,叫做聚合函數、統計函數、組函數(可distinct去重使用)

sum 求和、avg 平均值、max 最大值、min 最小值、count 計數

sum、avg 支持數值型,忽略null

max、min 支持數值、字符、日期,忽略null

count 計算非空字段行數,忽略null,count(*)(效率較高)、count(1)統計總行數

和分組查詢一起查詢的字段都是group by 後的字段

 

分組查詢

select  分組函數  from  表  where 篩選條件 group by 分組的字段  order by 子句

分組函數做條件則使用having在group by 之後

分組前篩選效率好即用where

支持按表達式或函數分組(用地少)

按多個字段分組

Oracle不支持group by having

 

連接查詢:多表查詢

笛卡爾乘積表一m行,表二n行,結果m*n行

原因:沒有有效連接條件

避免:添加有效的連接條件

標準分類

年代分類:

Sql92標準:僅支持內連接

Sql99標準【推薦】:支持所有內連接、外連接(左、右)、交叉連接

 

92標準:

功能分類:

內連接:

等值連接:結果爲多表交集部分,n表連接至少有n-1個,多表順序隨意,可搭配排序分組篩選使用

注意:爲表起別名(查詢也要用別名(視圖))

非等值連接:A表值between B表值1 and B表值2

自連接:同表起別名

 

99標準:

一、內連接:同上

特點:1、表的順序可以互換

  2、結果爲表的連接交集

  3、n表連接需要n-1給個連接條件

 

二、外連接:

特點:1、查詢結果爲主表中所有行,從表匹配的行或者null

  2、left jion左邊爲主表,right jion 右邊爲主表,full join兩邊都是主表

左外連接:select 查詢列表 from 表1 as別名 【連接類型】

jion表2 as別名 

on 連接條件

where 篩選條件

右外連接:類似左外連接

 

全外連接:表1有表2沒有,表2有表1沒有,表1表2都有

mysql暫不支持

 

三、交叉連接:兩表全查

select 表1.*,表2.* from 表1  cross jion 表2 

  

子查詢:查詢字表爲查詢條件

where或having後面:1、標量子查詢(結果集只有一行一列)

2、列子查詢(多行子查詢)

in /not in :在什麼範圍中的值

any/some:任意一個值

all:所有的值

select 後面(多用):

from後面:查詢結果做結果集表,必須起別名

(not)exists後面:子查詢有沒有值,有爲1,否則爲0,可用in代替

分頁查詢:

limit  offset,size

offset:起始位置,可省略默認值爲0;(page-1)*size

size:查詢數量

 

union聯合查詢

特點:查詢的表沒有連接關係但是查詢信息(列數、列的類型和順序)一致,自動去重,不去重用union all查詢

查詢語句1

union

查詢語句2

union

……

發佈了22 篇原創文章 · 獲贊 1 · 訪問量 8002
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章