数据库第二周学习内容

数据库第二周学习内容

  • 简单的查询语句(DQL)
  • 条件查询
  • is null
  • 模糊查询like(通配符)
  • 排序(升序、降序)
  • 分组函数
  • 单行处理函数

简单的查询语句(DQL)
语法格式:
select 字段名1,字段名2,字段名3,… from 表名;

提示:
1、任何一条sql语句以“;”结尾。
2、sql语句不区分大小写。

查询员工的年薪?(字段可以参与数学运算。)

select ename,sal * 12 from emp;
+--------+----------+
		| ename  | sal * 12 |
		+--------+----------+
		| SMITH  |  9600.00 |
		| ALLEN  | 19200.00 |
		| WARD   | 15000.00 |
		| JONES  | 35700.00 |
		| MARTIN | 15000.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 ename,sal * 12 as yearsal from emp;

别名中有中文?

select ename,sal * 12 as 年薪 from emp; // 错误
select ename,sal * 12 as '年薪' from emp;

		+--------+----------+
		| ename  | 年薪        |
		+--------+----------+
		| SMITH  |  9600.00 |
		| ALLEN  | 19200.00 |
		| WARD   | 15000.00 |
		| JONES  | 35700.00 |
		| MARTIN | 15000.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 |
		+--------+----------+
	

注意:标准sql语句中要求字符串使用单引号括起来。虽然mysql支持双引号,尽量别用。

as关键字可以省略?

> select empno,ename,sal * 12 yearsal from emp;
		+-------+--------+----------+
		| empno | ename  | yearsal  |
		+-------+--------+----------+
		|  7369 | SMITH  |  9600.00 |
		|  7499 | ALLEN  | 19200.00 |
		|  7521 | WARD   | 15000.00 |
		|  7566 | JONES  | 35700.00 |
		|  7654 | MARTIN | 15000.00 |
		|  7698 | BLAKE  | 34200.00 |
		|  7782 | CLARK  | 29400.00 |
		|  7788 | SCOTT  | 36000.00 |
		|  7839 | KING   | 60000.00 |
		|  7844 | TURNER | 18000.00 |
		|  7876 | ADAMS  | 13200.00 |
		|  7900 | JAMES  | 11400.00 |
		|  7902 | FORD   | 36000.00 |
		|  7934 | MILLER | 15600.00 |
		+-------+--------+----------+

查询所有字段?

select * from emp; // 实际开发中不建议使用*,效率较低。

条件查询

语法格式:
		select 
			字段,字段...
		from
			表名
		where
			条件;

执行顺序:先from,然后where,最后select

查询工资等于5000的员工姓名?

select ename from emp where sal = 5000;
		+-------+
		| ename |
		+-------+
		| KING  |
		+-------+

查询SMITH的工资?

select sal from emp where ename = 'SMITH'; // 字符串使用单引号括起来。
		+--------+
		| sal    |
		+--------+
		| 800.00 |
		+--------+

找出工资高于3000的员工?

select ename,sal from emp where sal > 3000;

select ename,sal from emp where sal >= 3000;

select ename,sal from emp where sal < 3000;

select ename,sal from emp where sal <= 3000;

找出工资不等于3000的?

select ename,sal from emp where sal <> 3000;
select ename,sal from emp where sal != 3000;

找出工资在1100和3000之间的员工,包括1100和3000?

select ename,sal from emp where sal >= 1100 and sal <= 3000;

select ename,sal from emp where sal between 1100 and 3000; // between...and...是闭区间 [1100 ~ 3000]

select ename,sal from emp where sal between 3000 and 1100; // 查询不到任何数据

between and在使用的时候必须左小右大。

between and除了可以使用在数字方面之外,还可以使用在字符串方面。
select ename from emp where ename between 'A' and 'C';
+-------+
| ename |
+-------+
| ALLEN |
| BLAKE |
| ADAMS |
+-------+
select ename from emp where ename between 'A' and 'D'; // 左闭右开。

is null
找出哪些人津贴为NULL?
在数据库当中NULL不是一个值,代表什么也没有,为空。
空不是一个值,不能用等号衡量。
必须使用 is null或者is not null

select ename,sal,comm from emp where comm is null;
			+--------+---------+------+
			| ename  | sal     | comm |
			+--------+---------+------+
			| SMITH  |  800.00 | NULL |
			| JONES  | 2975.00 | NULL |
			| BLAKE  | 2850.00 | NULL |
			| CLARK  | 2450.00 | NULL |
			| SCOTT  | 3000.00 | NULL |
			| KING   | 5000.00 | NULL |
			| ADAMS  | 1100.00 | NULL |
			| JAMES  |  950.00 | NULL |
			| FORD   | 3000.00 | NULL |
			| MILLER | 1300.00 | NULL |
			+--------+---------+------+
			select ename,sal,comm from emp where comm = null;
			Empty set (0.00 sec)

找出哪些人津贴不为NULL?

select ename,sal,comm from emp where comm is not null;
			+--------+---------+---------+
			| ename  | sal     | comm    |
			+--------+---------+---------+
			| ALLEN  | 1600.00 |  300.00 |
			| WARD   | 1250.00 |  500.00 |
			| MARTIN | 1250.00 | 1400.00 |
			| TURNER | 1500.00 |    0.00 |
			+--------+---------+---------+

找出哪些人没有津贴?

select ename,sal,comm from emp where comm is null or comm = 0;
			+--------+---------+------+
			| ename  | sal     | comm |
			+--------+---------+------+
			| SMITH  |  800.00 | NULL |
			| JONES  | 2975.00 | NULL |
			| BLAKE  | 2850.00 | NULL |
			| CLARK  | 2450.00 | NULL |
			| SCOTT  | 3000.00 | NULL |
			| KING   | 5000.00 | NULL |
			| TURNER | 1500.00 | 0.00 |
			| ADAMS  | 1100.00 | NULL |
			| JAMES  |  950.00 | NULL |
			| FORD   | 3000.00 | NULL |
			| MILLER | 1300.00 | NULL |
			+--------+---------+------+

找出工作岗位是MANAGER和SALESMAN的员工?

select ename,job from emp where job = 'MANAGER' or job = 'SALESMAN';
			+--------+----------+
			| ename  | job      |
			+--------+----------+
			| ALLEN  | SALESMAN |
			| WARD   | SALESMAN |
			| JONES  | MANAGER  |
			| MARTIN | SALESMAN |
			| BLAKE  | MANAGER  |
			| CLARK  | MANAGER  |
			| TURNER | SALESMAN |
			+--------+----------+

and和or联合起来用:找出薪资大于1000的并且部门编号是20或30部门的员工。

select ename,sal,deptno from emp where sal > 1000 and deptno = 20 or deptno = 30; // 错误的
select ename,sal,deptno from emp where sal > 1000 and (deptno = 20 or deptno = 30); // 正确的。

注意:当运算符的优先级不确定的时候加小括号。
and的优先级比or高
in等同于or:找出工作岗位是MANAGER和SALESMAN的员工?

select ename,job from emp where job = 'SALESMAN' or job = 'MANAGER';
select ename,job from emp where job in('SALESMAN', 'MANAGER');
select ename,job from emp where sal in(800, 5000); // in后面的值不是区间,是具体的值。
			+-------+-----------+
			| ename | job       |
			+-------+-----------+
			| SMITH | CLERK     |
			| KING  | PRESIDENT |
			+-------+-----------+
not in: 不在这几个值当中。
			select ename,job from emp where sal not in(800, 5000);

模糊查询like
找出名字当中含有O的?
(在模糊查询当中,必须掌握两个特殊的符号,一个是%,一个是_)
%代表任意多个字符,_代表任意1个字符。

select ename from emp where ename like '%O%';
				+-------+
				| ename |
				+-------+
				| JONES |
				| SCOTT |
				| FORD  |
				+-------+

找出名字中第二个字母是A的?

select ename from emp where ename like '_A%';
				+--------+
				| ename  |
				+--------+
				| WARD   |
				| MARTIN |
				| JAMES  |
				+--------+

找出名字中有下划线的?

mysql> select * from t_user;
				+------+----------+
				| id   | name     |
				+------+----------+
				|    1 | zhangsan |
				|    2 | lisi     |
				|    3 | WANG_WU  |
				+------+----------+
select name from t_user where name like '%_%';
				+----------+
				| name     |
				+----------+
				| zhangsan |
				| lisi     |
				| WANG_WU  |
				+----------+
select name from t_user where name like '%\_%';
				+---------+
				| name    |
				+---------+
				| WANG_WU |
				+---------+

找出名字中最后一个字母是T的?

select ename from emp where ename like '%T';
				+-------+
				| ename |
				+-------+
				| SCOTT | 
				+-------+

排序(升序、降序)
按照工资升序,找出员工名和薪资?

select 
		ename,sal 
	from 
		emp 
	order by
		sal;


+--------+---------+
| ename  | sal     |
+--------+---------+
| SMITH  |  800.00 |
| JAMES  |  950.00 |
| ADAMS  | 1100.00 |
| WARD   | 1250.00 |
| MARTIN | 1250.00 |
| MILLER | 1300.00 |
| TURNER | 1500.00 |
| ALLEN  | 1600.00 |
| CLARK  | 2450.00 |
| BLAKE  | 2850.00 |
| JONES  | 2975.00 |
| FORD   | 3000.00 |
| SCOTT  | 3000.00 |
| KING   | 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;
select ename,sal from emp order by sal desc , ename asc;

注意:越靠前的字段越能起到主导作用。只有当前面的字段无法完成排序的时候,才会启用后面的字段。

找出工作岗位是SALESMAN的员工,并且要求按照薪资的降序排列。

	select 
		ename,job,sal
	from
		emp
	where 
		job = 'SALESMAN'
	order by
		sal desc;
+--------+----------+---------+
| ename  | job      | sal     |
+--------+----------+---------+
| ALLEN  | SALESMAN | 1600.00 |
| TURNER | SALESMAN | 1500.00 |
| WARD   | SALESMAN | 1250.00 |
| MARTIN | SALESMAN | 1250.00 |
+--------+----------+---------+
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;

找出平均工资?

select avg(sal) from emp;

找出总人数?

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

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

分组函数自动忽略NULL。

select count(comm) from emp;
		+-------------+
		| count(comm) |
		+-------------+
		|           4 |
		+-------------+
select sum(comm) from emp;
		+-----------+
		| sum(comm) |
		+-----------+
		|   2200.00 |
		+-----------+

select sum(comm) from emp where comm is not null; // 不需要额外添加这个过滤条件。sum函数自动忽略NULL。

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

select avg(sal) from emp; // 平均工资
			+-------------+
			| avg(sal)    |
			+-------------+
			| 2073.214286 |
			+-------------+

select ename,sal from emp where sal > avg(sal); //ERROR 1111 (HY000): Invalid use of group function
思考以上的错误信息:无效的使用了分组函数?

原因:SQL语句当中有一个语法规则,分组函数不可直接使用在where子句当中。why???
怎么解释?
因为group by是在where执行之后才会执行的。

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

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

分组函数也能组合起来用:

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 |
		+----------+----------+-------------+----------+----------+

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

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 ename,sal from emp where sal > (select avg(sal) from emp);

单行处理函数
什么是单行处理函数?
输入一行,输出一行。

计算每个员工的年薪?

select ename,(sal+comm)*12 as yearsal from emp;

重点:所有数据库都是这样规定的,只要有NULL参与的运算结果一定是NULL。
使用ifnull函数:

select ename,(sal+ifnull(comm,0))*12 as yearsal from emp;

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 |
		+--------+---------+
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值