快速掌握MySQL資料庫中SELECT語句

2020-12-26 站長之家

本文針對MySQL資料庫中的SELECT語句快速精細掌握。

  MySQL中SELECT語句的基本語法是:

以下是引用片段:
SELECT [STRAIGHT_JOIN] [SQL_SMALL_RESULT]
[SQL_BIG_RESULT] [HIGH_PRIORITY]
[DISTINCT|DISTINCTROW|ALL]
select_list
[INTO {OUTFILE|DUMPFILE} 'file_name' export_options]
 [FROM table_references [WHERE where_definition]
 [GROUP BY col_name,...] [HAVING where_definition]
[ORDER BY {unsighed_integer|col_name|formura} [ASC|DESC],...]
[LIMIT [offset,] rows] [PROCEDURE procedure_name]]


  從這個基本語法可以看出,最簡單的SELECT語句是SELECT select_list,實際上利用這個最簡單的SELECT語句,你也可以完成許多你期待的功能,首先你能利用它進行MySQL所支持的任何運算,例如:SELECT 1+1,它將返回2;其次,你也能利用它給變量賦值,而在PHP中,運用SELECT語句的這種功能,你就可以自由地運用MySQL的函數為PHP程序進行各種運算,並賦值給變量。在很多的時候,你會發現MySQL擁有許多比PHP更為功能強大的函數。

  STRAIGHT_JOIN、SQL_SMALL_RESULT、SQL_BIG_RESULT、HIGH_PRIORITY是MySQL對ANSI SQL92的擴展。如果優化器以非最佳次序聯結表,使用STRAIGHT_JOIN可以加快查詢。

  SQL_SMALL_RESULT和SQL_BIG_RESULT是一組相對的關鍵詞。它們必須與GROUP BY、DISTINCT或DISTINCTROW一起使用。SQL_SMALL_RESULT告知優化器結果會很小,要求MySQL使用臨時表存儲最終的表而不是使用排序;反之,SQL_BIG_RESULT告知優化器結果會很小,要求MySQL使用排序而不是做臨時表。

  HIGH_PRIORITY將賦予SELECT比一個更新表的語句更高的優先級,使之可以進行一次優先的快速的查詢。

  以上四個關鍵詞的使用方法的確比較晦澀。幸運的是,在絕大多數情況下,在MySQL中我們完全可以選擇不使用這四個關鍵詞。

  DISTINCT、DISTINCTROW對查詢返回的結果集提供了一個最基本但是很有用的過濾。那就是結果集中只含非重複行。在這裡要注意的是,對關鍵詞DISTINCT、DISTINCTROW來說,空值都是相等的,無論有多少NULL值,只選擇一個。而ALL的用法就有畫蛇添足之嫌了。它對結果集的產生沒有任何影響。

  INTO {OUTFILE|DUMPFILE} 'file_name' export_options,將結果集寫入一個文件。文件在伺服器主機上被創建,並且不能是已經存在的。語句中的export_options部分的語法與用在LOAD DATAINFILE語句中的FIELDS和LINES子句中的相同,我們將在MySQL進階_LOAD DATA篇中詳細討論它。而OUTFILE與DUMPFILE的關鍵字的區別是:後前只寫一行到文件,並沒有任何列或行結束。

  select list:其中可以包含一項或多項下列內容:

  1、「*」,表示按照create table的順序排列的所有列。

  2、按照用戶所需順序排列的列名的清單。

  3、可以使用別名取代列名,形式如下:column name as column_heading。

  4、表達式(列名、常量、函數,或以算術或逐位運算符連接的列名、常量和函數的任何組合)。

  5、內部函數或集合函數。

  6、上述各項的任何一種組合。

  FROM:決定SELECT命令中使用哪些表。一般都要求有此項,除非select_list中不含列名(例如,只有常量、算術表達式等)。如果表項中有多個表,用逗號將之分開。在關鍵詞FROM後面的表的順序不影響結果。

  表名可以給出相關別名,以便使表達清晰。這裡的語法是tbl_name [AS] alias_name。例如:

  select t1.name,t2.salary from employee as t1,info as t2 where t1.name=t2.name與select t1.name,t2.salary from employee t1,info t2 where t1.name=t2.name是完全等價的。

  所有對該表的其他引用,例如在where子句和having子句中,都要用別名,別名不能以數字開頭。

  where子句設置了搜索條件,它在insert,update,delete語句中的應用方法也與在select語句中的應用方法完全相同。搜索條件緊跟在關鍵詞where的後面。如果用戶要在語句中使用多個搜索條件,則可用and或or連接。搜索條件的基本語法是[not] expression comparison_operator expression;[not] expression [not] like 「match_string」;[not] expression is [not] null;[not] expression [not] between expression and expression;[not] column_name join_operator column_name;[not] boolean_expression。

  and:用來聯結兩個條件,並在兩個條件都是TRUE的時候返回結果。當在同一語句中使用多個邏輯運算符時,and運算符總是最優先,除非用戶用括號改變了運算順序。

  or:用來聯結兩個條件,當兩個條件中有任一條件是TRUE的時候返回結果。當在同一語句中使用多個邏輯運算符時,運算符or通常在運算符and之後進行運算。當然用戶可以使用括號改變運算的順序。

  between:用來標識範圍下限的關鍵詞,and後面跟範圍上限的值。範圍where @val between x and y包含首尾值。如果between後面指定的第一個值大於第二個值,則該查詢不返回任何行。

  column_name:在比較中使用的列名。在會產生歧義時,一定要指明列所在的表名。

  comparison_operator:比較運算符。見下表:

以下是引用片段:
符號   意義
=      等於
>      大於
<      小於
>=     大於等於
<=     小於等於
!=     不等於
<>     不等於


  在比較char,varchar型數據時,「<」的意思是更接近字母表頭部,「>」代表更接近字母表尾部。一般來說,小寫字母大於大寫字母,大寫字母大於數字,但是這可能依賴於伺服器上作業系統的比較順序。

  在比較時,末尾的空格是被忽略的。例如,「Dirk」等於「Dirk 」。

  在比較日期時,「<」表示早於,「>」表示晚於。

  在使用比較運算符比較character和datetime數據時,需用引號將所有數據引起來。

  expression:可能是列名、常數、函數或者是列名或常數的任意組合,以及以算術運算符或逐位運算符連接的函數。算術運算符如下表所示:

以下是引用片段:
符號   意義
+      加號
-      減號   
*      乘號
/      除號

  is null:在搜索一個NULL值時使用。

  like:關鍵詞,對char、varchar和datetime(不包括秒和毫秒)可以使用like,在MySQL中like也可以用在數字的表達式上。

  當用戶在搜索datetime型數據時,最好是使用關鍵詞like,因為完整的datetime記錄包含各種各樣的日期組件。例如用戶在列arrival_time中加入一個值「9:20」,而子句where arrival_time=「9:20」卻沒有發現它,因為MySQL把錄入的數據轉換成了「Jan 1,1900 9:20AM」。然而子句where arrival_time like「%9:20%」就能找到它。

  boolean_expression:返回「true」或「false」值的表達式。

  match_string:由字符和通配符組成的串,用單引號或雙引號引起來,是匹配模式。通配符如下表所示:

以下是引用片段:
符號       意義
%          0或多個字符的字符串
_           任何一單個字符
not:     否定任何邏輯表達式,或是關鍵詞,
             如like,null,between等。
group    by和having子句在select語句中使用,
              可以將表劃分成組並返回匹配having子句條件的組。
語法:select語句開頭
group by [all] aggregate_free_expression [,aggregate_free_expression]*
[having search_conditions]


  select語句結尾

  group by:指定表將劃分的組群,如果在select表項中包含集合函數,則為各組計算一個總計值。這些總計值的結果以新的列顯示,而不是新的行。在having子句中用戶可以引用這些新的總計列。在group by之前的select_list中可以使用avg、count、max、min和sum等集合

在你的工作中是否會為了某個活動要隨機取出一些符合條件的EMAIL或者手機號碼用戶,來頒發獲獎通知或其它消息?本文以實例的方式來講解如何抽取隨機數的多種方法。

  如果是的話,可以用oracle裡生成隨機數的PL/SQL, 目錄文件名在:/ORACLE_HOME/rdbms/admin/dbmsrand.sql。

  用之前先要在sys用戶下編譯:SQL>@/ORACLE_HOME/rdbms/admin/dbmsrand.sql。

  它實際是在sys用戶下生成一個dbms_random程序包,同時生成公有同義詞,並授權給所有資料庫用戶有執行的權限。

  使用dbms_random程序包, 取出隨機數據的方法:

  1. 先創建一個唯一增長的序列號tmp_id:

以下是引用片段:
create sequence tmp_id increment by 1 start with 1 maxvalue 9999999 nocycle nocache;


  2. 然後創建一個臨時表tmp_1,把符合本次活動條件的記錄全部取出來:

以下是引用片段:
create table tmp_1 as select tmp_id.nextval as id, email,mobileno from 表名 where 條件;


  找到最大的id號:select max(id) from tmp_1;。

  3. 設定一個生成隨機數的種子:

以下是引用片段:
execute dbms_random.seed(12345678); 或者 execute dbms_random.seed (TO_CHAR(SYSDATE,'MM-DD-YYYY HH24:MI:SS'));

  4. 調用隨機數生成函數dbms_random.value生成臨時表tmp_2(假設隨機取200個):

以下是引用片段:
create table tmp_2 as select trunc (dbms_random.value(1,5000)) as id from tmp_1 where rownum<201;


  [ 說明:dbms_random.value(1,5000)是取1到5000間的隨機數,會有小數,

  trunc函數對隨機數字取整,才能和臨時表的整數ID欄位相對應。

  注意:如果tmp_1記錄比較多(10萬條以上),也可以找一個約大於兩百行的表(假如是tmp_3)來生成tmp_2

以下是引用片段:
create table tmp_2 as select trunc(dbms_random.value(1,5000)) as id from tmp_3 where rownum<201; ]


  5. tmp_1和tmp_2相關聯取得符合條件的200用戶

以下是引用片段:
select t1.mobileno,t1.email from tmp_1 t1,
tmp_2 t2 where t1.id=t2.id;


  [ 注意:如果tmp_1記錄比較多(10萬條以上),需要在id欄位上建索引。]

  也可以輸出到文本文件:

以下是引用片段:
set pagesize 300;
spool /tmp/200.txt;
select t1.mobileno,t1.email from tmp_1 t1,
tmp_2 t2 where t1.id=t2.id order by t1.mobileno;
spool off;


  6. 用完後,刪除臨時表tmp_1、tmp_2和序列號tmp_id。

本文整理於網際網路,歡迎原文作者來信署名版權 zujizhe@chinaz.com

相關焦點

  • 新手入門MYSQL資料庫命令大全
    一、命令行連接資料庫Windows作業系統進入CMD命令行,進入mysql.exe所在目錄,運行命令mysql.exe -h主機名 -u用戶名 -p密碼注意:參數名與值之間沒有空格 , 如:-h127.0.0.1
  • 【資料庫】MySQL常見SQL語句
    FROM 『username』@』%』;命令並不能撤銷該用戶對testDB資料庫中user表的SELECT 操作。相反,如果授權使用的是GRANT SELECT ON . TO 『username』@』%』;則REVOKE SELECT ON testDB.user FROM 『username』@』%』;命令也不能撤銷該用戶對testDB資料庫中user表的Select 權限。
  • MySQL 工作、底層原理,看這一篇就夠了!
    它根據MySql AB公司提供的文件訪問層的一個抽象接口來定製一種文件訪問機制(這種訪問機制就叫存儲引擎)SQL 語句執行過程資料庫通常不會被直接使用,而是由其他程式語言通過SQL語句調用mysql,由mysql處理並返回執行結果。那麼Mysql接受到SQL語句後,又是如何處理?
  • 資料庫設計說明書:Mysql資料庫如何快速生成表結構到word文檔
    前言參與過大型項目開發的同學應該都知道,一個項目從需求到設計,再到開發、測試和驗收,而過程文檔不免要完成需求規格說明書、資料庫設計說明書、接口設計說明書等,理論上講,應該是先有了資料庫設計說明書再有資料庫表結構的設計,但是實際在開發中,肯定有些情況下是先設計出了資料庫表一邊開發著一邊再來補充資料庫設計說明書
  • 資料庫常用的sql語句匯總(2)
    資料庫相關查所有資料庫 show databases;創建資料庫 create database db1;查看資料庫show create database db1;創建資料庫指定字符集 create database db1 character set utf8/gbk刪除資料庫 drop database db1;使用資料庫 use db1;
  • 因用了Insert into select語句,同事被開除了!
    Insert into select 請慎用,同事因為使用了 Insert into select 語句引發了重大生產事故,最後被開除。某天 xxx 接到一個需求,需要將表 A 的數據遷移到表 B 中去做一個備份。
  • DTCC:MySQl核心代碼開發經驗揭示
    此次大會得到了全國資料庫技術高手們的高度關注與支持,是當前象徵最高技術水平的資料庫工程師盛會。  測試用例在Bug提交過程中起到非常重要的作用  MysQL測試框架簡介  MysQL測試框架的基本思想是比較(diff)運行測試產生的輸出和預先保存好的預期效果。每一測試包含一個測試文件(test)和一個結果文件(result)。測試文件中可以使用SQL語句和mysQLtest指令。
  • 京東面試:說說MySQL的架構體系
    客戶端的連結支持的協議很多,比如我們在 Java 開發中的 JDBC。服務層連接池主要是負責存儲和管理客戶端與資料庫的連結,一個線程負責管理一個連接。自從引入了連接池以後,官方報導:當資料庫的連接數達到128後,使用連接池與沒有連接池的性能是提升了n倍(反正就是性能大大的提升了)。連接建立完成後,就可以執行select語句了。
  • 備份恢復,DBA最後一道防線,你完全掌握了嗎?
    在一次遷移升級過程中,bug導致資料庫無法啟動 需要找回前兩天的數據 雲平臺全面癱瘓,雖然出現概率很小 這時可以通過之前備份+binglog進行恢復數據。 備份的目的是發生災難時進行恢復。
  • MySQL 中 delete、truncate、drop 關鍵字的區別有哪些,該如何選擇?
    一、從執行速度上來說drop > truncate >> DELETE二、從原理上講1、DELETEDELETEfrom TABLE_NAME where xxx1)DELETE屬於資料庫DML操作語言,只刪除數據不刪除表的結構,會走事務,執行時會觸發trigger;2)在 InnoDB 中,DELETE
  • 歐洲最大MySQL用戶Booking.com資料庫構架探秘!
    從伺服器會根據不同的應用程式種類劃分到不同的資料庫池裡面,從而提供讀的請求。之所以會分成不同的資料庫池,也是因為請求是分優先級的,而且請求的數量級也不通。以圖裡面的兩個資料庫池為例,一個是frontend-pool,這一類型的SQL語句一般都比較簡短,而且對響應速度要求很高。而第二個cronjob-pool 一般是一些定時任務的語句。
  • Prometheus 監控MySQL資料庫
    Prometheus 監控mysql容器Prometheus這裡我們演示中,prometheus以及mysqld_exporter都使用容器進行運行。這裡我為了保證後期文檔可用性,將mysqld_exporter和node_exporter都傳到我的倉庫中,下面有直接下載的方法Docker Install安裝docker版本使用19.06,使用腳本一鍵安裝19.03版本需要最新的Linux 5.x內核支持,如果達不到升級的條件可以使用
  • 工作中,我們經常用到哪些SQL語句呢?
    工作中我們基本上每天都要與資料庫打交道,資料庫的知識點呢也特別多,全部記住呢也是不可能的,也沒必要把所有的記住(有些語句命令可能我們一輩子都用不到)。所以呢在工作之餘,把工作中經常用到的一些語句整理出來,忘記的時候可以當做字典來查。個人在工作中用Oracle資料庫比較多,就以關係型資料庫Oracle為例進行整理,後面可能會整理一些非關係型資料庫,如mogodb之類的。
  • mysql-proxy資料庫中間件架構 | 架構師之路
    ,上遊可接入若干個mysql-client,後端可連接若干個mysql-server。所以說,根本上,mysql-proxy是一個官方提供的框架,具備良好的擴展性,可以用來完成:sql攔截與修改性能分析與監控讀寫分離請求路由...這個框架提供了6個hook點,能夠讓用戶能夠動態的介入到client與server中的通訊中去。
  • SpringBoot + MyBatis + MySQL讀寫分離實踐!
    引言讀寫分離要做的事情就是對於一條SQL該選擇哪個資料庫去執行,至於誰來做選擇資料庫這件事兒,無非兩個,要麼中間件幫我們做,要麼程序自己做。因此,一般來講,讀寫分離有兩種實現方式。第一種是依靠中間件(比如:MyCat),也就是說應用程式連接到中間件,中間件幫我們做SQL分離;第二種是應用程式自己去做分離。
  • 面試官靈魂一問:MySQL 的 delete、truncate、drop 有什麼區別?
    ;2、在 InnoDB 中,DELETE其實並不會真的把數據刪除,mysql 實際上只是給刪除的數據打了個標記為已刪除,因此 delete 刪除表中的數據時,表文件在磁碟上所佔空間不會變小,存儲空間不會被釋放,只是把刪除的數據行設置為不可見。
  • 您的包裹「 MySQL靈魂十連」 待籤收
    主從同步流程:主節點必須啟用二進位日誌,記錄任何修改了資料庫數據的事件。從節點開啟一個線程(I/O Thread)把自己扮演成 mysql 的客戶端,通過 mysql 協議,請求主節點的二進位日誌文件中的事件 。
  • 《MySQL慢查詢優化》之SQL語句及索引優化
    1、慢查詢優化方式伺服器硬體升級優化Mysql伺服器軟體優化資料庫表結構優化SQL語句及索引優化>本文重點關注於SQL語句及索引優化,關於其他優化方式以及索引原理等,請關注本人《MySQL慢查詢優化》系列博文。
  • MySQL基於MHA的FailOver過程
    MHA FailOver過程詳解什麼是FailOver故障轉移主庫宕機,一直到業務恢復正常的處理過程如何處理FailOver1.快速監控到主庫宕機2.選擇新主節點,選擇策略mysqladmin ping檢查資料庫狀態,主機狀態,埠等,判斷從庫節點讀取的master_log_file及read_master_log_pos節點大小,查看Retrieved_gtid_set(已接收到的gtid大小),executed_gtid_set(已執行的
  • 資料庫管理工具DataGrip安裝使用
    簡介DataGrip是jetbrains旗下的一款資料庫管理工具,idea就是這家公司發明的,相比Navicat智能代碼補全,實時分析快速修復,數據可視化功能更方便人員操作。運行軟體,點擊激活窗口的Evaluate for free免費試用3.進入軟體,菜單欄Help中選擇Edit Custom VM Options,末尾添加:-javaagent:DataGrip的安裝目錄\jetbrains-agent.jar,後退出軟體。