中括号代表可选,大括号代表至少有一条
最简单的 select * from tablename;
mysql> select stu_name as ‘学生姓名’,gender as ‘性别’,address ‘地址’,email ‘邮箱’ from student;
mysql> select s.stu_name as ‘学生姓名’,s.gender as ‘性别’,s.address ‘地址’,s.email ‘邮箱’ from student s;
mysql> select 1+1;
select [distinct] {*|column_name [as 别名] [,…]}
from table_name [as 别名];
连接:
1、内连接:两个表符合关联条件的数据才进行展示
select a.,b. from a [inner] join b on a.id=b.id;
select a.,b. from a,b where a.id=b.id;//笛卡尔积
2、外连接:主表的数据全部展示,附表只展示符合关联条件的数据
左外连接:以left join的左边的表为主表,关联右表的数据
右外连接:以right join的右边的表为主表,关联左表的数据
3、全连接:
MySQL是没有全连接的,使用union
union:联合并去重
union all:联合不去重
左外连接
union
右外连接
4、自连接:自己关联自己
mysql> select GradeName,stu_name from grade inner join student on GradeID=grade_id where GradeName=‘大四’;
±----------±----------+
| GradeName | stu_name |
±----------±----------+
| 大四 | 黄药师 |
| 大四 | 洪七公 |
| 大四 | 欧阳锋 |
| 大四 | 老顽童 |
±----------±----------+
4 rows in set (0.00 sec)
select g.GradeName,s.stu_name from grade g,student s where g.gradeID=s.grade_id and GradeName=‘大四’;
很是消耗内存 4*7=28 笛卡尔积 在这个基础上进行一个筛选
用join的情况会在4条和7条一次比较是否相等,完成了数据量的减少,再来where条件,把过滤分成了两部做
distinct不能放在某一个字段前面,要放在所有字段前面
like模糊查询:
在where子句中,使用like关键字进行模糊查询
与“%”一起使用,表示匹配0或任意多个字符
与“_”一起使用,表示匹配单个字符
条件查询:
语法格式
select 字段,字段。。
from 表名
where 条件
select ename from emp where sal = 5000;
#字符串使用单引号括起来
select sal from emp where ename =‘SMITH’;
select ename,sal from emp where sal>3000;
select ename,sal from emp where sal<>3000;
select ename,sal from emp where sal between 1100 and 3000;
select ename,job from emp where job=‘SALESMAN’ or job=‘MANAGER’;
select ename,job from emp where job in(‘SAKESNAB’,‘MANAGER’);
#in后面的每一项都是具体的值,不是区间
select ename,job from emp where sal in(1000,5000);
#模糊查询like?找出名字当中含有O的,(在模糊查询当中,必须掌握两个特殊符号,一个是%一个是_ )
#%代表任意多个字符,_代表任意一个字符
select ename from emp where ename like ‘%o%’;
按照工资升序找出员工名字和薪资
select ename,sal from emp order by sal;//升序
asc表示升序 desc表示降序
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;
多个字段同时排序 越靠前的字段起的主导作用越大,只有当前面的字段无法完成排序的时候,才会启用后面的字段
select ename,sal from emp order by 1; 按照第一列排序,不要这么做
select ename,sal from emp order by sal;
找出工作岗位是salesman的员工,并且要求按照薪资的降序排列
select ename,job,sal from emp where job=‘salesman’ ordey by sal desc;
先执行from 再执行where 再查找 最后排序输出
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;
找出平均工资?
selevt avg(sal) from emp;
找出总人数?
select count(*) from emp;
select count(ename) from emp;
分组函数一共五个,分组函数还有另一个名字,多行处理函数
多行处理函数的特点:输入多行,最终输出的结果一行
分组函数自动忽略空null
select count(comm) from emp;
单行处理函数?
输入一行,输出一行。
计算每个员工的年薪?
select ename,(sal+ifnull(comm,0))*12 as yearsal from emp;
有空参加的运算,结果都为空 800+null=null没有值
重点:所有数据库都是这样规定的,只要有null参与的运算结果一定是null
ifnull(可能为null的数据,被当作什么处理):属于单行处理函数
select ename,ifnull(comm,0) from emp;
select sum(comm) from emp; 证明忽略空了,对comm求和,结果不是null
where comm in not null 不需要额外添加这个过滤条件,自动忽略
找出工资高于平均工资的员工?
select ename,sal from emp where sal>avg(sal);//错误
思考以上的信息:无效的使用了分组函数
原因:SQL语句当中有一个语法规则,分组函数不可直接使用在where子句当中,why?
怎么解释?
因为group by是在where执行结束之后才执行的,分组函数必须在分完组之后才能用
第一步:找出平均工资
select ename,sal from emp where sal>(select avg(sal) from emp);
select语句嵌套select语句,子查询
count()和count(具体的某个字段),他们的区别是什么
count()统计的是总记录条数
count(具体的某个字段)这个字段当中不为空的字段条数
分组函数也能组合起来用
select count(*),sum(sal),avg(sal),max(sal),min(sal) from emp;
group by和having
group by 按照某个字段或者某些字段进行分组
having:having是对分组之后的数据进行再次过滤
案例:找出每个工作岗位的最高薪资
select max(sal) from emp group by job; 通过这个字段进行分组
注意:分组函数一般都会和group by联合使用,这也是为什么它被成为分组函数的原因
并且任何一个分组函数都是在group by 语句执行结束之后才会执行的
select 6
from 1
where 2
group by 3
having 4
order by 5
select avg(sal) from emp group by;//实际上有一个缺省的默认的group by就是把整张表当作一组
当一条SQL语句有group by的时候,只允许select出现参加分组的字段,以及分组函数
否则语法错误,数据没有意义
当一条SQL语句没有group by的话,整张表的数据会自成一组
每个工作岗位的平均薪资?
select job,avg(sal) from emp group by job;
多个字段能不能联合起来一块分组?
案例:找出各个部门不同工作岗位的最高薪资
select deptno,job,sal from emp;
两个字段联合分组
select
deptno,job,max(sal)
from
emp
group by
deptno,job;
找出每个部门的最高薪资,要求显示薪资大于2900的数据
第一步:找出每个部门的最高薪资
select max(sal) from emp group by deptno;
第二步:找出薪资大于2900的
select max(sal) from emp group by deptno having max(sal)>2900;//这种方式效率低
select max(sal) from emp where sal>2900 group by deptno;//效率较高,建议可以使用where过滤的尽量使用where
找出每个部门的平均薪资,要求显示薪资大于2000的
select avg(sal) from emp group by deptno having avg(sal)>2000;
where后不能使用分组函数,只能用having过滤,having是group by的搭档,只是对分完组的数据不满意课再次过滤
17.总结一个完整的dql语句怎么写?
select 5
from 1
where 2
group by 3
having 4
order by 6