数据库---单表查询基础

sql、DB、DBMS是什么?

DB:
数据库,数据库实际上在硬盘上是以文件形式存在
DBMS:
数据库管理系统,常见msql,Oracle,DB2,Sybase,SqlServer
SQL:
结构化查询语句,一门标准语言,适用于所有数据库产品

先编译(由DBMS完成),后执行SQL语句
DBMS负责执行SQL语句,通过执行SQL语句来操作DB中的数据

什么是表?

表(table)是基本组成单元,行被称为数据/记录(data),列被称为字段(column)
每个字段包括字段名,数据类型,相关约束的属性

SQL语句分类

DQL(数据查询语言): 查询语句,凡是select语句都是DQL。
DML(数据操作语言):insert delete update,对表当中的数据进行增删改。
DDL(数据定义语言):create drop alter,对表结构的增删改。
TCL(事务控制语言):commit提交事务,rollback回滚事务。(TCL中的T是Transaction事务)
DCL(数据控制语言): grant授权、revoke撤销权限等。(root超管创建用户使用DCL)

导入数据

第一步:登录mysql数据库管理系统
	dos命令窗口:
		mysql -uroot -p密码
第二步:查看有哪些数据库
	show databases; (这个不是SQL语句,属于MySQL的命令。)mysql自带的
	+--------------------+
	| Database           |
	+--------------------+
	| information_schema |
	| mysql              |
	| performance_schema |
	| test               |
	+--------------------+
第三步:创建属于我们自己的数据库
	create database xrh; (这个不是SQL语句,属于MySQL的命令。)
第四步:使用xrh数据
	use xrh; (这个不是SQL语句,属于MySQL的命令。)
第五步:查看当前使用的数据库中有哪些表?
	show tables; (这个不是SQL语句,属于MySQL的命令。)
第六步:初始化数据
	mysql> source加上sql文件路径(直接拖进去)

SQL脚本

当一个文件的扩展名是.sql,并且该文件中编写了大量的sql语句,我们称这样的文件为sql脚本。
注意:直接使用source命令可以执行sql脚本。
sql脚本中的数据量太大的时候,无法打开,请使用source命令完成初始化
删除数据库:drop database xrh;
查看表结构:desc dept(表名);
查看表中的数据:select * from 表名

mysql常用命令

mysql> select database(); 查看当前使用的是哪个数据库
mysql> select version(); 查看mysql的版本号。
\c 命令,结束一条语句
查看创建表的语句:show create table emp(表名);

DQL语句(数据查询语言)

语法格式
select 字段名1,字段名2,字段名3,… from 表名;

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

查询员工的年薪?(字段可以参与数学运算。)
select ename,sal * 12 from emp;
给查询结果的列重命名?
select ename,sal * 12 as yearsal from emp;
别名中有中文?用单引号
select ename,sal * 12 as 年薪 from emp; // 错误
select ename,sal * 12 as ‘年薪’ from emp;
注意:标准sql语句中要求字符串使用单引号括起来。虽然mysql支持双引号,尽量别用,别的数据库管理系统不能用
as可以省略
查询所有字段?
select * from emp; // 实际开发中不建议使用*,效率较低。

条件查询
语法格式:
select
字段,字段…
from
表名
where
条件;
执行顺序:先from,然后where,最后select
select ename from emp where sal = 5000;
select sal from emp where ename = ‘SMITH’; // 字符串使用单引号括起来。
找出工资在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';

在数据库当中NULL不是一个值,代表什么也没有,为空。
空不是一个值,不能用等号衡量。
必须使用 is null或者is not null
select ename,sal,comm from emp where comm is null;
null跟0 在数据库中不同

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); // 正确的。
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后面的值不是区间,是具体的值
not in: 不在这几个值当中。
模糊查询like
在模糊查询当中,必须掌握两个特殊的符号,一个是%,一个是_
%代表任意多个字符,_代表任意1个字符。

找出名字中第二个字母是A的?
select ename from emp where ename like ‘_A%’;
找出名字具有下划线的?
select name from t_user where name like ‘%_%’;转移符

找出名字中最后一个字母是T的?
select ename from emp where ename like ‘%T’;

排序(升序、降序)
默认是升序。怎么指定升序或者降序呢?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;

分组函数(多行处理函数)
count 计数
sum 求和
avg 平均值
max 最大值
min 最小值
select sum(sal) from emp;
分组函数一共5个。
分组函数还有另一个名字:多行处理函数。
多行处理函数的特点:输入多行,最终输出的结果是1行。
分组函数自动忽略NULL。
select ename,sal from emp where sal > avg(sal); //ERROR 1111 (HY000): Invalid use of group function
思考以上的错误信息:无效的使用了分组函数?
原因:SQL语句当中有一个语法规则,分组函数不可直接使用在where子句当中。why???因为group by 在where函数之后执行,分组函数必须在分完组之后使用,where的时候还没有分组,不能执行分组函数

找出工资高于平均工资的员工?
	第一步:找出平均工资
		select avg(sal) from emp;
		
	第二步:找出高于平均工资的员工
		select ename,sal from emp where sal > 2073.214286;
		合并:select ename,sal from emp where sal > (select avg(sal) from emp);

count()和count(*)区别,count( *)是所有字段的总数,前者是表示不为null的数据总量

单行处理函数
计算每个员工的年薪?
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 sum(comm) from emp where comm is not null; // 不需要额外添加这个过滤条件。sum函数自动忽略NULL

group by和having
group by : 按照某个字段或者某些字段进行分组。
having : having是对分组之后的数据进行再次过滤。
案例:找出每个工作岗位的最高薪资。
select max(sal),job from emp group by job;
先进行按照job分组,找出每种工作种的最大工资

注意:分组函数一般都会和group by联合使用,并且任何一个分组函数(count sum avg max min)都是在group by语句执行结束之后才会执行的。
当一条sql语句没有group by的话,整张表的数据会自成一组。

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

因为group by 在where函数之后执行,分组函数必须在分完组之后使用,where的时候还没有分组,不能执行分组函数

记住一个规则:当一条语句中有group by的话,select后面只能跟分组函数和参与分组的字段。
案例:找出每个部门不同工作岗位的最高薪资。
select deptno,job,max(sal) from emp group by deptno,job;

找出每个部门的最高薪资,要求显示薪资大于2900的数据。
第一步:找出每个部门的最高薪资
select max(sal),deptno from emp group by deptno;
第二步:找出薪资大于2900
select max(sal),deptno from emp group by deptno having max(sal) > 2900; // 这种方式效率低。
select max(sal),deptno from emp where sal > 2900 group by deptno; // 效率较高,建议能够使用where过滤的尽量使用where。
找出每个部门的平均薪资,要求显示薪资大于2000的数据。
select deptno,avg(sal) from emp group by deptno having avg(sal)>2000;
这个不能用where

关于查询结果的去重

select distinct job from emp;
关键字distinct去重
select distinct deptno,job from emp;
联合去重
案例:统计岗位的数量?
select count(distinct job) from emp;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值