簡單查詢
假設(shè)有這樣一張表students:
STUDENT_ID?MONITOR_ID? NAME ???????SEX????DOB????????????SPECIALTY
----------?----------?----------?------?--------------?----------
?????10101????????????王曉芳?????女?????07-5月?-88?????計算機
?????10205????????????李秋楓?????男?????25-11月-90?????自動化
?????10102??????10101?劉春蘋?????女?????12-8月?-91?????計算機
?????10301????????????高山???????男?????08-10月-90?????機電工程
?????10207??????10205?王剛???????男?????03-4月?-87?????自動化
?????10112??????10101?張純玉?????男?????21-7月?-89?????計算機
?????10318??????10301?張冬云?????女?????26-12月-89?????機電工程
?????10103??????10101?王天儀?????男?????26-12月-89?????計算機
?????10201??????10205?趙風雨?????男?????25-10月-90?????自動化
?????10105??????10101?韓劉???????男?????03-8月?-91?????計算機
?????10311??????10301?張楊???????男?????08-5月?-90?????機電工程
?????10213??????10205?高淼???????男?????11-3月?-87?????自動化
?????10212??????10205?歐陽春嵐???女?????12-3月?-89?????自動化
?????10314??????10301?趙迪帆?????男?????22-9月?-89?????機電工程
?????10312??????10301?白菲菲?????女?????07-5月?-88?????機電工程
?????10328??????10301?曾程程?????男????????????????????機電工程
?????10128??????10101?白昕???????男????????????????????計算機
?????10228??????10205?林紫寒?????女????????????????????自動化
?
查詢表中所有信息
select ?*? from ?[tableName];
eg:? select ?*? from ?students;
顯示指定列的信息:
select ?[columnName1?< as ?otherName1>,columnName2?< as ?otherName2>,?...]? from ?[tableName];
columnName列名,?columnName?< as ?otherName>表示將columnName這個列名改成別名otherName,如果別名otherName有大小之分,或者?包含特殊字符或空格,則別名必須用""引上;如果不改名則可以省略?< as ?otherName>;
eg: select ?student_id,?monitor_id? as ?班長ID,? name ? as ?姓名? from ?students;
?
?
空值處理
空值( NULL )用來在數(shù)據(jù)庫中表示未知或未確定的值。任何類型的列,只要沒有使用非空( NOT ? NULL )或主鍵( PRIMARY ? KEY )完整性限制,都可能出現(xiàn)空值( NULL ).
空值沒有數(shù)據(jù)類型,在數(shù)據(jù)庫中表示未知或未確定的值,無論是數(shù)字類型、文本類型或日期類型,都可以用統(tǒng)一的空值( NULL )表示。
1.如果表中某列沒有使用非空( NOT ? NULL )或主鍵( PRIMARY ? KEY )完整性限制,其默認值為空值。使用insert語句插入數(shù)據(jù)時未指定該列的值,則其值為空值;指定的列, 如果其值確實為空,則可以用NULL表示;使用UPDATE語句將表中某列數(shù)據(jù)改成空值,可以用NULL表示。
2.空值參與運算時,如果在算術(shù)表達式中,其結(jié)果為宿空值,Oracle中不顯示任何值,MySQL上顯示NULL。如果在字符串連接表達式中,Oracle將其作為空串處理;
MySQL中好像沒有字符串連接的操作,但在搜索的結(jié)果中表示成為NULL。 為了正確解決上述因為NULL參加運算時出現(xiàn)的問題,Oracle提供了3個函數(shù)可以進行處理。3個函數(shù)的用法如下:
(1).NVL(expr1,?expr2);
????expr1,?expr2為函數(shù)參數(shù)表達式,可以是任意的Oracle內(nèi)部數(shù)據(jù)類型,但expr1與expr2的數(shù)據(jù)類型必須要匹配;
函數(shù)的功能:如果expr1為NULL,則返回expr2的值,否則如果不為NULL則返回expr1的值。
eg.有teachers表如下:
TEACHER_ID? NAME ??TITLE??HIRE_DATE??????????BONUS??????WAGE??DEPARTMENT_ID
------?--------?------?--------------?----------?----------?-------------
?????10210?楊文化???教授???03-10月-89???????????1000???????3100???????????102
?????10206?崔天?????助教???05-9月?-00????????????500???????1900???????????102
?????10209?孫晴碧???講師???11-5月?-98????????????600???????2500???????????102
?????10207?張珂?????講師???16-8月?-97????????????700???????2700???????????102
?????10308?齊沈陽???高工???03-10月-89???????????1000???????3100???????????103
?????10306?車東日???助教???05-9月?-01????????????500???????1900???????????103
?????10309?臧海濤???工程師?29-6月?-99????????????600???????2400???????????103
?????10307?趙昆?????講師???18-2月?-96????????????800???????2700???????????103
?????10128?王曉????????????05-9月?-07??????????????????????1000???????????101
?????10328?張笑????????????29-9月?-07??????????????????????1000???????????103
?????10228?趙天宇??????????18-9月?-07??????????????????????1000???????????102
SQL >? SELECT ? name ? AS ?"姓名", ?NVL(bonus,0)+wage ? AS ? "月總收入" ? FROM ? teachers;
姓名???????月總收入
--------?----------
楊文化?????????4100
崔天???????????2400
孫晴碧?????????3100
張珂???????????3400
齊沈陽?????????4100
車東日?????????2400
臧海濤?????????3000
趙昆???????????3500
王曉???????????1000
張笑???????????1000
趙天宇?????????1000
(2).NVL2(expr1,?expr2,?expr3);
????expr1,?expr2為函數(shù)參數(shù)表達式,取Oracle內(nèi)部數(shù)據(jù)類型,但expr2、expr3的數(shù)據(jù)類型必須要與expr1的數(shù)據(jù)類型相匹配;
函數(shù)的功能:如果expr1的值為空,則返回expr3的值;如果expr1的值不為空,則返回expr2的值。
SQL >? SELECT ? name ? AS ?"姓名",?NVL2(bonus,bonus+wage,wage)? AS ?"月總收入"? FROM ?teachers;
姓名???????月總收入
--------?----------
楊文化?????????4100
崔天???????????2400
孫晴碧?????????3100
張珂???????????3400
齊沈陽?????????4100
車東日?????????2400
臧海濤?????????3000
趙昆???????????3500
王曉???????????1000
張笑???????????1000
趙天宇?????????1000
(3). COALESCE (expr,?[,?expr]?...);
????其中,expr1、expr2、...為函數(shù)參數(shù)表達式,取Oracle的內(nèi)部數(shù)據(jù)類型;函數(shù)功能:返回參數(shù)列表中的第一個非空值。如果表達式都是空值,則返回一個空值。
?
?
條件查詢
select ?*? from ?[tableName]? where ?[condition];
select ?[columnName1?< as ?otherName1>,columnName2?< as ?otherName2>,?...]? from ?[tableName]? where ?[condition];
where子句用于指定查詢條件,condition是具體的條件表達式。當condition的值值為true時檢索相應(yīng)的數(shù)據(jù)。
比較條件 |
功能描述 |
例子 |
算術(shù)比較條件 |
||
= |
等于 |
Name=’張三’ |
> |
大于 |
Bonus>500 |
>= |
大于等于 |
Bonus>=500 |
< |
小于 |
Bonus<1000 |
<= |
小于等于 |
Hire_date?<?‘06-7 月 -2001 ’ |
<> 、 |
不等于 |
Bonus>=1000 |
包含測試 |
||
IN |
在指定的集合中 |
Student_id?in(10101 、 10102) |
NOT??IN |
不在指定的集合中 |
Student_id?not?in(10101 、 10102) |
范圍測試 |
||
BETWEEN?...?AND |
在指定的范圍內(nèi) |
Age?between?10?and?40 |
NOT?BETWEEN?...?AND |
不在指定的范圍內(nèi) |
Age?between?0?and?15 |
匹配測試 |
||
LIKE |
與指定模式匹配 |
Name?like?‘羅 % ’ |
NOT??LIKE |
不與指定模式匹配 |
Name?not?lik?‘李 % ’ |
NULL 測試 |
||
IS?NULL |
是NULL 值 |
Name?is?null |
IS??NOT??NULL |
不是NULL 值 |
Name?is?not?null |
邏輯運算符 |
||
AND |
邏輯與運算 |
Bouns?>500?and?bounus?<?=1000 |
OR |
邏輯或運算 |
Bouns>500?or?name?like?‘王 % ’ |
NOT |
邏輯非運算 |
Not?bonus=500 |
?
單一條件查詢
在condition中,值使用一個比較符構(gòu)成的條件查詢條件。如:
SQL >? select ?*? from ?students? where ?student_id<=10128;
?
STUDENT_ID?MONITOR_ID? NAME ???????SEX????DOB????????????SPECIALTY
----------?----------?----------?------?--------------?----------
?????10101????????????王曉芳?????女?????07-5月?-88?????計算機
?????10102??????10101?劉春蘋?????女?????12-8月?-91?????計算機
?????10103??????10101?王天儀?????男?????26-12月-89?????計算機
?????10105??????10101?韓劉???????男?????03-8月?-91?????計算機
?????10112??????10101?張純玉?????男?????21-7月?-89?????計算機
?????10128??????10101?白昕???????男????????????????????計算機
?
?
復(fù)合條件查詢
復(fù)合條件查詢用邏輯運算符and、 or 、not將多個條件連接起來作為查詢條件。如:
SQL >? select ?*? from ?students? where ?student_id<=10128? and ?sex= '女' ;
?
STUDENT_ID?MONITOR_ID? NAME ???????SEX????DOB????????????SPECIALTY
----------?----------?----------?------?--------------?----------
?????10101????????????王曉芳?????女?????07-5月?-88?????計算機
?????10102??????10101?劉春蘋?????女?????12-8月?-91?????計算機
?
?
記錄排序
執(zhí)行select語句時如果沒有指定顯示查詢結(jié)果的先后順序,此時會按照表中數(shù)據(jù)的插入的順序顯示數(shù)據(jù)行。要對查找到的數(shù)據(jù)按某種順序進行顯示, 可以使用order?by子句的select語句來達到此目的。格式如下:
select ?*? from ?[tableName]? from ?[tableName]?< where ?[condition]>? order ? by ?[columnName]?< ASC | DESC >;
select ?[columnName1?< as ?otherName1>,columnName2?< as ?otherName2>,?...]? from ?[tableName]?< where ?[condition]>? order ? by ?[columnName]?< ASC | DESC >;
其中condition指排序所依據(jù)的列或表達式,ASC表示按升序排序(默認),DESC表示按降序排序;?< ASC | DESC >值可以缺省,缺省是默認是ASC升序方式排序。
?
按單一列排序
按單一列排序,是指order? by ?子句的columnName只指一個列或一個表達式。 如departments表
DEPARTMENT_ID?DEPARTME?ADDRESS
-------------?--------?------------
??????????101?信息工程?1號教學樓
??????????102?電氣工程?2號教學樓
??????????103?機電工程?3號教學樓
??????????104?工商管理?4號教學樓
select ?*? from ?departments? order ? by ?department_name? asc ;
DEPARTMENT_ID?DEPARTME?ADDRESS
-------------?--------?-----------
??????????102?電氣工程?2號教學樓
??????????104?工商管理?4號教學樓
??????????103?機電工程?3號教學樓
??????????101?信息工程?1號教學樓
按多列排序
按多列排序是指order?by子句的columnName只指一個以上列或一個表達式。?查詢結(jié)果中的數(shù)據(jù)首先按columnName指定的第一個列進行排序,然后根據(jù)columnName指定的
第三個列進行排序,以此類推。
SQL >? select ?student_id,?monitor_id,?sex,? name ? from ?
students? order ? by ?sex,?monitor_id;
?
STUDENT_ID?MONITOR_ID?SEX???? NAME
----------?----------?------?----------
?????10128??????10101?男?????白昕
?????10105??????10101?男?????韓劉
?????10103??????10101?男?????王天儀
?????10112??????10101?男?????張純玉
?????10207??????10205?男?????王剛
?????10201??????10205?男?????趙風雨
?????10213??????10205?男?????高淼
?????10314??????10301?男?????趙迪帆
?????10311??????10301?男?????張楊
?????10328??????10301?男?????曾程程
?????10205????????????男?????李秋楓
?????10301????????????男?????高山
?????10102??????10101?女?????劉春蘋
?????10228??????10205?女?????林紫寒
?????10212??????10205?女?????歐陽春嵐
?????10318??????10301?女?????張冬云
?????10312??????10301?女?????白菲菲
?????10101????????????女?????王曉芳
?
?
?
分組查詢
列函數(shù)及其應(yīng)用
分組查詢主要是用于查詢整個表中的統(tǒng)計信息,通過使用列(aggregate)函數(shù)、 group ? by ?子句及having?子句來共同完成此類的操作。
分株查詢的格式:
select ?[columnName1?< as ?otherName1>,columnName2?< as ?otherName2>,?...]? from ?[tableName]?< where ?[condition]>? group ? by ?[columnName1,?columnName2,?...]
?< having ?condition>;
列函數(shù)概述
列 (Aggregate) 函數(shù) |
功能描述 |
用于字符、數(shù)值、日期型數(shù)據(jù)的列函數(shù) |
|
MAX(column) |
列中的最大值 |
MIN(column) |
列中的最小值 |
COUNT(*) |
表中行的總數(shù) |
COUNT(column) |
列不為NULL 的行數(shù) |
COUNT(distinct?column) |
Column 指定列中相異值的數(shù)量 |
只用于數(shù)值型數(shù)據(jù)的列函數(shù) |
|
SUM(column) |
列中所有值的總和 |
AVG(column) |
列中所有值的平均數(shù) |
STDDEV(column) |
列的標準偏差 |
VARIANCE(column) |
列的方差 |
?
eg:求students表中的學生人數(shù)
SQL >? select ? count (*)? from ?students;
?? COUNT (*)
----------
????????18
?
mysql>? select ? count (*)? from ?students;
+ ----------+
|? count (*)?|
+ ----------+
|????????7?|
+ ----------+
1? row ? in ? set ?(0.00?sec)
?
group ? by ?子句
通過group? by ?子句,可以在表中達到將數(shù)據(jù)分組的目的。將表的行分為若于組,這些組中的行并不重復(fù)。然后通過列函數(shù)分別組詩每個級,這樣每個組都有一個統(tǒng)計值。
group ? by ?子句中,columnName用于指定分組的列或表達式,可以指定一個或多個表達式作為分組依據(jù)。當依據(jù)單列分組時,會基于列的每個不同值生成一個數(shù)據(jù)統(tǒng)計結(jié)果;
當依據(jù)多列分組時會基于多個列的不同值生成統(tǒng)計結(jié)果,MySQL好像不支持依據(jù)多列進行統(tǒng)計。
eg;按班長ID對students表進行排序
SQL >? select ?monitor_id? from ?students? group ? by ?monitor_id;
MONITOR_ID
----------
?
?????10101
?????10301
?????10205
?
mysql>? select ?monitor_id? from ?students? group ? by ?monitor_id;
+ ------------+
|?monitor_id?|
+ ------------+
|??????? NULL ?|
|??????10101?|
|??????10205?|
|??????10301?|
+ ------------+
4? rows ? in ? set ?(0.20?sec)
?
eg:按專業(yè)及班長ID對students表進行分組
SQL >? select ?specialty,monitor_id? from ?students? group ? by ?specialty,?monitor_id;
SPECIALTY??MONITOR_ID
----------?----------
計算機
機電工程
自動化
自動化??????????10205
機電工程????????10301
計算機??????????10101
?
eg:求students表中男生和女生的人數(shù)分別為多少 。
SQL >? select ?sex,? count (sex)? from ?students? group ? by ?sex;
?
SEX???? COUNT (SEX)
------?----------
男?????????????12
女??????????????6
?
?
having ?子句
group ? by ?子句用于指定分組的依據(jù),而having子句則指定條件,用于限制分組顯示的結(jié)果。 having ?子句中的condition用于指定限制分組的條件。
having子句必須與group?by子句一起使用,而group?by子句通常是單獨使用的。
eg:檢索教師平均工資高于2000的系部,顯示系部號、平均工資。
SQL >? select ?department_id,? avg (wage)? from ?teachers? group ? by ?department_id? having
? avg (wage)>2000;
DEPARTMENT_ID?? AVG (WAGE)
-------------?----------
??????????102???????2240
??????????103???????2220
?
?
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
