簡單查詢mysql
查詢一個字段:sql
select 字段名 from 表名;數據庫
其中要注意:oracle
select和from都是關鍵字。
字段名和表名都是標識符。函數
強調:優化
對於SQL語句來講,是通用的,
全部的SQL語句以「;」結尾。
另外SQL語句不區分大小寫,都行。spa
實例:orm
a. 查詢部門名字blog
mysql>select dname from dept;排序
查詢兩個字段,或者多個字段使用逗號隔開「,」。
b. 查詢部門編號和部門名
select deptno,dname from dept;
c. 查詢全部字段
第一種方式:能夠把每一個字段都寫上
select a,b,c,d,e,f... from tablename;
第二種方式:可使用*
select * from dept;
這種方式的缺點:
1、效率低
2、可讀性差。
在實際開發中不建議,能夠本身玩沒問題。你能夠在DOS命令窗口中想快速的看一看全表數據能夠採用這種方式。
d. 給查詢的列起別名
mysql> select deptno,dname as deptname from dept;
使用as關鍵字起別名。
注意:只是將顯示的查詢結果列名顯示爲deptname,原表列名仍是叫:dname
像是查詢語句臨時複製了一個備份,而後對備份進行了修改,經過create可保存,這個備份
記住:select語句是永遠都不會進行修改操做的。(由於只負責查詢)
as關鍵字能夠省略嗎?能夠的
mysql> select deptno,dname deptname from dept;
起別名時,別名裏有空格不符合語法,解決辦法:
select deptno,dname 'dept name' from dept; //加單引號
select deptno,dname "dept name" from dept; //加雙引號
· 注意:在全部的數據庫當中,字符串統一使用單引號括起來,
單引號是標準,雙引號在oracle數據庫中用不了。可是在mysql中可使用。
再次強調:數據庫中的字符串都是採用單引號括起來。這是標準的。雙引號不標準。
e. 查詢時對字段使用數學表達式
實例:
mysql> select ename,sal from emp;
mysql> select ename,sal*12 from emp;
同時使用別名和數學表達式
條件查詢
什麼是條件查詢?
不是將表中全部數據都查出來。是查詢出來符合條件的。
語法格式:
select
字段1,字段2,字段3....
from
表名
where
條件;
都有哪些條件?
運算符
= 等於
查詢薪資等於800的員工姓名和編號?
select empno,ename from emp where sal = 800;
查詢SMITH的編號和薪資?
select empno,sal from emp where ename = 'SMITH'; //字符串使用單引號
<>或!= 不等於
查詢薪資不等於800的員工姓名和編號?
select empno,ename from emp where sal != 800;
select empno,ename from emp where sal <> 800; // 小於號和大於號組成的不等號
< 小於
查詢薪資小於2000的員工姓名和編號?
mysql> select empno,ename,sal from emp where sal < 2000;
<= 小於等於
查詢薪資小於等於3000的員工姓名和編號?
select empno,ename,sal from emp where sal <= 3000;
> 大於
查詢薪資大於3000的員工姓名和編號?
select empno,ename,sal from emp where sal > 3000;
>= 大於等於
查詢薪資大於等於3000的員工姓名和編號?
select empno,ename,sal from emp where sal >= 3000;
between ⋯ and ⋯
兩個值之間, 等同於 >= and <=
查詢薪資在2450和3000之間的員工信息?包括2450和3000
第一種方式:>= and <= (and是而且的意思。)
select empno,ename,sal
from emp
where sal >= 2450 and sal = 3000;
第二種方式:between ⋯ and ⋯
select empno,ename,sal
from emp
where sal between 2450 and 3000;
注意:
用between and的時候,必須遵循左小右大。
between and是閉區間,包括兩端的值。
is null 爲 null(is not null 不爲空)
詢哪些員工的津貼/補助爲null?
mysql> select empno,ename,sal,comm from emp where comm = null;
Empty set (0.00 sec)
mysql> select empno,ename,sal,comm from emp where comm is null;
注意:在數據庫當中null不能使用等號進行衡量。須要使用is null
由於數據庫中的null表明什麼也沒有,它不是一個值,因此不能使用
等號衡量。
查詢哪些員工的津貼/補助不爲null?
select empno,ename,sal,comm from emp where comm is not null;
and 而且
查詢工做崗位是MANAGER而且工資大於2500的員工信息?
select
empno,ename,job,sal
from
emp
where
job = 'MANAGER' and sal > 2500;
or 或者
查詢工做崗位是MANAGER和SALESMAN的員工?
select
empno,ename,job
from
emp
where
job = 'MANAGER' or job = 'SALESMAN';
and和or同時出現的話,有優先級問題嗎?
查詢工資大於2500,而且部門編號爲10或20部門的員工?
select
*
from
emp
where
sal > 2500 and deptno = 10 or deptno = 20;
分析以上語句的問題?
and優先級比or高;
以上語句會先執行and,而後執行or。
以上這個語句表示什麼含義?
找出工資大於2500而且部門編號爲10的員工,或者20部門全部員工找出來。
select
*
from
emp
where
sal > 2500 and (deptno = 10 or deptno = 20);
and和or同時出現,and優先級較高。若是想讓or先執行,須要加「小括號」之後在開發中,若是不肯定優先級,就加小括號就好了。
in 包含,至關於多個 or (not in 不在這個範圍中)
查詢工做崗位是MANAGER和SALESMAN的員工?
select empno,ename,job from emp where job = 'MANAGER' or job = 'SALESMAN';
select empno,ename,job from emp where job in('MANAGER', 'SALESMAN');
注意:in不是一個區間。in後面跟的是具體的值。
查詢薪資是800和5000的員工信息?
select ename,sal from emp where sal = 800 or sal = 5000;
select ename,sal from emp where sal in(800, 5000); //這個不是表示800到5000都找出來。
not in 表示不在這幾個值當中的數據。
select ename,sal from emp where sal not in(800, 5000, 3000);
not 能夠取非,主要用在 is 或 in 中
is null
is not null
in
not in
like
稱爲模糊查詢,支持%或下劃線匹配
%匹配任意多個字符
下劃線:任意一個字符。
(%是一個特殊的符號,_ 也是一個特殊符號)
找出名字中含有O的?
mysql> select ename from emp where ename like '%O%';
找出名字以T結尾的?
select ename from emp where ename like '%T';
找出名字以K開始的?
select ename from emp where ename like 'K%';
找出第二個字每是A的?
select ename from emp where ename like '_A%';
找出第三個字母是R的?
select ename from emp where ename like '__R%';
排序
查詢全部員工薪資,排序?
select ename,sal from emp order by sal; // 默認是升序!!!
怎麼降序?
指定降序:
select ename,sal from emp order by sal desc;
指定升序?
select ename,sal from emp order by sal asc;
能夠兩個字段排序嗎?或者說按照多個字段排序?
查詢員工名字和薪資,要求按照薪資升序,若是薪資同樣的話,
再按照名字升序排列。
select ename,sal from emp order by sal asc, ename asc; // sal在前,起主導,只有sal相等的時候,纔會考慮啓用ename排序。
根據字段的位置也能夠排序
select ename,sal from emp order by 2; // 2表示第二列。第二列是sal
按照查詢結果的第2列sal排序。
瞭解一下,不建議在開發中這樣寫,由於不健壯。
由於列的順序很容易發生改變,列順序修改以後,2就廢了。
綜合一點的案例:
找出工資在1250到3000之間的員工信息,要求按照薪資降序排列。
關鍵字順序不能變:
select...
from...
where...
order by...
以上語句的執行順序必須掌握:
第一步:from
第二步:where
第三步:select
第四步:order by(排序老是在最後執行!)
數據處理函數
數據處理函數又被稱爲單行處理函數
單行處理函數的特色:一個輸入對應一個輸出。
和單行處理函數相對的是:多行處理函數。(多行處理函數特色:多個輸入,對應1個輸出!)
單行處理函數常見的有哪些?
lower 轉換小寫
mysql> select lower(ename) as ename from emp;
upper 轉換大寫
mysql> select upper(name) as name from t_student;
substr 取子串(substr( 被截取的字符串, 起始下標,截取的長度))
select substr(ename, 1, 1) as ename from emp;
注意:起始下標從1開始,沒有0.
找出員工名字第一個字母是A的員工信息?
第一種方式:模糊查詢
select ename from emp where ename like 'A%';
第二種方式:substr函數
select
ename
from
emp
where
substr(ename,1,1) = 'A';
首字母大寫?
select name from t_student;
select upper(substr(name,1,1)) from t_student;
select substr(name,2,length(name) - 1) from t_student;
select concat(upper(substr(name,1,1)),substr(name,2,length(name) - 1)) as result from t_student;
concat函數進行字符串的拼接
select concat(empno,ename) from emp;
length 取長度
select length(ename) enamelength from emp;
trim 去空格
mysql> select * from emp where ename = ' KING';
Empty set (0.00 sec)
mysql> select * from emp where ename = trim(' KING');
str_to_date 將字符串轉換成日期
date_format 格式化日期
format 設置千分位
分組函數(多行處理函數)
多行處理函數的特色:輸入多行,最終輸出一行。
5個:
count 計數
sum 求和
avg 平均值
max 最大值
min 最小值
注意:
分組函數在使用的時候必須先進行分組,而後才能用。
若是你沒有對數據進行分組,整張表默認爲一組。
例:
mysql> select max(sal) from emp;
分組函數在使用的時候須要注意哪些?
第一點:分組函數自動忽略NULL,你不須要提早對NULL進行處理。
第二點:分組函數中count(*)和count(具體字段)有什麼區別?
count(具體字段):表示統計該字段下全部不爲NULL的元素的總數。
count(*):統計表當中的總行數。(只要有一行數據count則++)
由於每一行記錄不可能都爲NULL,一行數據中有一列不爲NULL,則這行數據就是有效的。
第三點:分組函數不可以直接使用在where子句中。
第四點:全部的分組函數能夠組合起來一塊兒用。
分組查詢(很是重要:五顆星*****)
1)什麼是分組查詢?
在實際的應用中,可能有這樣的需求,須要先進行分組,而後對每一組的數據進行操做。
這個時候咱們須要使用分組查詢,怎麼進行分組查詢呢?
select...
from...
group by...
計算每一個部門的工資和?
計算每一個工做崗位的平均薪資?
找出每一個工做崗位的最高薪資?
....
2)將以前的關鍵字所有組合在一塊兒,來看一下他們的執行順序?
select...
from...
where...
group by...
order by...
以上關鍵字的順序不能顛倒,須要記憶。
執行順序是什麼?
1. from
2. where
3. group by
4. select
5. order by
爲何分組函數不能直接使用在where後面?
select ename,sal from emp where sal > min(sal);//報錯。
由於分組函數在使用的時候必須先分組以後才能使用。
where執行的時候,尚未分組。因此where後面不能出現分組函數。
select sum(sal) from emp;
這個沒有分組,爲啥sum()函數能夠用呢?
由於select在group by以後執行。
3)找出每一個工做崗位的工資和?
實現思路:按照工做崗位分組,而後對工資求和。
select job,sum(sal) from emp group by job;
以上這個語句的執行順序?
先從emp表中查詢數據。
根據job字段進行分組。
而後對每一組的數據進行sum(sal)
重點結論:
在一條select語句當中,若是有group by語句的話,
select後面只能跟:參加分組的字段,以及分組函數。
其它的一概不能跟。
4)找出每一個部門的最高薪資
實現思路是什麼?
按照部門編號分組,求每一組的最大值。
select後面添加ename字段沒有意義,另外oracle會報錯。
mysql> select ename,deptno,max(sal) from emp group by deptno;
mysql> select deptno,max(sal) from emp group by deptno;
5)找出「每一個部門,不一樣工做崗位」的最高薪資?
技巧:兩個字段聯合成1個字段看。(兩個字段聯合分組)
select deptno, job, max(sal)
from emp
group by deptno, job;
6)使用having能夠對分完組以後的數據進一步過濾。
having不能單獨使用,having不能代替where,having必須
和group by聯合使用。
找出每一個部門最高薪資,要求顯示最高薪資大於3000的?
第一步:找出每一個部門最高薪資
按照部門編號分組,求每一組最大值。
select deptno,max(sal) from emp group by deptno;
第二步:要求顯示最高薪資大於3000
select deptno,max(sal)
from emp
group by deptno
having max(sal) > 3000;
優化策略:
where和having,優先選擇where,where實在完成不了了,再選擇having。
7)where沒辦法的????
找出每一個部門平均薪資,要求顯示平均薪資高於2500的。
第一步:找出每一個部門平均薪資
select deptno,avg(sal) from emp group by deptno;
第二步:要求顯示平均薪資高於2500的
select deptno,avg(sal)
from emp
group by deptno
having avg(sal) > 2500;
20、大總結(單表的查詢學完了)
select...
from...
where...
group by...
having...
order by...
以上關鍵字只能按照這個順序來,不能顛倒。
執行順序?
1. from
2. where
3. group by
4. having
5. select
6. order by
從某張表中查詢數據,
先通過where條件篩選出有價值的數據。
對這些有價值的數據進行分組。
分組以後可使用having繼續篩選。
select查詢出來。
最後排序輸出!
找出每一個崗位的平均薪資,要求顯示平均薪資大於1500的,除MANAGER崗位以外,
要求按照平均薪資降序排。
select job, avg(sal) as avgsal
from emp
where job <> 'MANAGER'
group by job
having avg(sal) > 1500
order by avgsal desc;