常见的数据库管理系统:
IBM---->eclipse; Oracle 甲骨文(sun:太阳) Oracle做数据库起家的。 Oracle—>Mysql AB公司 Oracle、Mysql、DB2、Sybase SqlServer 支持标准sql的数据库管理系统
端口号是软件在计算机上的唯一标识
oracle端口是1521;mysql端口号是3306
卸载mysql
1、删除注册表 2、删除安装的文件及隐藏的ProgramData 3、打开mysql安装包-----选择第三个remove 4、重启电脑
1.sql、DB、DBMS分别是什么、它们之间的关系
DB(Database):数据库,数据库实际上在硬盘上以文件的形式存在 DBMS(Database Management System):数据库管理系统,常见的有:Mysql,oracle DB2 Sybase SqlServer sql:结构化查询语言,是一门标准通用的语言;标准的sql适合于所有的数据库产品;sql属于高级语言 sql语句在执行的时候,实际上内部也会先进行编译,然后再执行sql.(sql语句的编译由DBMS完成) 关系: sql由DBMS执行,通过sql语句来操作DB当中的数据。 DBMS-(执行)–>sql–(操作)–>db
什么是表?
table:是数据库基本组成单元,所有的数据都以表格的形式组织,目的是可读性强。 行–>被称为数据/记录(data) 列–>被称为字段(colum) 每个字段应该包括哪些属性? 字段名、数据类型、相关约束。
SQL语句的分类:
DQL(数据查询语言):查询语句,凡是select语句都是DQL。 DML(数据操作语言):insert、delete、update,对表当中的数据进行增删改。 DDL(数据定义语言):create、drop、alter,对表结构的增删改。 TCL(事务控制语言):commit提交事务、rollback回滚事务。 DCL(数据控制语言):grant授权、revoke撤销权限等。
什么是sql脚本?
文件以sql的扩展名是.sql结尾,该文件编写了大量的sql语句。这样的文件称为‘sql脚本’。 test.sql,这个以sql结尾,这样的文件称为’sql脚本‘。
简单的查询语句(DQL)
语法格式: select 字段1、字段2、字段3…from 表名; 提示: 1.任何一条sql以;结尾 2.sql语句不区分大小写
查询年薪的信息
select sal* 12 as ‘年薪’ from emp; as可以省略
查询所有的字段
select * from emp;// *效率低,不建议
条件查询: 语法格式:
select 字段1,字段2… from 表名 where 条件; 执行顺序:先from,然后where,最后select
查询规工资等于5000的员工姓名 select ename from emp where sal =5000; 查询smith的工资 select sal from emp where ename=‘smith’; 找出工资高于3000的员工 select ename,sal from emp where sal >3000; 找出工资不等于3000的员工 select ename from emp where sal<>3000; select ename from emp where sal!=3000; 找出工资在1100到3000之间的员工,包括1100和3000 select ename from emp where sal between 1100 and 3000; select ename from emp where sal >=1100 and sal<=3000;
条件查询:
1、= 、<>或者!= 、<、<=、>、>= 2、between … and …等同于>= and <= [闭区间],字符方面:左闭右开,了解 3、is null 为null id not null不为空 4、and 并且 5、or 或者 6、in 包含,相当多个or(not in 不在这个范围中) 7、not可以取非,主要用在id、in里 8、like 模糊查询 ‘%a%’ %任意 ‘_%’ _任意一个字符
找出哪些人津贴为null select comm ename from emp where comm = null; 找出哪些人津贴不为null select comm ename from emp where comm is not null; 找出哪些人没有津贴 select ename ,sal comm from emp where comm is null or comm=0;
找出工作岗位是manager和salesman的员工 select ename ,job from emp where job=‘manager’ or job =‘salesman’;
找出薪资大于1000的,并且部门编号是20或者30的部门的员工 [and、or联合用] select ename ,sal ,deptno from emp where sal>1000 and (deptno =20 or deptno=30); (优先级别不确定加小括号)
in等同or:找出工作岗位是mansger和salesman的员工
select ename ,job from emp where job=‘manager’ or job=‘salesman’; select ename,job from emp where job in(‘manager’,‘salesman’); 工资是800和5000的员工 select ename ,job from emp where sal in(800,5000);是具体的值。不是区间
模糊查询
找出名字中含有字母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’;
排序:升序、降序
按照工资升序,找出员工名和薪资 升序: select ename ,sal from emp order by sal asc; 升序: select ename ,sal from emp order by sal; 降序: select ename ,sal from emp order by sal desc;
按照规则的降序排列,当工资相同的时候,再按照名字的升序排列 select eanme from emp order by sal desc ,eanme asc; 找出工作岗位是salesman的员工,并且要求按照薪资的降序排列 select ename ,job from emp where job=‘salesman’ order by sal desc;
分组函数?
1、count计数 2、sum求和 3、avg平均值 4、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(eanme) from emp;
分组函数一共右5个。 分数函数另外一个名字是多行处理函数。 多行处理函数大特点: 输入多行,最终输出的结果是1行
分组函数自动忽略null.
ifnull()空处理函数:
ifnull:处理为null的数据,进行预处理 计算每个员工的年薪? select ename ,(sal+ifnull(comm,0))*12 as 年薪 from emp; 重点:只要有null参与的运算结果一定是NULL
找出工资高于平均工资的员工 select ename,sal from emp where sal>(select avg(sal) from emp);
cout(*)和count(sal)区别
*统计是总记录数,忽略null count(字段)不为null的数据总数量
分组函数组合起来使用:
select count(*),sum(sal) ,avg(sal), max(sal) ,min(sal) from emp;
group by 和having
group by:按照某个字段或者某些字段进行分组 having:是对分组后的数据进行再次过滤。
找出每个工资岗位的最高薪资 select job,max(sal) from emp group by job;
分组函数和group by联合使用,group by先执行,分组函数后执行
执行顺序:
select … from 表名 where … group by … having … order by… limit …;
找出每个工资岗位的平均薪资? select job,avg(sal) from emp group by job; 找出每个部门不同工作岗位的最高薪资 select max(sal), job,deptno from emp group by deptno,job; 找出每个部门的最高薪资,要求显示薪资大于2500的数据 1.找出每个部门的最高薪资 select max(sal) deptno from emp group by deptno 2.要求显示薪资大于2500的数据 select max(sal) deptno from emp group by deptno having max(sal)>2900 这种方式效率低 select max(sal) deptno from emp group where sal>2900 group by deptno 这种方式效率高 找出每个部门的平均薪资,要求显薪资大于2000的数据 select avg(sal) ,deptno from emp group by deptno having avg(sal)>2000;//只能使用having过滤 提示:gruop by进行分组不满意,再进行过滤使用having
distinct去重
select distinct job,deptno from emp; 提示:distinct只能在字段最前方,job,deptno联合去重
统计岗位的数量
select count(distinct job) from emp;
连接查询
在实际开发中,大部分情况不是单表查询,而是多表查询取出最终结果 在实际开发中,一般一个业务都会对应多个表,譬如:学生和班级,起码2张表 存在一张表,数据易冗余。
表的连接有几类
内连接:ab2张表平等关系,没有主副之分 外连接: ab2张表,有主表和副表之分 全连接 内连接:假设a和b表进行连接,使用内连接的话,凡是a表和b表能够匹配出来的记录查询出来,这就是内连接 Ab2张表没有主副之分,2张表是平等的 Select a.ename ‘员工’,b.ename ‘领导’ from emp a inner join emp b on a.mgr=b.empno
外连接:假设a和b进行连接,使用外连接的话,ab2张表中有一张表是主表,一张表是副表,主要查询是主表中的数据,捎带查询副表,当副表的数据没有和主表的数据进行匹配,副表自动模拟出null与之匹配
外连接的分类
左外连接(左连接):表示左边的表是主表 Select a.ename ‘员工’,b.ename ‘领导’ from emp a left join emp b on a.mgr=b.empno 右外连接(右连接):表示右边的表是主表 Select a.ename ‘员工’,b.ename ‘领导’ from emp a right join emp b on a.mgr=b.empno
表的别名:
好处: 1执行效率高 2可读性好
避免笛卡儿积现象:
加条件进行过滤 思考:避免笛卡尔积现象,会减少记录次数吗? 不会,次数还是56次,只不过显示的是有效的记录。
找出每个员工的部门名称,要求显示员工名和部门名
select e.ename ,d.dname from emp einner join dept don e.deptno=d.deptno;//sql92语法推荐
语法:
… A join B on 连接条件 where …
找出每个员工的工资等级,要求显示员工名、工资、工资等级
select e.ename,e.sal,s.grade from emp e inner join salgrade s on e.sal between s.losal and s.hisal; inner表示内连接
自连接最大的特点:一张表看作2张表。自己连自己
找出每个员工的上级领导,要求显示员工名和对应的领导名
select a.ename as ‘员工’,b.ename as ‘领导’ from emp a inner join emp b on a.mgr=b.empno; //内连接 inner
找出每个员工的上级领导,要求显示员工名和对应的领导名
select a.ename as ‘员工’,b.ename as ‘领导’ from emp a left outer join emp b on a.mgr=b.empno; //带left左边是主表 //左外连接outer是外,可省略
找出每个员工的上级领导,要求显示员工名和对应的领导名
select a.ename as ‘员工’,b.ename as ‘领导’ from emp b right outer join emp a on a.mgr=b.empno; //带right右边是主表 //右外连接 outer是外,可省略
查询哪个部门没有员工
select d.* from emp e right join dept d on e.deptno=d.deptno where e.empno is null; //right右边是主表 //右外连接
3张表:找出每一个员工的部门名称以及工资等级
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; … A join B join C on … 表示:A表和B表先进行表连,连接之后A表继续和c表进行连接
找出每一个员工的部门名称以及工资等级、以及上级领导
select e.ename ‘员工’,d.dname ,s.grade,e1.ename ‘领导’ 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 e.mgr=e1.empno;