语法
select 列名1,列名2,列名3... | *
from 表名;
* 表示的是所有字段,在测试环境使用,但数据库调优时会进行调整
*是不会写的,使用具体的字段名称
-- 基本查询select empno,ename,job
from emp;select*from emp;select*from dept;
7.1.2过滤查询
语法
select 列名1,列名2,列名3... | *
from 表名
where 条件;
进行数据的筛选,等到我们需要的数据,过滤掉不符合的数据
-- 过滤查询-- 查询工资高于5000的人select*from emp
where sal >5000;-- 查询工资低于5000的人select*from emp
where sal <=5000;
7.1.2.1条件运算符
= 等于
!=<> 不等于
>>=<<=
-- 条件运算符-- 查询工资不为5000的人select*from emp
where sal <>5000;select*from emp
where sal !=5000;-- 查询名字为九元 单引号表示字符串select*from emp
where ename ='九元';
7.1.2.2逻辑运算符
not and or
-- 逻辑运算符select*from emp
where sal >=5000and ename ='九元';select*from emp
where sal >=5000or ename ='九元';select*from emp
where deptno isnotnull;select*from emp
where deptno isnull;
7.1.2.3特殊的比较运算符
is null 判断数据是否为空;为空显示,不为空不显示
in(值的列表) 返回符合值列表中的数据
like 模糊查询*****
between ... and ... 在范围之内,包含范围的
上述的四个可以和not配合使用
-- 特殊的比较运算符select*from emp
where deptno isnull;select*from emp
where deptno isnotnull;-- 查询在10和20号部门的员工 属于or的关系select*from emp
where deptno in(10,20);select*from emp
where deptno =10or deptno =20;select*from emp
where deptno notin(10,20);select*from emp
where deptno !=10and deptno !=20;-- 模糊查询-- _一个字符的占位 %>=0符号的占位-- 查询名字中有6的人select*from emp
where ename like'%6%';-- 表示6开始select*from emp
where ename like'6%';-- 表示6结尾select*from emp
where ename like'%6';-- 第三个位置为6的select*from emp
where ename like'__6%';-- 倒数第三个字符select*from emp
where ename like'%6__';-- 不像select*from emp
where ename notlike'%6%';-- 查询工资在3000-5000范围内的select*from emp
where sal between3000and5000;-- 等价的select*from emp
where sal >=3000and sal <=5000;-- 可以执行的,但是可读性差 建议将字段写在前面,具体的数值在后面select*from emp
where3000<= sal and5000>= sal;-- 查询工资不在3000-5000范围内的(不带边界)select*from emp
where sal notbetween3000and5000;select*from emp
where sal <3000or sal >5000;
7.1.3计算列
可以对查询的记录进行一定的计算之后进行显示
可以使用 + - * / 四个运算符
-- 计算列select ename,sal +500,comm -100from emp;
7.1.4列别名
使用 as 和 空格为某个列去添加别名
-- 列别名
select ename,sal +500 as 工资,comm -100 奖金
from emp;
7.1.5 distinct去除重复行
-- 去除重复行selectdistinct deptno
from emp;
7.1.6 order by排序
必须是查询的最后一个字句
asc表示升序,默认不写就是
desc表示降序
-- 排序select*from emp
orderby sal;select*from emp
orderby sal asc;select*from emp
orderby sal desc;select*from emp
orderby hiredate;
-- 日期函数select*from emp
where hiredate <'2023-01-01';select*from emp
where hiredate <'2023-01-01 08:00:00';select*from emp
where hiredate between'2023-01-01'andnow();select*from emp
where hiredate between'2023-01-01'and sysdate();
笛卡尔积/集,叉积/集
多张表连接在一起,没有使用过滤条件,会将多张表的数据乘在一起
语法
select *
from a表,b表;
-- 笛卡尔积select*from emp,dept;select*from emp,dept,users;-- 消除笛卡尔积,使用多张表的共有字段-- 默认忽略空值的select*from emp,dept
where emp.deptno = dept.deptno;-- 查询1号员工的个人信息和部门信息select*from emp,dept
where emp.deptno = dept.deptno
and empno =1;
7.2.2内连接
查询出只符合条件的数据
消除笛卡尔积就是内连接
-- 查询1号员工的个人信息和部门信息select*from emp,dept
where emp.deptno = dept.deptno
and empno =1;-- 查询小白666 的所有信息select*from emp,dept
where emp.deptno = dept.deptno
and ename ='小白666';
7.2.3表别名
简化表名的操作
-- 表别名-- 空格select*from emp e,dept d
where e.deptno = d.deptno
and ename ='小白666';-- as (在oracle中不支持)select*from emp as e,dept as d
where e.deptno = d.deptno
and ename ='小白666';
-- 99 内连接select*from emp e innerjoin dept d
on e.deptno = d.deptno;select*from emp e innerjoin dept d
on e.deptno = d.deptno
where empno =1;
7.2.4.2 99语法-外连接
可以查询到不符合条件的数据
外连接分为左外连和右外连
outer left join ... on 条件
outer right join ... on 条件
inner/outer关键字可以省略
-- 99 外连接-- 左外连 左侧表的数据是完全的select*from emp e leftouterjoin dept d
on e.deptno = d.deptno;-- 左右外连是可以互换的select*from dept d rightouterjoin emp e
on e.deptno = d.deptno;-- 右外连 右侧表的数据是完全的select*from emp e rightouterjoin dept d
on e.deptno = d.deptno;-- 满外连 左右两表的数据都可以查询不符合条件的(mysql中是不支持的)select*from emp e fullouterjoin dept d
on e.deptno = d.deptno;
7.2.5子查询
又称查询嵌套,内部查询的数据可以被外部查询所使用
-- 子查询-- 查询工资比九元高的-- 1.查询九元的工资select sal from emp where ename ='九元';-- 2.查询比上面工资高的select*from emp where sal >50000;select*from emp where sal >(select sal from emp where ename ='九元');
7.3DML
数据操作语言
主要用于数据的删除,修改,插入
7.3.1添加数据
语法
insert into 表名(列名1,列名2...)
values (值1,值2....)
列与值一一对应
-- 检查约束 (mysql中length是判断字节数)createtable person (
p_id intprimarykey,
p_name varchar(20)check(length(p_name)>=3));insertinto person values(1,'王成輝6');insertinto person values(2,'王成');insertinto person values(3,'ab');
-- 删除-- 删除表,视图同步deletefrom emp where empno =23;-- 删除视图,是无法完成deletefrom mydept_emp where empno =21;deletefrom mydept_emp where ename ='李昊阳';deletefrom mydept_emp where deptno ='101';deletefrom mydept_emp where dname ='毕明辉部';
修改
修改表,视图中数据同步
修改视图,表中数据同步
-- 修改-- 修改表,视图同步update emp set ename ='王成輝'where empno =18;-- 修改视图,表中同步update mydept_emp set ename ='王成輝66'where empno =18;-- 修改视图,通过dname,修改ename字段 可以改update mydept_emp set ename ='王成輝66'where dname ='总部';-- 通过empno,修改depnameupdate mydept_emp set dname ='王成輝66部'where empno =18;