MySQLの学習-並べ替えおよびグループ化機能

オペレーティングテーブル
mysql> select * from emp;

EMPNO エナメ ジョブ MGR 雇用日 しなければならない COMM DEPTNO
7369 スミス 店員 7902 1980-12-17 800.00 ヌル 20
7499 アレン セールスマン 7698 1981-02-20 1600.00 300.00 30
7521 セールスマン 7698 1981-02-22 1250.00 500.00 30
7566 ジョーンズ マネージャー 7839 1981-04-02 2975.00 ヌル 20
7654 マーティン セールスマン 7698 1981-09-28 1250.00 1400.00 30
7698 ブレイク マネージャー 7839 1981-05-01 2850.00 ヌル 30
7782 クラークス マネージャー 7839 1981-06-09 2450.00 ヌル 10
7788 スコット アナリスト 7566 1987-04-19 3000.00 ヌル 20
7839 キング 大統領 ヌル 1981-11-17 5000.00 ヌル 10
7844 ターナー セールスマン 7698 1981-09-08 1500.00 0.00 30
7876 ADAMS 店員 7788 1987-05-23 1100.00 ヌル 20
7900 ジェームズ 店員 7698 1981-12-03 950.00 ヌル 30
7902 フォード アナリスト 7566 1981-12-03 3000.00 ヌル 20
7934 ミラー 店員 7782 1982-01-23 1300.00 ヌル 10

各フィールドのフィールド名は、従業員番号、従業員名、従業員の役職、従業員の上位リーダー番号、従業員の雇用日、従業員の給与、従業員の手当、および従業員の部門番号です。

並べ替え(昇順、降順)

給与の昇順で、従業員の名前と給与を調べますか?

select 
		ename,sal 
from 
		emp 
order by
		sal;
エナメ
しなければならない
スミス 800.00
ジェームズ 950.00
ADAMS 1100.00
1250.00
マーティン 1250.00
ミラー 1300.00
ターナー 1500.00
アレン 1600.00
クラークス 2450.00
ブレイク 2850.00
ジョーンズ 2975.00
スコット 3000.00
フォード 3000.00
キング 5000.00

注:デフォルトは昇順です。昇順または降順を指定するにはどうすればよいですか?ascは昇順を意味し、descは降順を意味します。

select ename , sal from emp order by sal; // 升序
select ename , sal from emp order by sal asc; // 升序
select ename , sal from emp order by sal desc; // 降序。

給与の降順で並べ、給与が同じ場合は名前の昇順で並べます。

select ename,sal from emp ORDER BY sal desc;
エナメ しなければならない
キング 5000.00
スコット 3000.00
フォード 3000.00
ジョーンズ 2975.00
ブレイク 2850.00
クラークス 2450.00
アレン 1600.00
ターナー 1500.00
ミラー 1300.00
1250.00
マーティン 1250.00
ADAMS 1100.00
ジェームズ 950.00
スミス 800.00
select ename,sal from emp ORDER BY sal desc,ename asc;
エナメ しなければならない
キング 5000.00
フォード 3000.00
スコット 3000.00
ジョーンズ 2975.00
ブレイク 2850.00
クラークス 2450.00
アレン 1600.00
ターナー 1500.00
ミラー 1300.00
マーティン 1250.00
1250.00
ADAMS 1100.00
ジェームズ 950.00
スミス 800.00

注:複数のフィールドを同時にソートする原則フィールドが高いほど、支配的です。前のフィールドを並べ替えることができない場合にのみ、後者のフィールドが有効になります。

select ename,sal from emp order by 2;

2は2番目の列を表します。

by后面跟数字时表示第几列。
找出工作岗位是SALESMAN的员工,并且要求按照薪资的降序排列。

select 
		ename,job,sal					3
	from
		emp							1
	where 
		job = 'SALESMAN'				2
	order by
		sal desc;							4

order by是最后执行的

select 
		字段						3
	from
		表名						1
	where
		条件						2
	order by
		....						4
	
	order by是最后执行的。

分组函数

分组函数?
count 计数
sum 求和
avg 平均值
max 最大值
min 最小值
记住:所有的分组函数都是对“某一组”数据进行操作的。

找出工资总和?

select sum(sal) from emp;

找出最高工资?

select max(sal) from emp;

找出最低工资?

select min(sal) from emp;
min(sal)
800.00

找出平均工资?

select avg(sal) from emp;

找出总人数?

select count(*) from emp;
select count(ename) from emp;
count(*)
14

分组函数一共5个。
分组函数还有另一个名字:多行处理函数。
多行处理函数的特点:输入多行,最终输出的结果是1行。

分组函数自动忽略NULL。

select count(comm) from emp;
count(comm)
4
select sum(comm) from emp;
sum(comm)
2200.00

单行处理函数:输入一行,输出一行
计算每个员工的年薪?

select ename,(sal+comm)*12 as yearsal from emp;
ename yearsal
SMITH NULL
ALLEN 22800.00
WARD 21000.00
JONES NULL
MARTIN 31800.00
BLAKE NULL
CLARK NULL
SCOTT NULL
KING NULL
TURNER 18000.00
ADAMS NULL
JAMES NULL
FORD NULL
MILLER NULL

Smith的年薪为空,因为smith的comm为空,而数据库中有一个规定,只要数据表达式中有NULL出现,最终结果都是NULL。
重点:所有数据库都是这样规定的,只要有NULL参与的运算结果一定是NULL
ifnull() 空处理函数?
ifnull(可能为NULL的数据,被当做什么来处理):属于单行处理函数

select ename,ifnull(comm,0) as comm from emp;
ename comm
SMITH 0.00
ALLEN 300.00
WARD 500.00
JONES 0.00
MARTIN 1400.00
BLAKE 0.00
CLARK 0.00
SCOTT 0.00
KING 0.00
TURNER 0.00
ADAMS 0.00
JAMES 0.00
FORD 0.00
MILLER 0.00
select ename,(sal+ifnull(comm,0))*12 as yearsal from emp;
ename yearsal
SMITH 9600.00
ALLEN 22800.00
WARD 21000.00
JONES 35700.00
MARTIN 31800.00
BLAKE 34200.00
CLARK 29400.00
SCOTT 36000.00
KING 60000.00
TURNER 18000.00
ADAMS 13200.00
JAMES 11400.00
FORD 36000.00
MILLER 15600.00

select sum(comm) from emp;

sum(comm)
2200.00
select sum(comm) from emp where comm is not null; 

不需要额外添加这个过滤条件。sum函数自动忽略NULL。
count也忽略了null
分组函数都可以直接忽略null

找出工资高于平均工资的员工?

select ename,sal from emp where sal>avg(sal);

[SQL]select ename,sal from emp where sal>avg(sal);报错[Err] 1111 - Invalid use of group function思考以上的错误信息:无效的使用了分组函数?
原因:SQL语句当中有一个语法规则,分组函数不可直接使用在where子句当中。why???
因为group by是在where执行之后才会执行的。(如果没有写group by也会自成一组,相当于有一个缺省的group by语句)

select		5
					..			
				from			1
					..
				where			2
					..
				group by		3
					..
				having		4
					..
				order by		6

找出工资高于平均工资的员工?
第一步:找出平均工资

select avg(sal) from emp;
avg(sal)
2073.214286

第二步:找出高于平均工资的员工

select ename,sal from emp where sal > 2073.214286;
ename sal
JONES 2975.00
BLAKE 2850.00
CLARK 2450.00
SCOTT 3000.00
KING 5000.00
FORD 3000.00

两条语句拼接到一起,select语句中嵌套select语句是子查询
select ename,sal from emp where sal > (select avg(sal) from emp);

count()和count(具体的某个字段),他们有什么区别?
  count(
):不是统计某个字段中数据的个数,而是统计总记录条数。(和某个字段无关)
  count(comm): 表示统计comm字段中不为NULL的数据总数量。

select count(*) from emp;	//输出14
select count(comm) from emp;		//输出4

分组函数也能组合起来用

select count(*),sum(sal),avg(sal),max(sal),min(sal) from emp;
count(*) sum(sal) avg(sal) max(sal) min(sal)
14 29025.00 2073.214286 5000.00 800.00

おすすめ

転載: blog.csdn.net/qq_39736597/article/details/111715302