主頁 > 資料庫 > 資料庫基礎筆記(MySQL)2 —— 基礎查詢

資料庫基礎筆記(MySQL)2 —— 基礎查詢

2021-11-15 12:13:52 資料庫

查詢資料庫資訊

  1. 查詢 MySQL資料庫 的版本號
    select version();
  2. 查看當前使用的資料庫
    select database();

查詢表結構

  1. 查詢表結構(desc 是 describe 的縮寫)
    desc(或describe) 表名;

簡單查詢

  1. 查詢指定欄位的資料( 可以是一個欄位,也可以是多個欄位,欄位之間逗號隔開 )
    select 欄位1 , 欄位2 , 欄位3… from 表名;
  2. 查詢所有欄位
    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…
( <,<=,>,>= ,這四個就不說了,就是你們認為的意思)

  1. <> (或 !=):不等于
  2. is null :為 null(is not null 則不為 null )
  3. in :包含,相當于多個 or ( not in 則不在范圍內 )
  4. not :取非,主要用于 is 和 in 中
  5. = :等于
  6. and :且
  7. or :或
  8. between…and… :兩個值之間,相當于 >= and <=
  9. 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 當作別名,沒法正確匹配

函式

函式分為單行處理函式(資料處理函式)和多行處理函式(分組函式)

常見單行處理函式(一個輸入對應一個輸出)

  1. lower :轉換小寫
  2. upper :轉換大寫
  3. substr :取子字串( substr(被截取的字串 , 起始下標 , 截取長度 ) )
  4. length :取長度
  5. trim :去空格
  6. str_to_date :將字串轉換為日期
  7. date_format :格式化日期( 將 date 型別轉換為具有一定格式的 varchar 字串型別)
  8. format :設定千分位
  9. round :四舍五入( round(被處理的數字 , 位數(-2 :百位,-1 :十位,0 :個位,1 :一位小數 ,2 :2位小數 …) )
  10. rand :生成亂數
  11. ifnull :將 null 轉換成一個具體值( ifnull(資料 , 為 null 時被當作的值) )
  12. concat :字串拼接
  13. case…when…then…when…then…else…end :則 資料為…時,則…,為…時,則…,否則…
  14. timestampdiff :根據單位回傳時間差( timestampdiff(單位 , 開始時間 , 結束時間) )
    單位可為:year,quarter,month,week,day,hour,minute,second,microsecond

查詢結果為 date / datetime 型別時 ( data_format )

data_format 用于 date 轉 varchar 型別,通常用于查詢

  1. data_format ( date 型別 , ’ %Y , %m , %d ’ )
  2. data_format ( date 型別 )
    這一種默認轉換為 ’ %Y - %m - %d ’

只是在你想讓 時間資料 的格式不同的時候使用,不使用一樣能查詢

datetime 與 date 一樣,只不過默認格式不同 ( %Y - %m - %d %H : %i : %s )

常用多行處理函式(多個輸入對應一個輸出)

  1. count :計數
  2. sum :求和
  3. avg :平均值
  4. max :最大值
  5. min :最小值

為什么叫分組函式?

十分重要:因為分組函式在使用之前需要先進行分組,然后才能使用,如果沒有對資料進行分組,則默認整張表為一組

分組函式需注意

  1. 分組函式自動忽略 NULL(不需要提前對 NULL 處理)
  2. count( 具體欄位 )和 count( * ) 不同,count( 具體欄位 )表示統計該欄位中所有不為 NULL 的資料數量,count( * )表示統計總行數(因為一行記錄中不可能都為 NULL ,只要其中有一個資料不為 NULL,則 +1)
  3. 分組函式不能用在 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 搭配使用

關鍵字順序 和 執行順序( 十分十分重要! )

關鍵字順序:

  1. select …
  2. from …
  3. where …
  4. group by …
  5. having …
  6. order by…
  7. limit …

執行順序

  1. from …
  2. where …
  3. group by …
  4. having …
  5. select …
  6. order by …
  7. 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的一些總結

下一篇:資料庫中的欄位varchar型別和char型別的區別?

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • GPU虛擬機創建時間深度優化

    **?桔妹導讀:**GPU虛擬機實體創建速度慢是公有云面臨的普遍問題,由于通常情況下創建虛擬機屬于低頻操作而未引起業界的重視,實際生產中還是存在對GPU實體創建時間有苛刻要求的業務場景。本文將介紹滴滴云在解決該問題時的思路、方法、并展示最終的優化成果。 從公有云服務商那里購買過虛擬主機的資深用戶,一 ......

    uj5u.com 2020-09-10 06:09:13 more
  • 可編程網卡芯片在滴滴云網路的應用實踐

    **?桔妹導讀:**隨著云規模不斷擴大以及業務層面對延遲、帶寬的要求越來越高,采用DPDK 加速網路報文處理的方式在橫向縱向擴展都出現了局限性。可編程芯片成為業界熱點。本文主要講述了可編程網卡芯片在滴滴云網路中的應用實踐,遇到的問題、帶來的收益以及開源社區貢獻。 #1. 資料中心面臨的問題 隨著滴滴 ......

    uj5u.com 2020-09-10 06:10:21 more
  • 滴滴資料通道服務演進之路

    **?桔妹導讀:**滴滴資料通道引擎承載著全公司的資料同步,為下游實時和離線場景提供了必不可少的源資料。隨著任務量的不斷增加,資料通道的整體架構也隨之發生改變。本文介紹了滴滴資料通道的發展歷程,遇到的問題以及今后的規劃。 #1. 背景 資料,對于任何一家互聯網公司來說都是非常重要的資產,公司的大資料 ......

    uj5u.com 2020-09-10 06:11:05 more
  • 滴滴AI Labs斬獲國際機器翻譯大賽中譯英方向世界第三

    **桔妹導讀:**深耕人工智能領域,致力于探索AI讓出行更美好的滴滴AI Labs再次斬獲國際大獎,這次獲獎的專案是什么呢?一起來看看詳細報道吧! 近日,由國際計算語言學協會ACL(The Association for Computational Linguistics)舉辦的世界最具影響力的機器 ......

    uj5u.com 2020-09-10 06:11:29 more
  • MPP (Massively Parallel Processing)大規模并行處理

    1、什么是mpp? MPP (Massively Parallel Processing),即大規模并行處理,在資料庫非共享集群中,每個節點都有獨立的磁盤存盤系統和記憶體系統,業務資料根據資料庫模型和應用特點劃分到各個節點上,每臺資料節點通過專用網路或者商業通用網路互相連接,彼此協同計算,作為整體提供 ......

    uj5u.com 2020-09-10 06:11:41 more
  • 滴滴資料倉庫指標體系建設實踐

    **桔妹導讀:**指標體系是什么?如何使用OSM模型和AARRR模型搭建指標體系?如何統一流程、規范化、工具化管理指標體系?本文會對建設的方法論結合滴滴資料指標體系建設實踐進行解答分析。 #1. 什么是指標體系 ##1.1 指標體系定義 指標體系是將零散單點的具有相互聯系的指標,系統化的組織起來,通 ......

    uj5u.com 2020-09-10 06:12:52 more
  • 單表千萬行資料庫 LIKE 搜索優化手記

    我們經常在資料庫中使用 LIKE 運算子來完成對資料的模糊搜索,LIKE 運算子用于在 WHERE 子句中搜索列中的指定模式。 如果需要查找客戶表中所有姓氏是“張”的資料,可以使用下面的 SQL 陳述句: SELECT * FROM Customer WHERE Name LIKE '張%' 如果需要 ......

    uj5u.com 2020-09-10 06:13:25 more
  • 滴滴Ceph分布式存盤系統優化之鎖優化

    **桔妹導讀:**Ceph是國際知名的開源分布式存盤系統,在工業界和學術界都有著重要的影響。Ceph的架構和演算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat、SUSE、Intel等大公司的大力支持。Ceph是國際云計算領域應用最廣泛的開源分布式存盤系統, ......

    uj5u.com 2020-09-10 06:14:51 more
  • es~通過ElasticsearchTemplate進行聚合~嵌套聚合

    之前寫過《es~通過ElasticsearchTemplate進行聚合操作》的文章,這一次主要寫一個嵌套的聚合,例如先對sex集合,再對desc聚合,最后再對age求和,共三層嵌套。 Aggregations的部分特性類似于SQL語言中的group by,avg,sum等函式,Aggregation ......

    uj5u.com 2020-09-10 06:14:59 more
  • 爬蟲日志監控 -- Elastc Stack(ELK)部署

    傻瓜式部署,只需替換IP與用戶 導讀: 現ELK四大組件分別為:Elasticsearch(核心)、logstash(處理)、filebeat(采集)、kibana(可視化) 下載均在https://www.elastic.co/cn/downloads/下tar包,各組件版本最好一致,配合fdm會 ......

    uj5u.com 2020-09-10 06:15:05 more
最新发布
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:33:24 more
  • MySQL中binlog備份腳本分享

    關于MySQL的二進制日志(binlog),我們都知道二進制日志(binlog)非常重要,尤其當你需要point to point災難恢復的時侯,所以我們要對其進行備份。關于二進制日志(binlog)的備份,可以基于flush logs方式先切換binlog,然后拷貝&壓縮到到遠程服務器或本地服務器 ......

    uj5u.com 2023-04-20 08:28:06 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:27:27 more
  • 快取與資料庫雙寫一致性幾種策略分析

    本文將對幾種快取與資料庫保證資料一致性的使用方式進行分析。為保證高并發性能,以下分析場景不考慮執行的原子性及加鎖等強一致性要求的場景,僅追求最終一致性。 ......

    uj5u.com 2023-04-20 08:26:48 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:26:35 more
  • 云時代,MySQL到ClickHouse資料同步產品對比推薦

    ClickHouse 在執行分析查詢時的速度優勢很好的彌補了MySQL的不足,但是對于很多開發者和DBA來說,如何將MySQL穩定、高效、簡單的同步到 ClickHouse 卻很困難。本文對比了 NineData、MaterializeMySQL(ClickHouse自帶)、Bifrost 三款產品... ......

    uj5u.com 2023-04-20 08:26:29 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:25:13 more
  • Redis 報”OutOfDirectMemoryError“(堆外記憶體溢位)

    Redis 報錯“OutOfDirectMemoryError(堆外記憶體溢位) ”問題如下: 一、報錯資訊: 使用 Redis 的業務介面 ,產生 OutOfDirectMemoryError(堆外記憶體溢位),如圖: 格式化后的報錯資訊: { "timestamp": "2023-04-17 22: ......

    uj5u.com 2023-04-20 08:24:54 more
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:24:03 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:23:11 more