快速掌握MySQL數(shù)據(jù)庫中SELECT語句_PHP教程
推薦:用PHP程序?yàn)樽约壕W(wǎng)站打造一個(gè)搜索引擎一、設(shè)計(jì)搜索表單 在網(wǎng)站的根目錄下建個(gè)search.htm,內(nèi)容如下 以下為引用的內(nèi)容: <html> <head> <title>搜索表單</title&g
本文針對(duì)MySQL數(shù)據(jù)庫中的SELECT語句快速精細(xì)掌握。
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]]
從這個(gè)基本語法可以看出,最簡(jiǎn)單的SELECT語句是SELECT select_list,實(shí)際上利用這個(gè)最簡(jiǎn)單的SELECT語句,你也可以完成許多你期待的功能,首先你能利用它進(jìn)行MySQL所支持的任何運(yùn)算,例如:SELECT 1 1,它將返回2;其次,你也能利用它給變量賦值,而在PHP中,運(yùn)用SELECT語句的這種功能,你就可以自由地運(yùn)用MySQL的函數(shù)為PHP程序進(jìn)行各種運(yùn)算,并賦值給變量。在很多的時(shí)候,你會(huì)發(fā)現(xiàn)MySQL擁有許多比PHP更為功能強(qiáng)大的函數(shù)。
STRAIGHT_JOIN、SQL_SMALL_RESULT、SQL_BIG_RESULT、HIGH_PRIORITY是MySQL對(duì)ANSI SQL92的擴(kuò)展。如果優(yōu)化器以非最佳次序聯(lián)結(jié)表,使用STRAIGHT_JOIN可以加快查詢。
SQL_SMALL_RESULT和SQL_BIG_RESULT是一組相對(duì)的關(guān)鍵詞。它們必須與GROUP BY、DISTINCT或DISTINCTROW一起使用。SQL_SMALL_RESULT告知優(yōu)化器結(jié)果會(huì)很小,要求MySQL使用臨時(shí)表存儲(chǔ)最終的表而不是使用排序;反之,SQL_BIG_RESULT告知優(yōu)化器結(jié)果會(huì)很小,要求MySQL使用排序而不是做臨時(shí)表。
HIGH_PRIORITY將賦予SELECT比一個(gè)更新表的語句更高的優(yōu)先級(jí),使之可以進(jìn)行一次優(yōu)先的快速的查詢。
以上四個(gè)關(guān)鍵詞的使用方法的確比較晦澀。幸運(yùn)的是,在絕大多數(shù)情況下,在MySQL中我們完全可以選擇不使用這四個(gè)關(guān)鍵詞。
DISTINCT、DISTINCTROW對(duì)查詢返回的結(jié)果集提供了一個(gè)最基本但是很有用的過濾。那就是結(jié)果集中只含非重復(fù)行。在這里要注意的是,對(duì)關(guān)鍵詞DISTINCT、DISTINCTROW來說,空值都是相等的,無論有多少NULL值,只選擇一個(gè)。而ALL的用法就有畫蛇添足之嫌了。它對(duì)結(jié)果集的產(chǎn)生沒有任何影響。
INTO {OUTFILE|DUMPFILE} 'file_name' export_options,將結(jié)果集寫入一個(gè)文件。文件在服務(wù)器主機(jī)上被創(chuàng)建,并且不能是已經(jīng)存在的。語句中的export_options部分的語法與用在LOAD DATAINFILE語句中的FIELDS和LINES子句中的相同,我們將在MySQL進(jìn)階_LOAD DATA篇中詳細(xì)討論它。而OUTFILE與DUMPFILE的關(guān)鍵字的區(qū)別是:后前只寫一行到文件,并沒有任何列或行結(jié)束。
select list:其中可以包含一項(xiàng)或多項(xiàng)下列內(nèi)容:
1、“*”,表示按照create table的順序排列的所有列。
2、按照用戶所需順序排列的列名的清單。
3、可以使用別名取代列名,形式如下:column name as column_heading。
4、表達(dá)式(列名、常量、函數(shù),或以算術(shù)或逐位運(yùn)算符連接的列名、常量和函數(shù)的任何組合)。
5、內(nèi)部函數(shù)或集合函數(shù)。
6、上述各項(xiàng)的任何一種組合。
FROM:決定SELECT命令中使用哪些表。一般都要求有此項(xiàng),除非select_list中不含列名(例如,只有常量、算術(shù)表達(dá)式等)。如果表項(xiàng)中有多個(gè)表,用逗號(hào)將之分開。在關(guān)鍵詞FROM后面的表的順序不影響結(jié)果。
表名可以給出相關(guān)別名,以便使表達(dá)清晰。這里的語法是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是完全等價(jià)的。
所有對(duì)該表的其他引用,例如在where子句和having子句中,都要用別名,別名不能以數(shù)字開頭。
where子句設(shè)置了搜索條件,它在insert,update,delete語句中的應(yīng)用方法也與在select語句中的應(yīng)用方法完全相同。搜索條件緊跟在關(guān)鍵詞where的后面。如果用戶要在語句中使用多個(gè)搜索條件,則可用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:用來聯(lián)結(jié)兩個(gè)條件,并在兩個(gè)條件都是TRUE的時(shí)候返回結(jié)果。當(dāng)在同一語句中使用多個(gè)邏輯運(yùn)算符時(shí),and運(yùn)算符總是最優(yōu)先,除非用戶用括號(hào)改變了運(yùn)算順序。
or:用來聯(lián)結(jié)兩個(gè)條件,當(dāng)兩個(gè)條件中有任一條件是TRUE的時(shí)候返回結(jié)果。當(dāng)在同一語句中使用多個(gè)邏輯運(yùn)算符時(shí),運(yùn)算符or通常在運(yùn)算符and之后進(jìn)行運(yùn)算。當(dāng)然用戶可以使用括號(hào)改變運(yùn)算的順序。
between:用來標(biāo)識(shí)范圍下限的關(guān)鍵詞,and后面跟范圍上限的值。范圍where @val between x and y包含首尾值。如果between后面指定的第一個(gè)值大于第二個(gè)值,則該查詢不返回任何行。
column_name:在比較中使用的列名。在會(huì)產(chǎn)生歧義時(shí),一定要指明列所在的表名。
comparison_operator:比較運(yùn)算符。見下表:
以下是引用片段:
符號(hào) 意義
= 等于
> 大于
< 小于
>= 大于等于
<= 小于等于
!= 不等于
<> 不等于
在比較char,varchar型數(shù)據(jù)時(shí),“<”的意思是更接近字母表頭部,“>”代表更接近字母表尾部。一般來說,小寫字母大于大寫字母,大寫字母大于數(shù)字,但是這可能依賴于服務(wù)器上操作系統(tǒng)的比較順序。
在比較時(shí),末尾的空格是被忽略的。例如,“Dirk”等于“Dirk ”。
在比較日期時(shí),“<”表示早于,“>”表示晚于。
在使用比較運(yùn)算符比較character和datetime數(shù)據(jù)時(shí),需用引號(hào)將所有數(shù)據(jù)引起來。
expression:可能是列名、常數(shù)、函數(shù)或者是列名或常數(shù)的任意組合,以及以算術(shù)運(yùn)算符或逐位運(yùn)算符連接的函數(shù)。算術(shù)運(yùn)算符如下表所示:
以下是引用片段:
符號(hào) 意義
加號(hào)
- 減號(hào)
* 乘號(hào)
/ 除號(hào)
is null:在搜索一個(gè)NULL值時(shí)使用。
like:關(guān)鍵詞,對(duì)char、varchar和datetime(不包括秒和毫秒)可以使用like,在MySQL中l(wèi)ike也可以用在數(shù)字的表達(dá)式上。
當(dāng)用戶在搜索datetime型數(shù)據(jù)時(shí),最好是使用關(guān)鍵詞like,因?yàn)橥暾膁atetime記錄包含各種各樣的日期組件。例如用戶在列arrival_time中加入一個(gè)值“9:20”,而子句where arrival_time=“9:20”卻沒有發(fā)現(xiàn)它,因?yàn)镸ySQL把錄入的數(shù)據(jù)轉(zhuǎn)換成了“Jan 1,1900 9:20AM”。然而子句where arrival_time like“%9:20%”就能找到它。
boolean_expression:返回“true”或“false”值的表達(dá)式。
match_string:由字符和通配符組成的串,用單引號(hào)或雙引號(hào)引起來,是匹配模式。通配符如下表所示:
以下是引用片段:
符號(hào) 意義
% 0或多個(gè)字符的字符串
_ 任何一單個(gè)字符
not: 否定任何邏輯表達(dá)式,或是關(guān)鍵詞,
如like,null,between等。
group by和having子句在select語句中使用,
可以將表劃分成組并返回匹配having子句條件的組。
語法:select語句開頭
group by [all] aggregate_free_expression [,aggregate_free_expression]*
[having search_conditions]
select語句結(jié)尾
group by:指定表將劃分的組群,如果在select表項(xiàng)中包含集合函數(shù),則為各組計(jì)算一個(gè)總計(jì)值。這些總計(jì)值的結(jié)果以新的列顯示,而不是新的行。在having子句中用戶可以引用這些新的總計(jì)列。在group by之前的select_list中可以使用avg、count、max、min和sum等集合
在你的工作中是否會(huì)為了某個(gè)活動(dòng)要隨機(jī)取出一些符合條件的EMAIL或者手機(jī)號(hào)碼用戶,來頒發(fā)獲獎(jiǎng)通知或其它消息?本文以實(shí)例的方式來講解如何抽取隨機(jī)數(shù)的多種方法。
如果是的話,可以用oracle里生成隨機(jī)數(shù)的PL/SQL, 目錄文件名在:/ORACLE_HOME/rdbms/admin/dbmsrand.sql。
用之前先要在sys用戶下編譯:SQL>@/ORACLE_HOME/rdbms/admin/dbmsrand.sql。
它實(shí)際是在sys用戶下生成一個(gè)dbms_random程序包,同時(shí)生成公有同義詞,并授權(quán)給所有數(shù)據(jù)庫用戶有執(zhí)行的權(quán)限。
使用dbms_random程序包, 取出隨機(jī)數(shù)據(jù)的方法:
1. 先創(chuàng)建一個(gè)唯一增長(zhǎng)的序列號(hào)tmp_id:
以下是引用片段:
create sequence tmp_id increment by 1 start with 1 maxvalue 9999999 nocycle nocache;
2. 然后創(chuàng)建一個(gè)臨時(shí)表tmp_1,把符合本次活動(dòng)條件的記錄全部取出來:
以下是引用片段:
create table tmp_1 as select tmp_id.nextval as id, email,mobileno from 表名 where 條件;
找到最大的id號(hào):select max(id) from tmp_1;。
3. 設(shè)定一個(gè)生成隨機(jī)數(shù)的種子:
以下是引用片段:
execute dbms_random.seed(12345678); 或者 execute dbms_random.seed (TO_CHAR(SYSDATE,'MM-DD-YYYY HH24:MI:SS'));
4. 調(diào)用隨機(jī)數(shù)生成函數(shù)dbms_random.value生成臨時(shí)表tmp_2(假設(shè)隨機(jī)取200個(gè)):
以下是引用片段:
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間的隨機(jī)數(shù),會(huì)有小數(shù),
trunc函數(shù)對(duì)隨機(jī)數(shù)字取整,才能和臨時(shí)表的整數(shù)ID字段相對(duì)應(yīng)。
注意:如果tmp_1記錄比較多(10萬條以上),也可以找一個(gè)約大于兩百行的表(假如是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相關(guān)聯(lián)取得符合條件的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. 用完后,刪除臨時(shí)表tmp_1、tmp_2和序列號(hào)tmp_id。
本文整理于互聯(lián)網(wǎng),歡迎原文作者來信署名版權(quán) mb5u@vip.qq.com
分享:新手如何使用PHP創(chuàng)建RSS閱讀器Jacques Noah在Devshed上發(fā)表了一篇關(guān)于在PHP4與任意版本的Mysql搭建的平臺(tái)下創(chuàng)建一個(gè)基于PHP的RSS閱讀器的文章,RSS文檔中有三個(gè)主要的標(biāo)簽:Title,link和description,分別包含著像它們名稱提示
- PHPNOW安裝Memcached擴(kuò)展方法詳解
- php記錄頁面代碼執(zhí)行時(shí)間
- PHP中獎(jiǎng)概率的抽獎(jiǎng)算法程序代碼
- apache設(shè)置靜態(tài)文件緩存方法介紹
- php對(duì)圖像的各種處理函數(shù)代碼小結(jié)
- PHP 關(guān)于訪問控制的和運(yùn)算符優(yōu)先級(jí)介紹
- 關(guān)于PHP語言構(gòu)造器介紹
- php/js獲取客戶端mac地址的實(shí)現(xiàn)代碼
- php5.5新數(shù)組函數(shù)array_column使用
- PHP preg_match的匹配多國(guó)語言的技巧
- php 中序列化和json使用介紹
- php采集文章中的圖片獲取替換到本地
- 相關(guān)鏈接:
- 教程說明:
PHP教程-快速掌握MySQL數(shù)據(jù)庫中SELECT語句。