关系性数据库
关系型数据库管理系统(RDBMS)是应用最广泛的一种数据库管理系统,关系型数据库管理系统以表、字段和记录等结构来组织数据。表用来保存数据,每个表由一组字段来定义其结构,记录则是表中的一条数据。
结构化查询语言(SQL)
对数据库操作的普通话
结构化查询语言分类
- 数据查询语言(DQL:Data Query Language):语句主要包括SELECT,用于从表中检索数据。
- 数据操作语言(DML:Data Manipulation Language):语句主要包括INSERT,UPDATE和DELETE,用于添加,修改和删除表中的行数据。
- 事务处理语言(TPL:Transaction Process Language): 语句主要包括COMMIT和ROLLBACK,用于提交和回滚。
- 数据控制语言(DCL:Data Control Language):语句主要包括GRANT和REVOKE,用于进行授权和收回权限。
- 数据定义语言(DDL:Data Definition Language):语句主要包括CREATE、DROP、ALTER,用于定义、销毁、修改数据库对象
Dos命令
dir
列出所有文件
cls
清屏
cd path路径
cd E:\PHP\phpstudy_pro\Extensions\MySQL5.7.26\bin
- 链接数据库库命令
mysql -hlocalhost -uroot - p
mysql 常用命令
-
show databases
显示所有数据库 -
use 数据库名
使用该数据库use door
-
quit
退出数据库
基本查询语句
官方格式
SELECT []
select 列名 from 表名;
select deptno, dname, loc from dept;
算术运算符
让emp表中所有员工的工资 + 200,同时显示之前的工资和加薪之后的工资select sal + 200 from emp;
-
select sal * 1.2 from emp;
员工试用期6个月,转正后月薪上调20%,请查询出所有员工工作第一年的年薪所得(不考虑奖金部分,年薪的试用期6个月的月薪+转正后6个月的月薪)
select ename, (sal*6+sal*1.2*6
) from emp;
- 空值NULL
任何运算符和NULL运算都是空值
select ename, sal*12+comm from emp;
列别名
使用列别名的方法
- 方式1: 列名 列别名(空格)
- 方式2: 列名 AS 列别名 (AS)
以下三种情况列别名两侧需要添加双引号 - 有空格的时候
- 有特殊字符的时候
select ename 员工, sal 工资, comm 奖金 from emp;
select ename "员工 工人",sal 工资 from emp;
select ename 员工姓名, sal 工资收入, ifnull(comm) 奖金, sal*6+sal*1.2*6+ifnull(comm,0) 总收入 from emp;
知识点
nvl(列,值)
如果列为空 ,那么给予相对于的值(oracle)特有ifnull(列,值 )
如果列为空 ,那么给予相对于的值(mysql)-
select distinct deptno from emp;
清除重复行
显示表结构
-
desc emp;
where 语句
where 语句 可以作为查询的限定条件
格式: 在from之后
-
select ename , hiredate,deptno from emp where deptno = 30 ;
- varchar
select ename, sal, hiredate, job from emp where job = 'manager';
select ename, sal, hiredate, job from emp where job = "manager";
在sql中字符串一般用单引号,双引号值用来放在单引号中
- date类型
select * from emp where hiredate > '1982-01-01';
<> !=
都为不等于
- 查询职位为SALESMAN的员工编号、职位、入职日期。
查询1985年12月31日之前入职的员工姓名及入职日期。
查询部门编号不在10部门的员工姓名、部门编号
select empno , job, hiredate from emp where job = 'salesman';
select ename 员工姓名, hiredate 入职日期 from emp where hiredate >'1985-12-31 ';
select ename 员工姓名 , deptno 部门编号 from emp where deptno != 10;
执行顺序 先走from 然后筛选where 最后select
-
特殊比较符
-
select ename 入职日期, hiredate 入职日期 from emp where hiredate between '1982-01-23' and '1987-05-23
-
select ename 员工姓名, deptno 部门编号 from emp where sal between 3000 and 5000;
-
select ename 员工姓名, deptno 部门编号 from emp where deptno between 10 and 20;
-
select ename 员工姓名 , empno 员工编号 from emp where mgr in (7902,7566,7788);
模糊查询LIKE :
select * from emp where ename like 'M%';
select * from emp where ename like '_M%';
select * from emp where ename like '%M%';
%是匹配前后所有有M的 _ 只是一个占位符_M表示第二位是M的
select * from emp where job like 'MAN@_%'escape'@';
escape '...' 把什么字符设置为转义符号。
IS NULL 运算符
判断比较的值是否为null
查询名字以w开头。
select ename 员工姓名 from emp where ename like 'W%';
名字底数第二个字母为T的人
select ename 员工姓名 from emp where ename like '%T_ ';
查询奖金为NULL的人
select ename 员工姓名, IFNULL(COMM,0) 奖金 from emp where comm IS NULL;``
逻辑运算符
AND OR NOT
可以和 between and , like , in , is null一起使用
运算符的优先级
- 排序
order by 语句
select Distinct ename from where ... order by
select * fro
m emp order by ename;
排序规则 数字升序 由小到大 desc 逆序 放在最后
字母 A - Z
日期 小到大
执行顺序
先 from 后 where 在 select 最后order by
LIMIT语句
select 数据 FROM 数据源
LIMIT [start,]length;
说明: 接受一个或两个参数 一个参数从0返回n行 ,两个参数从开始返回length个
select * from emp limit 5,2;
LIMIT 在 order by 后面
多表链接
语法:
SELECT table1.column, table2.column
FROM table1, table2
WHERE table1.column1 = table2.column2;
select * from emp, dept;
笛卡尔积
:第一个表的所有行和第二个表的所有行都产生连接。
行数相乘,把所有情况列举出来
为了避免笛卡尔积的产生 , 我们在WHERE中列举条件
等值连接
select * from emp, dept where emp.deptno = dept.deptno;
-
select empno , ename, emp.deptno, loc from emp,dept where dept .deptno = emp.deptno and loc like 'new%';
在前面打上表名能提高性能
限制歧义列名
- 在用到多个表时可以使用表名作前缀来限定列;
- 通过使用表前缀可以提高性能;
- 通过使用列的别名可以区分来自不同表但是名字相同的列;
使用别名
表起完别名后,只能用别名
select e.ename 员工列表, e.job 工作, d.dname what from emp e, dept d where e.deptno = d.deptno;
- 写一个查询,显示所有员工姓名,部门编号,部门名称。
select e.ename 员工姓名, e.deptno 部门编号, d.dname 部门名称 from emp e, dept d where e.deptno = d.deptno;
- 写一个查询,显示所有工作在CHICAGO并且奖金不为空的员工姓名,工作地点,奖金
select e.ename 员工姓名, ifnull(e.comm,0) 奖金, d.loc 工作地点 from emp e, dept d where e.deptno = d.deptno and d.loc = 'chicago ';
- 写一个查询,显示所有姓名中含有A字符的员工姓名,工作地点。
select e.ename 员工姓名, d.loc 工作地点 from emp e, dept d where e.deptno = d.deptno and e.ename like '%a% ';
非等值连接
select * from emp e, salgrade s where e.sal between s.losal and s.hisal;
多表连接写法分析
- 查询每个员工的编号,姓名,工资,工资等级,所在工作城市,按照工资等级进行升序排序。
select e.empno 员工编号, ename 员工姓名,e.sal 工资,s.grade 工资等级,d.loc 所在工作城市 from emp e, dept d, salgrade s where (e.deptno = d.deptno) and (e.sal between s.losal and s.hisal) order by s.grade
自连接
自己和自己连接
查询所有工作在NEW YORK和CHICAGO的员工姓名,员工编号,以及他们的经理姓名,经理编号。
select w.ename 员工列表,w.empno 员工编号 , m.ename 领导列表, m.empno 领导编号 from emp w ,dept d, emp m where w.mgr = m.empno and w.deptno = d.deptno and d.loc in('new york','chicago') ;
交叉连接
创建一个员工表的交叉连接
就是笛卡尔积
select e.empno, e.ename, d.dname from emp e cross join dept d;
自然连接
相比于等值连接, 等值连接直接指明连接条件,自然连接是自己赵(两个表字段名相同,自动添加) 。自然连接无法控制用哪些字段连接.
select e.empno, e.ename, d.dname from emp e natural join dept d;
外连接
- 左外连接
左外连接以FROM句中的左边表为基表,该表所有
select e.ename,e.deptno,d.dname from emp e left outer join dept d on e.deptno = d.deptno
- 右外连接
select e.ename,e.deptno,d.dname from emp e right outer join dept d on e.deptno = d.deptno
联系
创建一个员工表和部门表的交叉连接。
select * from emp cross join dept;
-
使用自然连接,显示入职日期在80年5月1日之后的员工姓名,部门名称,入职日期
select e.ename 员工姓名, d.dname 部门名称, hiredate 入职日期 from emp e natural join dept d where hiredate > '1980-05-01';
-
使用左连接,查询每个员工的姓名,经理姓名,没有经理的King也要显示出来。
select w.ename 员工姓名, m.ename 经理姓名 from emp w left outer join emp m on w.mgr = m.empno;
使用右连接,查询每个员工的姓名,经理姓名,没有经理的King也要显示出来
select w.ename 员工姓名, m.ename 经理姓名 from emp w right outer join emp m on m.empno = w.mgr ;
-
显示员工SMITH的姓名,部门名称,直接上级名称
select w.ename , m.ename , d.dname from emp w , emp m , dept d where (d.deptno = w.deptno ) and(w.mgr = m.empno) and (w.ename ='smith');
-
显示员工姓名,部门名称,工资,工资级别,要求工资级别大于4级。
select e.ename 员工姓名, d.dname 部门名称, e.sal 工资, s.grade 工资级别 from emp e, dept d, salgrade s where (d.deptno = e.deptno) and ((e.sal > s.losal) and (e.sal < s.hisal)) and (s.grade > '4 ');
-
显示员工KING和FORD管理的员工姓名及其经理姓名。
select w.ename 管理员名称, m.ename 下属名称 from emp w left outer join emp m on w.empno = m.mgr where w.ename in ('king','ford');
-
显示员工姓名,参加工作时间,经理名,参加工作时间,要求参加时间比经理早。
select w.ename 员工姓名 , w.hiredate, m.ename 经理姓名, m.hiredate from emp w, emp m where w.mgr = m.empno and w.hiredate < m.hiredate;