目錄
本文主要講解SELECT語句的具體用法,包括基本知識、常用的字段類型、where子句、常用函數等。
1 基礎知識
1.1 數據庫的基本形式
在關係型數據庫中,所有數據都存在表中,一個表由字段和數據組成,如下圖所示:
編號 |
姓名 |
性別 |
年齡 |
成績 |
愛好 |
001 |
王成 |
男 |
18 |
91 |
打籃球 |
002 |
李四 |
男 |
19 |
92 |
踢足球 |
003 |
李三 |
女 |
20 |
93 |
羽毛球 |
字段
數據
數據
數據
1.2 mysql數據庫登陸的基本操作
1、mysql -u root -p
登陸命令,需要輸入密碼,然後登陸mysql。
2、show databases;
可以查看現有數據庫。
3、use 數據庫名;
可以使用指定的數據庫,比如use mysql。
4、show tables;
可以顯示當前數據庫中的表。
5、show create table 表名;
顯示指定表名的定義,即該表的所有字段信息。
6、desc 表名;
顯示指定表名的定義,即該表的所有字段信息。
7、select * from 表名;
顯示指定表名的表中的所有信息。
2 常用字段類型
常用的字段類型有數值類型、字符型、日期型。
2.1 數值型
numer(m) 表示m位的整數。
number(m,n) m表示總位數,m是小數點後的位數。
數值類型可以直接使用 + - * / 運算符。
2.2 字符型
char(m) m位定長字符串
varchar2(m) m位變長字符串
定長就是長度固定,不足的部分用空格填充。變長就是長度隨數據的不同而不同,不去填充空格。定長字符串效率要略高於變長字符串,但是比較浪費空間,如果沒有特殊的要求,一般選用varchar2。
2.3 日期型
date 即日期型,包括年月日,小時分秒。
日期型的字段可以使用 + - 運算符。
3 selete語句
select用來做數據查詢,後面可以跟各種字段名,表示要查詢的字段,多個字段用”,”隔開,也可以跟表達式和特殊內容。
select語句一般和from語句結合使用,from語句,後面跟表名,表示從哪些表中查詢數據,多個表用”,”隔開。比如查看emp表中的id、first_name、sal字段,可以使用:
select id,first_name,sal from emp;
每個字段在select語句中,都可以定義一個別名,方便顯示和使用,比如查看emp表中的id,顯示成myid:
select id myid from emp;
如果要指定大小寫,則需要用””來限定,如下:
select id “myid” from emp;
注:sql語句本身不包括分號,但是想要運行必須用” ; ” 或者”/”。
“||”可以連接兩個文本型(字符串)的數據,比如顯示的時候,將first_name和last_name合併在一起顯示出來:
select id , first_name || ‘ ’ || last_name name from emp;
在數據庫中,有些數據不是必須的,有可能出現空缺的情況,可以用“NULL”表示數據的空缺。“NULL”是一種特殊的數據,不能簡單地看作’’或者0。
一般的數據庫(mysql和oracle都有)有一種特殊的表,叫做虛表,裏面只有一個字段,但是這個字段類型可以是任意的,可以這樣操作它:
select sysdate() from dual;
(mysql中sysdate()可以獲取當前時間信息)
select 1+1 from dual;
4 where子句
在數據庫的查詢中,更多的不是查看所有的數據,而是根據一定的條件進行數據的篩選,按照條件進行的查詢叫做條件查詢,條件查詢需要用到where子句。
4.1 條件操作符
select id , sal from emp
where sal >1000;
篩選sal大於1000的數據顯示出來,同樣,可以是:
操作符 |
說明 |
示例 |
= |
等於 |
where sal =10000 |
<> |
不等於 |
where sal <> 10000 |
!= |
不等於 |
where sal != 10000 |
< |
小於 |
where sal < 10000 |
<= |
小於等於 |
where sal <= 10000 |
> |
大於 |
where sal > 10000 |
>= |
大於等於 |
where sal >= 10000 |
between and |
在指定的兩個值之間 |
where sal between 1000 and 10000 |
in() |
在數據清單內 |
where sal in (2000,5000,10000) |
not in() |
不在數據清單內 |
where sal not in(2000,5000,10000) |
like |
模糊查詢 |
where name like ‘a%’ |
is NULL |
提取空值的數據 |
where sal is NULL |
is NOT NULL |
提取不是空值的數據 |
where sal is NOT NULL |
like 模糊查詢時,可以結合通配符進行查詢:
“_” 代表任意的單個字符,like ‘a_’表示找出以a開頭後面還有一個字符的數據。
“%”代表任意的0-n個字符,like ‘a%’表示找出以’a’開頭,後面隨意的數據。
4.2 邏輯運算符
查詢條件也可以使用邏輯運算符來組合:與、或、非:
and 邏輯與
or 邏輯或
not 邏輯非
5 排序
查詢結果經常需要排序,排序分爲升序和降序。可以使用order by 子句來進行排序:
order by 字段名/別名/序號
order by後面可以跟多個拍尋條件,但是只有在前面的條件相等的情況下,纔會考慮後面的。
6、函數
函數提供了某種功能,比如NVL()函數提供了對空值的處理。有些功能數據庫提供了,開發的語言也提供了 類似功能的函數,可以根據需求進行選擇。函數分爲單行函數和多行函數(分組函數),單行函數就是輸入一條數據,輸出一條數據,多行數據就是輸入多條數據,輸出一條數據。
6.1 單行函數
單行函數分爲:
1、字符函數,處理字符串類型的函數(類似C語言的string.h中的函數)。
2、數值函數,處理數值類型的函數。
3、日期函數,處理日期類型的函數。
4、轉換函數,數值、日期、字符三種類型數據的轉換。
5、其他函數,一些輔助函數,比如nvl(),空值替換函數。
6.1.1 字符函數
LOWER ——轉換所有大寫字母爲小寫。
UPPER ——轉換所有小寫字符爲大寫。
INITCAP ——首字母大寫,其他字母小寫。
CONCAT ——連接兩個字符串,這個函數基本不用,使用“||”代替。
SUBSTR ——截取字符串,獲取字符串的一部分。
LENGTH ——獲取字符串的長度。
6.1.2 數值函數
round() ——四捨五入。
trunc() ——全部舍。
6.1.3 日期函數
round() ——日期的四捨五入
trunc() ——日期的全部舍。
Months_between() ——計算兩個日期間隔了多少個月。
6.1.4 轉換函數
轉換函數用於文本、日期、數值三者之間的類型轉換,這種轉換隻發生在字符和日期之間或者數值和字符之間。
1、字符類型和日期類型之間的轉換函數
to_date() ——字符轉日期。
to_char() ——日期轉字符。
to_date(‘文本格式的日期’,’日期格式’),其中,日期的格式如下:
Y 代表年,一般用 ‘yyyy’代表4位年,’yy’代表兩位年
M 代表月,一般用’MM’代表2位月,不足會處理。
DD 代表日,一般用DD代表2位日。
H 代表小時,一般用’HH24’代表24小時制的2位小時。
MI 分
S 秒,一般用’SS’代表2位秒。
例如:
to_date(‘2019-3-17 10:10:10’,’YYYY-MM-DD HH24:MI:SS’)
to_char(stsdate(),’yyyy-mm-dd’)
2、數值型和字符型的轉換函數
to_char() ——數值轉字符。
to_number() ——字符轉數值。
to_char(數值,’數值格式’),格式如下:
9 表示這一位是數字,沒有就空着。
0 表示這是一位數字,沒有就補0.
$ 貨幣美元符號。
L 本地貨幣符號。
. 小數點
, 千分位
to_char(1202,’000,000.00$’) 表示將1202轉成字符,結果是: 001,202.00$。
單行函數可以無限層嵌套,計算的次序是從內到外:
round(nvl(commission_pct,0),2) //函數嵌套
6.2 分組函數(多行函數)
常見的分組函數如下:
avg() ——取平均值,只能用於數值型。
count() ——總數,用於所有類型。
max() ——最大值,用於所有類型。
min() ——最小值,用於所有類型。
sum() ——求和,只能數值型。
分組函數會自動過濾空值,如果需要考慮空值,需要藉助nvl()函數來替換空值。