程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> MySQL Select 語句檢索記錄使用詳解

MySQL Select 語句檢索記錄使用詳解

編輯:MySQL綜合教程

在mysql中如果我們要查詢記錄都會使用到select語句了,下面我來總結一下關於mysql select語句的各種操作,有需要了解學習的朋友不防進入參考。

數據庫最普遍的操作就是"插、查、刪,改"。在前在的日志中,我為大家介紹過MySQL的 insert 插入語句,也為大家介紹過 update 更新語句,以及刪除語句 delete 和 truncate語句。今天就為大家來介紹一下,MySQL中唯一的檢索數據語句:select語句。

select 語句是SQL開發者最常用的語句,也是最強大的武器,幸運在的是,學習這個語句並不是很難。

select 語句的定義:

一切都要遵循規矩來辦事,所以和之前的教程一樣,我們先來看一下手冊上面說的 select 語句的語法結構:

 代碼如下 復制代碼


SELECT

[ALL | DISTINCT | DISTINCTROW ]

[HIGH_PRIORITY]

[STRAIGHT_JOIN]

[SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT]

[SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS]

select_expr, ...

[INTO OUTFILE 'file_name' export_options

| INTO DUMPFILE 'file_name']

[FROM table_references

[WHERE where_definition]

[GROUP BY {col_name | expr | position}

[ASC | DESC], ... [WITH ROLLUP]]

[HAVING where_definition]

[ORDER BY {col_name | expr | position}

[ASC | DESC] , ...]

[LIMIT {[offset,] row_count | row_count OFFSET offset}]

[PROCEDURE procedure_name(argument_list)]

[FOR UPDATE | LOCK IN SHARE MODE]]


呵呵,看到了吧?其語法是相當的長了,但是有一點大家要知道,中括號內部的是可以省略的。有的時候是用不到這些東西的。我們一點點來,不要被這語法嚇到,其實 select 語句還是很簡單的,之所以語法這麼復雜, 那是因為 select 語句是非常強大的。

select 執行數學運算:

我們可以使用select語句來執行數學運算,當然,如果公式太復雜的話就算了,否則數學學家不就死絕了?哈哈。 簡單給大家幾個例子,說明一下問題就行,至於一百以內的加減法咱就自己算了,就不麻煩 MySQL 了哈。呵呵。

 代碼如下 復制代碼

select 100 + 100, 50>=(2+3) , 100/3;
/*
+-----------+-----------+---------+
| 100 + 100 | 50>=(2+3) | 100/3 |
+-----------+-----------+---------+
| 200 | 1 | 33.3333 |
+-----------+-----------+---------+
1 row in set (0.00 sec)
*/


select 檢索指定的行和列:

select 語句支持 * 通配符,表示獲得所有的字段。同時,也支持用戶自己指定字段名,來返回指定的列。例如,如下語句返回的是之前用過的 twitter 插件的所有數據列,就可以使用 * 這個通配符。

 代碼如下 復制代碼


select * from wp_threadtwitter_users G ;
/*
*************************** 1. row ***************************
id: 16628009
name: simaopig
screen_name: simaopig
location:
description:
profile_image_url: http://s3.amazonaws.com/twitter_production/profile_images/180700745/head_normal.png
url: http://www.bKjia.c0m
protected: 1
followers_count: 1
1 row in set (0.00 sec)
*/


如果我只想看其中的 url 和 name 字段的所有信息就可以使用如下語句,將返回的結果集指定所要展示的列的字段名:

 

 代碼如下 復制代碼 select name,url from wp_threadtwitter_users ;
/*
+----------+---------------------------+
| name | url |
+----------+---------------------------+
| simaopig | http://www.bKjia.c0m |
+----------+---------------------------+
1 row in set (0.00 sec)
*/


select 為查詢結果加上限制條件:

我們可以使用where子句來為select語句指定所要查詢的限制條件,只要滿足where子句的結果才會展示在結果集中,例如下面語句,我希望從wp_threadtwitter_users 中只返回name為simaopig的用戶的url,就可以使用如下語句:

 代碼如下 復制代碼


select url from wp_threadtwitter_users where name = 'simaopig';
/*
+---------------------------+
| url |
+---------------------------+
| http://www.bKjia.c0m |
+---------------------------+
1 row in set (0.00 sec)
*/


where子句也可以指定更復雜的范圍,比如說,我想查詢一下,我發表的日志中,評論數大於30,並且小於50的文章id及title就可以指定如下子句:

 代碼如下 復制代碼


select id,post_title,comment_count from wp_posts where comment_count > 30 and comment_count < 50 limit 2;
/*
+-----+-------------------------------------------------------+---------------+
| id | post_title | comment_count |
+-----+-------------------------------------------------------+---------------+
| 488 | 海運女,又一個倒霉蛋 | 46 |
| 501 | 解決Mail to Commenter發出的郵件被當作垃圾 | 36 |
+-----+-------------------------------------------------------+---------------+
2 rows in set (0.01 sec)
*/


select 使用內建函數:

long long ago,我為大家介紹過MySQL的函數部分,MySQL為大家提供了非常豐富的內建函數來滿足大家日常的需要,下面我為大家舉兩個例子,分別使用 MAX , MIN, COUNT 這三個函數,來返回我發表日志的評論最多的文章,和評論最少的文章,以及我發表日志的總數:

 代碼如下 復制代碼


select max(comment_count),min(comment_count) from wp_posts;
/*
+--------------------+--------------------+
| max(comment_count) | min(comment_count) |
+--------------------+--------------------+
| 362 | 0 |
+--------------------+--------------------+
1 row in set (0.01 sec)
*/


由上面結果可以看出,我還有文章的沙發保存至今呢。呵呵,哪位有興趣可以去翻一下,搶一下這落了好多灰的沙發。呵。

 代碼如下 復制代碼


select count(*) from wp_posts;
/*
+----------+
| count(*) |
+----------+
| 340 |
+----------+
1 row in set (0.00 sec)
*/


由結果可以看出,算上我保存的草稿,本站從建立至今,小小子已經寫過340篇日志了,雖然其中草稿占了很大一個比重。呵呵。不過,總是自己一個字一個字敲的。哈。

select 為表取別名:

有的時候,我們要查詢的表的名字太長了,經常敲這些名字是很累人的,尤其是我這種懶人,MySQL為我們提供了表的別名機制,使我們在查詢的時候可以給表起個別名,大家可以理解為起外號,比如我管"小貓"叫"犢子",那麼當我喊"犢子"的時候,某人當然知道我是在叫他。哈。

為表起別名,可以在用select 語句指定查詢的表名後面用 as 子句來指定,例如下面我為wp_threadtwitter_users 起別名為 users,並且在後面的查詢中,我用別名指定字段,這在子查詢中是很方便的,呵

 代碼如下 復制代碼


select * from wp_threadtwitter_users as users where screen_name like '%mg%' and users.followers_count > 200 G

select 限制查詢結果的個數:

有的時候查詢到的結果數目太多了,以至於一個屏幕都顯示不下,那我們咋看這結果了?別急,MySQL為我們提供了limit子句,其和select語句一起使用時,可以限制查詢結果的個數,limit子句後面直接跟想要取得的結果集的行數,使用方法如下:

 

 代碼如下 復制代碼 select id from wp_posts where id > 3 and comment_count > 30 limit 2;
/*
+-----+
| id |
+-----+
| 86 |
| 488 |
+-----+
*/


也可以指定一個偏移量,例如,下面的例子從第4行(注意,是從0開始計數的)開始,返回2條記錄:

 代碼如下 復制代碼

select id from wp_posts limit 3,2;
/*
+----+
| id |
+----+
| 26 |
| 28 |
+----+
2 rows in set (0.00 sec)
*/


select 對查詢結果進行分組和排序:

MySQL提供了order by 和 group by ,結合select 語句,我們可以對查詢返回的結果進行排序和分組。可以在order by子句向兩個字段添加asc 和 desc關鍵字來定制排序方法,如果沒有指定order by 子句,MySQL對結果集的排序默認為升序。相應字段的值以升序或者降序的順序被排序。而group by 後面直接跟字段名,意思為按該字段為查詢結果分組:

取小小子發表的博客日志的文章id,取3條,按照id來倒序排列:

 代碼如下 復制代碼

select id from wp_posts order by id desc limit 3;
/*
+------+
| id |
+------+
| 1451 |
| 1450 |
| 1449 |
+------+
3 rows in set (0.00 sec)
*/


比如下面的例子,我把wordpress的友情鏈接,按照link_rel分組,來取其中的前兩條記錄,可以使用如下語句:

 代碼如下 復制代碼

select link_rel,link_name from wp_links as links group by link_rel limit 2 G
/*
*************************** 1. row ***************************
link_rel:
link_name: LAONB
*************************** 2. row ***************************
link_rel: acquaintance
link_name: 衡天小張主機
2 rows in set (0.02 sec)
*/


select 使用變量和子查詢:

這節是濫竽充數的,因為本篇日志不對其進行解釋,在後面的日志中,小小子會專門寫一篇關於MySQL子查詢的日志來為大家講解。至於使用變量嘛,一般用不到,咱就不瞎白話了,免得誤人子弟就罪過了。

控制 select 的行為:

可以向select 語句添加很多關鍵字來修改行為:

•DISTINCT關鍵字刪除包含結果信中具有重復值的記錄
•SQL_CALC_FOUND_ROWS關鍵字告訴MySQL計算符合查詢(不需要考慮可能設置的任何LIMIT)的總行數。通過調用FOUND_ROWS()函數可以得到總行數
•SQL_CACHE 和SQL_NO_CACHE關鍵字告訴MySQL查詢結果是否需要高速緩存
•SQL_BUFFER_RESULT關鍵字強制MySQL把查詢結果存儲到一個臨時表。這使緩沖器消除了對查詢所使用的表的鎖定,而且結果被傳送給客戶,因而可以暫被其他進程使用
•SQL_BIG_RESULT 和SQL_SMALL_RESULT關鍵字可以指定結果集的期望大小,因此可幫助找到最佳的方法對返回的記錄進行排序和存儲(基於磁盤或者內存中的臨時表)
•SQL_HIGH_PRIORITY關鍵字提升了與UPDATE,INSERT和DELETE語句相競爭的查詢的優先級,因而可以在繁忙的數據庫服務器上快速的執行查詢


生成統計信息
    單純依靠手工來生成統計信息是一項既艱苦又耗時還容易出錯的工作,如果我們能熟練掌握用數據庫來生成各種統計信息的技巧,他就會成為很有威力的信息處理工具。作者在這裡用了許多篇幅講這個主題,為了便於大家理解,我分解開來論述:


9.1 找出一組數據中到底有多少種不同的值是一項比較常見的統計工作,而關鍵字distinct就可以把查詢結果中的重復數據清除掉。如

 代碼如下 復制代碼     select distinct state from president  //看看美國總統們都來自那些州?(重復的不計)


9.2用count()函數來統計相關記錄的個數,注意其使用方法:count(*)計算所有的,NULL也要;count(數據列名稱) NULL值不計算在內。

 代碼如下 復制代碼 select count(*) from president;


9.3如果我們想知道班級內的男女生數目?該如何查詢呢?最簡單的方法是

 代碼如下 復制代碼 select count(*) from student where sex='f';
select count(*) from student where sex='m

    但是如果使用count函數結合group by關鍵字,一行命令就搞定了

 代碼如下 復制代碼 select sex,count(*) f rom student group by sex;

    我們可以看到,與反復使用彼此類似的查詢來分別統計某數據列不同取值出現次數的做法相比,把count(*)和group by字句相結合使用有許多優點,主要表現在:
    在開始統計自前,不必知道被統計的數據列裡面有多少種不同的取值
    因為只用了一個查詢命令,我們可以對輸出做排序的處理

 代碼如下 復制代碼 select state,count(*) as count from president
group by state order by count desc limt4; //

看看出生總統最多的前四個州是哪幾個?


9.4除了count(),我們還用其他一些統計函數,如求出最小值的min(),求最大值的max(),求和的sum(),求平均值的avg(),在實際工作中,這些函數時經常用到的!

*10、從多個表提取信息
    我們目前的例子都是從一個表裡面提取信息,但數據庫的真正威力還在於用"關系"來綜合多個數據表裡面的記錄,這種操作稱之為"關聯"或"結合"我們可以看到,select需要給出多個數據表裡面的信息(不可重復);from需要知道從哪幾個表裡面做事;where則對幾個表之間的關聯信息作出詳細的描述。
    首先我們要學習最可靠的數據列引用方式:數據表名.數據列名。這樣在查詢中就一定不會混淆這個數據列到底在哪一個表裡。


例子1:查詢某一天內的學生們的考試成績,用學號列出。

 代碼如下 復制代碼 select scroe.student_id,event_date,score.score.event.type
from event,score
where event.date='2003-09-12'
and event.event_id=score.event_id

    首先,利用event數據表把日期映射到一個考試事件編號,在利用這個編號把score表內相匹配的考試分數找出來。關聯兩個表,一個查詢搞定。


例子2:查詢某一天內的學生們的考試成績,用姓名列出。

 代碼如下 復制代碼 select student.name event.name,score.score,event.type
form event,score,student
where event.date='2003-09-12'
and event.event_id= score.event_id
and scroe.student_id=student.student_id;

    關聯三個表,一個查詢搞定。


例子3:查詢一下缺席學生的名字,學號,缺席次數

 代碼如下 復制代碼 select student.student_id,student_name
count(absence.date) as absences
from student,absence
where student.student_id=absence.student_id  //關聯條件
group by student.student_id;

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved