查詢資料庫資訊
- 查詢 MySQL資料庫 的版本號
select version(); - 查看當前使用的資料庫
select database();
查詢表結構
- 查詢表結構(desc 是 describe 的縮寫)
desc(或describe) 表名;
簡單查詢
- 查詢指定欄位的資料( 可以是一個欄位,也可以是多個欄位,欄位之間逗號隔開 )
select 欄位1 , 欄位2 , 欄位3… from 表名; - 查詢所有欄位
select * from 表名;
as 關鍵字
這就要提一提這個 as 關鍵字,如果一個欄位名過長,或者不能很好的表達該欄位的含義的時候,我們可以使用 as 關鍵字用來給欄位取別名
例:查詢欄位的同時,給欄位取別名(注意只是改變顯示結果,表中的不會被改變)
select 欄位1 , 欄位2 as 欄位3 from 表名; (這是欄位2被取了別名為欄位3,欄位1沒有變)
其中這個 as 關鍵字可省略(即只有一個空格)
select 欄位1 , 欄位2 欄位3 from 表名;(與上面的功能一樣)
那如果名中有空格怎么辦(別名中如果有空格相同處理)?
我們用引號將名字包起來,單引號為使用標準,雙引號在部分資料庫中不可( MySQL 中可用雙引號)
數學運算式
欄位可以使用數學運算式( +, - ,* , / 等)
注意:只要參與運算中有 NULL ,則結果一定為 NULL
例:select name , age + 1 from table_1;
條件查詢( where )(即查詢符合條件的資料)
select 欄位1 , 欄位2 , from 表名 where 條件;
例:select name , age from table_1 where age >= 18
運算子有:< ,<= ,> ,>= ,and ,or ,<> ,!= ,is null ,in ,not ,like ,= ,between…and…
( <,<=,>,>= ,這四個就不說了,就是你們認為的意思)
- <> (或 !=):不等于
- is null :為 null(is not null 則不為 null )
- in :包含,相當于多個 or ( not in 則不在范圍內 )
- not :取非,主要用于 is 和 in 中
- = :等于
- and :且
- or :或
- between…and… :兩個值之間,相當于 >= and <=
- like :稱為模糊查詢,支持 % 和 _ 匹配
% 匹配任意個字符(當然也可以為 0 個字符)
_ 匹配任意一個字符
( 如果查找的字符中有 _ 或 %,可用 \ 轉義符號)
運算子之間有優先級,例 and 的優先級要大于 or ,可用 ( ) 來調整執行順序
排序( order by )
order by 欄位名 (默認為升序)
指定降序:order by 欄位名 desc;
指定升序:order by 欄位名 asc;
按多個欄位排序:order by 欄位1 升或降 , 欄位2 升或降 , … ( 先用欄位1排,若相同,則按欄位2排 )
也可按照欄位的位置排:order by 3 ( 用查詢結果的第二列排,但很少這么寫,欄位的順序可能會變 )
取部分結果( limit )
將查詢的結果集只取一部分,可用于分頁查詢,也可在部分情況代替分組函式 max ,min
limit 起始下標(從零開始) , 長度
limit 長度
(下面一種默認其實下標為 0 )
去重( distinct )
注意:distinct 只能出現在所有欄位的前面,否則會有語法錯誤,當 distinct 出現在多個欄位前面,表示多個欄位聯合起來去重(如果需要對多個欄位中的一個去重,需要之后的知識,暫時不提)
例:
select distinct name , age from table_1; 對
select name , distinct age from table_1; 錯
它會把 distinct 當作欄位名,age 當作別名,沒法正確匹配
函式
函式分為單行處理函式(資料處理函式)和多行處理函式(分組函式)
常見單行處理函式(一個輸入對應一個輸出)
- lower :轉換小寫
- upper :轉換大寫
- substr :取子字串( substr(被截取的字串 , 起始下標 , 截取長度 ) )
- length :取長度
- trim :去空格
- str_to_date :將字串轉換為日期
- date_format :格式化日期( 將 date 型別轉換為具有一定格式的 varchar 字串型別)
- format :設定千分位
- round :四舍五入( round(被處理的數字 , 位數(-2 :百位,-1 :十位,0 :個位,1 :一位小數 ,2 :2位小數 …) )
- rand :生成亂數
- ifnull :將 null 轉換成一個具體值( ifnull(資料 , 為 null 時被當作的值) )
- concat :字串拼接
- case…when…then…when…then…else…end :則 資料為…時,則…,為…時,則…,否則…
- timestampdiff :根據單位回傳時間差( timestampdiff(單位 , 開始時間 , 結束時間) )
單位可為:year,quarter,month,week,day,hour,minute,second,microsecond
查詢結果為 date / datetime 型別時 ( data_format )
data_format 用于 date 轉 varchar 型別,通常用于查詢
- data_format ( date 型別 , ’ %Y , %m , %d ’ )
- data_format ( date 型別 )
這一種默認轉換為 ’ %Y - %m - %d ’
只是在你想讓 時間資料 的格式不同的時候使用,不使用一樣能查詢
datetime 與 date 一樣,只不過默認格式不同 ( %Y - %m - %d %H : %i : %s )
常用多行處理函式(多個輸入對應一個輸出)
- count :計數
- sum :求和
- avg :平均值
- max :最大值
- min :最小值
為什么叫分組函式?
十分重要:因為分組函式在使用之前需要先進行分組,然后才能使用,如果沒有對資料進行分組,則默認整張表為一組
分組函式需注意
- 分組函式自動忽略 NULL(不需要提前對 NULL 處理)
- count( 具體欄位 )和 count( * ) 不同,count( 具體欄位 )表示統計該欄位中所有不為 NULL 的資料數量,count( * )表示統計總行數(因為一行記錄中不可能都為 NULL ,只要其中有一個資料不為 NULL,則 +1)
- 分組函式不能用在 where 子句中(后面會說原因)
分組查詢( group by )
即先進行分組,然后對分好的進行查詢
select…from…group by… (group by 在 where 之后執行,在 select 之前執行)
注意:如果有 group by 陳述句,則 select 后只能跟參加分組的欄位,以及分組函式,select 后跟其他欄位是沒有意義的,甚至在其他資料庫中可能報錯
如果想要按 每種…的每種… 分類,則 group by … , …
我們可以把這看成將兩個欄位合成一個欄位來看(兩個欄位聯合分組)
過濾分組后的資料( having )
與 where 功能相同,但 having 在 group by 之后執行,where 在 group by 之前執行
having 不能單獨使用,必須和group by 搭配使用
關鍵字順序 和 執行順序( 十分十分重要! )
關鍵字順序:
- select …
- from …
- where …
- group by …
- having …
- order by…
- limit …
執行順序
- from …
- where …
- group by …
- having …
- select …
- order by …
- limit …
可以這么理解,我們先 from 選表,然后用 where 篩選,再 group by 分組,再 having 對分好組的資料進行進一步篩選,再 select 查詢,再 order by 對查詢的資料進行排序,最后 limit 取一部分結果
連接查詢( 多張表聯合起來查詢資料 )
(從一張表單獨查詢稱為單表查詢)
分類
連接查詢根據表連接的方式可以分為三種:內連接, 外連接,全連接
內連接分為:等值連接, 非等值連接,自連接
外連接分為:左外連接(左連接),右外連接(右連接)
連接方法
表中每一條與其他表的每一條都匹配一次,如果第一個表有 n 個,第二個表有 m 個,則需匹配 n * m 次( 因此盡量降低表連接次數,可以大幅提高效率 )
注意
在連接查詢中,我們通常在欄位名前都加上了 “表名.” ,這是為了避免混淆,因為有不止一張表連接,并不知道哪個欄位在哪張表上,如果不加上,則會在每個表中都找一遍該欄位,效率較低,
例:select table_1.name, table_2.sex from table_1 join table_2 on table_1.id = table_2.id
如果表名比較復雜,我們也可以起個別名
例:select t1.name, t2.sex from table_1 t1 join table_2 t2 on t1.id = t2.id
內連接( join 之前有個 inner ,可省略 )
等值連接( 即條件為等量關系)
select … from 表1 join 表2 on … = …
例 :select t1.name, t2.sex from table_1 t1 join table_2 t2 on t1.id = t2.id
非等值連接( 即條件不是等量關系)
select … from 表1 join 表2 on …(不是等量關系就行)
例:select t1.money , t2.age from table_1 t1 join table_2 t2 on t2.age >= t1.min;
自連接(即將一張表看為兩張表,自己和自己連接)
例:select t.a , tt.a from table_1 t join table_1 tt on t.b = tt.c
外連接( join 之前有個 outer ,可省略 )
外連接相比于內連接,表之間多了主次關系
右連接( join 之前有個 right ,不可省略 )
表示join關鍵字右邊的表為主表,主要為了將主表的資料全部查出來,捎帶關聯查詢左邊的表,即左表只會顯示符合搜索條件的記錄,而右表的記錄將會全部表示出來,左表記錄不足的地方均為NULL
左連接( join 之前有個 left ,不可省略 )
與右連接一樣,把右改為左即可
全連接( full join )
Oracle資料庫支持 full join ,MySQL不支持 full join ,但可以同過 左連接 + union + 右連接 實作
( union 后面會寫 )
多張表連接查詢
即:select … from a join b on a 和 b 的連接條件 join c on a 和 c 的連接條件…
雜談
連接查詢還可以按照語法的出現時間分類
例 SQL92 :1992年出現的語法, SQL99 :1999年出現的語法
我們上面寫的為 SQL99
但是有的文章寫的是 SQL92
例:select t1.name, t2.sex from table_1 t1 , table_2 t2 where t1.id = t2.id (SQL92)
其實就是沒有 join 與 on,這樣并不好,因為表的連接條件和篩選條件都放在where之后,這樣陳述句結構并不清晰
合并查詢結果( union /union all )
union :對兩個結果集進行并集操作,不包括重復行,同時進行默認規則的排序;
union all :對兩個結果集進行并集操作,包括重復行,不進行排序
( 使用union 比較費時,因為要去掉完全相同的重復行 )
例: (select id,name from A ) union all (select id,name from B )
注意:
1.通過 union 進行合并時的列數必須相同
2.不要求合并的表列名稱相同,以第一個表的列名為準
3.合并時,列和列的資料型別需要相同,如果不同 MySQL 不會報錯,但是 Oracle 會報錯
子查詢( 即 select 陳述句嵌套 select 陳述句 )
子查詢可以出現在 select … , where … , from … 后面
出現在 select 中
例:select … , (select …) from … ;
注意:對于 select 后面的子查詢,該子查詢只能范圍一條結果,否則就相當于一條資料匹配了多條資料,會報錯
出現在 where 中
可以將子查詢結果當作篩選條件
例:我們where中不能出現分組函式,所以我們可以換個思路,利用子查詢完成該功能
select name , age from table_1 where age > ( select avg(age) from table_1 )
出現在 from 中
可以將子查詢的結果當作一張臨時表
例:select … from table_1 join (select …) table_2 on …
注意:這種派生表必須有別名,或者報錯
重點
我們要記住重要的一點,select 永遠不會進行修改表內資料的操作,只是查詢時顯示的不同罷了
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/357193.html
標籤:其他
上一篇:關于MyBatis的一些總結
