2:
表:table
表是数据库的基本组成单位,所有的数据都已表格的形式存在,目的是可读性强
一个表包含行和列
列:被称为数据data‘
行:被称为字段(column)’
学号(int) 姓名(varchar) 年龄(age)\
110 张三 20
111 李四 21
每一个字段应该包含:字段名,数据类型,相关的约束
3:主要学习相应的sql语句,包括增删改查
DQL(数据查询语言):查询语句,凡是select语句都是DQL
DML(数据操作语言):insert,delete,updata对表中的数据进行增删改
DDL(数据定义语言):create,drop,alter,对表结构进行增删改
TCL(事物控制语言):commit提交事物,rollback回滚语言
DCL(数据控制语言):grant授权,revoke撤销权限等
:
4:导入数据
5:一个文件已,sql结尾,这样文件被称为“sql脚本”,
Sql脚本:当一个文件的扩展名为sql,并且该文件中编写了大量的sql语句。
Sql脚本中数据量天大是无法打开,用source命令实现初始化 ’
6:删除数据库:drop database “库名”;
7:查看表的结构:desc “表名”;
11:简单的查询语句(DQL)
语法格式
Select 字段名1,字段名2……from 表名;
提示
1:任何一条sql语句以“;”结尾。
2:sql语句不区分大小写
查询员工的年薪 (字段可以参与运算)
Select ename.sal*12 from emp;
给查询的列重命名(as,有中文别名时用单引号括起来,可省略)
Select ename.sal*12 as yearsal from emp;
查询所有字段
Select * from 表名 //实际开发中不用,效率低
12:条件查询
语法格式:
Select
字段,字段……
From
表名
Where
条件;
查询工资等于5000的员工姓名
Select ename,sal from emp where sal = 5000;
查询SMINT的工资
Select ename,sal from emp where ename = ‘SMINT’;
找出工资高于三千的员工
Select ename,sal from emp where sal >=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闭区间,使用的时候必须左小右大
在数据库中,NULL代表什么都没有,为空,不是一个值,不能用等号
必须使用is null 或者is not null
找出那些人津贴为null
Select ename,sal,comm from emp where comm is null;
找出那些人没有津贴
Select ename,sal,comm from emp where comm is null or
Comm = 0;
找出工作岗位为mamger和salesman的员工
Select ename,job from emp where job = ‘mamger’ or job = ‘salesman’;
And是并且,or是或者
And 和 or连用,and优先级高些
找出薪资大于3000并且部门编号是20或者30部门的员工
Select ename,sal,deptno from sal>=3000 and (deptno = 20 or deptno = 30);
运算符优先级不确定的时候加小括号,优先级最高
In等同于or
找出工作岗位是manager和salesman的员工
1:select ename,job from emp where job = ‘manager’ or job =’salesman’;
2:selecr ename,job from emp where job in(‘manger’,’salesman’)
In 后面的不是区间,是具体的值
Select ename,job from emp where sal in(700,3000); //找的是工资700和3000的人
Not in:不在选中的值当中
模糊查询like(二个特殊符号,%和_)
%代表多个字符,_代表任意一个字符
找出名字中含有o的
Select ename from emp where ename like ‘%o%’;
找出第二个字母是a的
Select ename from emp where ename like ‘a%’;
找出名字中有下划线的(下划线前加一个斜杠,具有转义作用_)
Select ename from emp where ename like ‘% _%’;
找出名字中最后一个字符为t的
Select ename from emp where ename like ‘%t’;
13:排序(升序,降序)
按照工资升序,找出员工名和薪资
Select
Ename,sal
From
Emp
Order by
Sal;
默认是升序,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 , ename asc;
Order by ‘数字‘(数字代表第几列,不建议用,调换列语句就乱了)’
找出工作岗位是salesman的员工,并且按照工资的的降序排
Select ename, job,sal from emp where job = ‘salesman’ order by sal desc;
先执行from,然后是where,在后是select,最后是order by
Select 3
字段
From 1
表名
Where 2
条件
Order by 4
……
Order by是最后执行的,了解程序的执行步骤有助于以后调试语句
14:分组函数(多行处理函数:输入多行,输出一行)
Count 计数
Sum 求和
Avg 平均值
Max 最大值
Min 最小值
所有的分组函数都是对某一组数据进行操作的
找出员工的工资总和
Select sum(sa)l from emp;
找出最高工资
Select max(sal) from emp;
找出最低工资
Select min(sal)from emp;
找出平均工资
Select avg(sal) from emp;
找出总人数
Select count(ename) from emp;
分组函数自动忽略null;
找出工资高于平均工资的员工
Select avg(sal) from emp //平均工资
Select sal,ename from emp where sal>avg(sal) //无效的使用了分组函数
语法:分组语句不能直接出现在where字句中
原因:group by 是在where语句之后执行的,而分组函数要在group
By之后执行,所以有语法错误
正解:
找出工资高于平均工资的员工
1:找出平均工资
Select avg(sal) from emp;
2:找出高于平均工资的员工
Select sal,ename from emp where sal>1;
拼接:Select sal,ename from emp where sal>(Select avg(sal) from emp);
Select … 5
From … 1
Where … 2
Group by … 3 //没有语句默认自成一组
Having … 4
Order by … 6
分组函数也可以组合起来用
Select min(sal),max(sal),avg(sal) from emp;
Count()和count(字段)的区别
Count():不是统计某个字段数据的个数,而是统计总记录条数(目前认为是行数)
Count(字段):统计字段中不为null的数据总数量
15:单行处理函数:输入一行,输出一行
计算每个员工的年薪
Select ename,(sal+comm)*12 as yearsal from emp;
数据库中只要数学表达式中有null,结果一定为null
解决:ifnull() 空处理函数
If为null的数据,就当做什么处理
Ifnull(comm,0)
Select ename,(sal+_ifnull(comm,0))*12 as yearsal from emp;
16:group by 和 having(二个是搭档,having只能和group by用)
Group by:对某个字段或某些字段进行分组
Having:对分组之后的数据进行再次过滤
找出每一个工作岗位的最高薪资
Select max(sal),job from emp group by job;
注意:分组函数一般都会和group by一起使用,这也是被称为分组函数的原因
并且任何一个分组函数一定是在group by语句执行后执行,
当一条sal语句没有group by语句后,整张表自成一组(get)
Select ename,max(sal),job from emp group by job //ename毫无意义。
当一条sql语句中含有group by时,select语句后面只能放参加分组的字段或者分组函数
每个工作岗位的平均薪资
Select avg(sal),job from emp group by job;
多个字段联合起来一块分组
找出每个部门不同工作岗位的最高薪资(将部门和工作岗位一起分组)
Select deptno,job,max(sal) from emp group by job,deptno;
找出每个部门的最高薪资,要求显示薪资大于2500的数据
Select max(sal),deptno from emp group by deptno having max(sal)>2500; //效率太低
Select max(sal),deptno from emp where sal>2500 group by deptno; //先过滤在求值
找出每个部门的平均薪资,要求大于2000的
Select avg(sal),deptno from emp group by deptno having avg(sal)>2000;
Where没法过滤,只能用havaing
完整的sql语句执行顺序
Select…… 5
From…… 1
Where…… 2
Group by…… 3
Having…… 4
Order by…… 6
1:distinct查询结果的出重
Select distinct job from emp; //distinct关键字去除重复记录
Select ename,distinct job from emp //错误
Distinct关键字只能出现在所有字段的最前面
Distinct去重是所有字段联合去重,全部是一样的就会去掉
统计岗位的数量
Select count(distinct job) from emp;
2:连接查询
在实际开发中,大部分情况都不是在单表查询数据,一般都是多张表联合查询取出最终结果,一般一个业务会对应多张表。(尽量减小数据的冗余)
2.1:连接查询的分类
根据语法出现的年份来划分
Sql92(比较老的语法) sql99(比较新的语法)
根据表的连接方式划分:
内连接
等值连接
非等值连接
自连接
外连接
左外连接(左连接)
右外连接(右连接)
全连接(很少用)
2.2:在表的连接查询方面,笛卡尔积现象
找出每一个员工的部门员工,要求显示员工名和部门名
Select ename,dname from emp,dept;
笛卡尔积现象:当二张表进行连接查询时候,没有任何条件限制时候,查询结果条数为二张表记录条数的乘积
2.3:关于表的别名:
Select e.ename,d.dname from emp e,dept d;
表的别名的好处:
1:执行效率高
1:可读性好
2.4:避免笛卡尔积现象,加条件过滤
匹配次数没变,只是减少显示条数
Select e.ename,d.dname from emp e,dept d where e.deptno = d.deptno
2.5:内连接之等值连接,最大特点是条件是等量关系
查询每一个员工的部门名称,要求显示员工名和部门名
Sql92:
Select e,ename,d,dname from emp e,dept d where e.deptno = d.deptno
Sql99:(好处:结构更清晰一些,表的连接条件和where筛选条件分离了)
Select e,ename,d,dname from emp e join dept d on e.deptno = d.deptno
语法:……A inner join B on 条件 where …… //inner可以省略,表示内连接
2.6:内连接之非等值连接,最大特点是连接条件中的关系是非等量关系
找出每个员工的工资等级,要求显示员工名,工资,工资等级
select e.ename,e.sal,s.grade from emp e join salgrade s on e.sal between s.LOSAL and s.HISAL;
2.7自连接:一张表看做二张表,自己连自己
找出每个员工的上级领导,要求要求显示员工名和对应的领导名
Select e,ename,s.ename from emp e join emp s on e.mgr = s.empno;
2.8:外连接
什么是外连接,和内连接的区别
内连接:假设a表和b表进行连接,使用内连接,凡是a表和b表能够匹配上的记录查询出来,a,b二表没有主副之分。
外连接:假设a,b二表进行外连接,a,b二表一张为主表,一张为副表,主要查询主表中的数据,捎带查询附表,当附表中的数据没有和主表的数据匹配上,附表中自动模拟出null与之匹配。
外连接:
左外连接(左连接)表示左边这张表是主表
右外连接(右连接)表示右边这张表是主表
左连接有右连接的写法,右连接有左连接的写法
找出每个员工的上级领导(所有员工都要查出来,没有用null表示)
Left out,right out (out 可以省略)
Select a.name,b.ename from emp a left join emp b on a.mgr = b.empto; (左外连接)
Select a,ename,b,ename from emp b,roght join emp a on a.agr = b.empto;(右外连接)
外连接最重要的特点是主表的数据无条件的查询出来
找出那个部门没有员工
Select a.,b. from emp a right join dept b on a.deptno = b.deptno where a.deptno is null;
//先连接查询在筛选
2.9三张表怎么连接
//表示a表和b表进行表连接,然后a表和c表进行连接
A
Join
B
Join
C
On
找出每一个员工的部门名称和工资等级
Select e.ename,d.dname,s.grade from emp e join dept d join salgrade s on e.deptno = d.deptno and e.sal between s.losal and s.hisal;
或者
Select e.ename,d.dname,s.grade from emp e join dept d on e.deptno = d.deptno join salgrade s on e.sal between s.losal and s.hisal;
找出每个员工的部门名称,工资等级,以及上级领导
Select e.ename,d.dname,s.grade,e.mgr from emp e join dept d on e.deptno = d.deptno join salgrade s on e.sal between s.losal and s.hisal left join emp e1 on e1.empno = e.mgr;
内连接和外连接要根据实际要求进行选择,可能查出来有空值的要往外连接方面想