简单了解数据库查询
简单查询
1.查询特定的列
例如:查询所有的员工的姓名和员工
select eid,ename from emp;
2.查询员工所有的列
#方法一:(常用)
select * from emp;
#方法二:
select eid,ename,.....from emp;
3.给列其别名
常用与单独查看某列,查看员工工资。。
#eg:查询出所有员工的编号和姓名,使用汉字别名
SELECT eid AS 编号,ename AS 姓名 from emp;
4.显示不同的记录(意思就是重复的只先显示一次)
select distinct deptld from emp;
5.查询是执行计算
select 1+2*3 ---> 7
#eg:查询出员工的姓名和年薪
select ename,salary*12 from emp;
6.对结果集排序------order by
#order by 后面是按照排序列,from 后是表单
#eg:查询所有部门结果集按照编号升序排列
select * from dept order by did asc; #asc-->ascendant
#eg:查询所有部门结果集按照编号降序排列
select * from dept order by did desc; #desc-->descendant
#如果不加排序规则,默认是升序asc;若按照字符串排序,按Unicode码排序
7.条件查询-----where 后面加条件
条件运算符
< ,<=, >, >=,!=
is null/ is not null , in /not in , between/not between , is / not is
#eg:查询编号为5的员工的所有列
select * from emp where eid=5;
#eg:查询员工工资在5000~7000之间的有哪些?2种方法
1.select * from emp where salary>=5000 and salary <=7000;
2.select * from emp where between 5000 and 7000;
#between 使用就是说明数据 包括5000和7000
#eg:查询员工工资不在5000~7000之间的有哪些?2种方法
select * from emp where not between 5000 and 7000;
#eg:查询员工在20号部门或者在30号部门的有哪些?
select * from emp where deptId in(20,30);
#或者是
select * from emp where deptId=20 || deptId=30;
#eg:查询员工不在20号部门或者在30号部门的有哪些?
select * from emp where deptId not in(20,30);
#day03作业:查询出工资在8000以上的男员工的姓名,性别,工资,部门;结果按照工资的降序排列;
select ename,sex,salary,deptId from emp where sex=1&&salary>8000 order by salary desc;
8.模糊条件查询
条件不清晰,只知道个大概去查询
#eg:查询员工表姓名列中有e字符的名字?
select * from emp where ename like '%e%';
% 匹配任意多个字符 >=0 _ 匹配任意1个字符 =1 |
---|
以上两个匹配必须结合着LIKE关键字使用 |
9.分页查询
查询的结果集有太多的数据,一次显示不完,可以分页显示
需要有两个条件: 每页的数据量、当前的页码
SELECT * FROM emp LIMIT start,count;
#注意:start表示开始的值,count显示的数据量
#注意: start和count值必须是数值型,不能给数字加引号
#eg:每页显示5条数据
SELECT * FROM emp LIMIT 0,5;
SELECT * FROM emp LIMIT 5,5;
SELECT * FROM emp LIMIT 10,5;
#只写一个数值表示要查询数据的数量
复杂查询
1.聚合查询
count()表示查询的数量 sum()求和 avg()平均数 max()最大 min()最小
#eg:查询所有员工的总和?
select sum(salary) from emp;
2.分组查询-----group by
分组查询只能查询聚合函数和分组条件
因为查询显示别的数据没有价值
#查询出男女员工的数量,工资总和,平均工资
select count(sex),sum(salary),avg(salary),sex from emp group by sex; #sex--->分组条件
3.子查询
多个SQL语句的综合
#eg:查询研究部的员工有哪些
步骤一:查询出研究部的部门编号是多少?
select * from dept where dname='研究部'; ---> 10
步骤二:查询上一步结果的员工有哪些?
select * from emp where deptId=10;
#综合:
select * from emp where deptId(select * from dept where dname='研究部');#括号里边不能有分号;
year()获取日期中的年份
month()获取日期中的月份
day()获取日期中的日子
这三个不属于聚合函数
4.多表查询
eg:查询所有的员工姓名及其部门名称
select ename,dname from emp,dept ;#这种写法错误,产生笛卡尔积需添加特殊条件才能避免
#另一种写法
select ename,dname from emp,dept where deptId= did;
外键 主键
#存在的问题:无法查询没有部门的员工,也无法查询没有员工的部门
#新增的多表查询方法
1.外连接----和上一种效果一样,只是语法变了
select ename,dname from emp inner join dept on deptId=did;
2.左外连接 ---显示左边所有内容,即使右边无对应(先写那个那个为左)
select ename,dname from emp left outer join dept on deptId=did;
3.右外连接 ---和左类似
select ename,dname from emp right outer join dept on deptId=did;
4.全连接---full join (mysql不支持)
#另一种办法
union all --》(不合并相同记录) union --》合并相同记录
左外连 union all 右外连 #或者 左外连 union 右外连
补充知识:
项目中的日期时间
时间戳:距离计算机元年(1970-1-1)的毫秒数
1秒=1000毫秒
有日期时间要用bigint,方便之后操作数据方便