数据库整理02

62 阅读4分钟

函数

1.字符串函数

CONCAT(S1,S2,...SN) 将字符串拼接成一个字符串
LOWER(str) 将字符串转换成小写
UPPER(str) 将字符串转换成大写
LPAD(str,n,pad) 左填充,用pad填充,达到n个字符串的长度
RPAD(str,n,pad) 右填充,用pad填充,达到n个字符串的长度
TRIM(str) 去掉字符串头部和尾部的空格
SUBSTRING(str,start,len) 返回从字符串str从start位置起的len长度的字符串,索引值是从1开始

//需求是:将企业员工的工号,统一改成5位数,不足的前面补0
update employee set dno =lpad(dno,5,'0');

数值函数

ceil(x) 向上取整
floor(x) 向下取整
mod(x,y) 返回x/y的模
rand() 返回0-1的随机数
round(x,y) 求参数x的四舍五入的值,保留y位小数

   //通过数据库的函数,生成一个6位数的随机验证码
   select lpad(round(rand()*100000,0),6,'0');

流程函数

if(value,t,f) 如果value为true返回t,否则返回f
ifnull(value1,value2) 如果value1不为空返回value1,否则返回value2
case when[val1] then [res1] else [default] end
case[expr] when [val1] then [res1] else [default] end

  select if(true,'ok','error');//value是true返回ok
  //需求:查询表中的员工姓名和工作地址(北京/上海--->一线城市 ,其他---->二线城市
  select 
    name,
  (case workplace  when '北京' then '一线城市' when '上海' then '一线城市' else '二线城市'  end) as '工作地址'
  from emp;
  //筛选出薪水>5000的显示优秀,其他为一般
  select
   name,
   (case when salary>5000 then '优秀' else '一般' end) as '薪水'
  from emp;
  

多表查询

   //连接查询,内连接查询AB交集部分。外连接:左外连接时查询左表所有数据,以及两张表交集部分
   //自连接:当前表与自身的连接查询,自连接必须使用表别名(此时说的交集是指元组),3个表可以进行隐式连接
   
   select employee.ename,department.dname from employee,department where employee.dno=department.dno;
   
   select employee.ename,department.dname from employee inner join department on employee.dno=department.dno;
   
   //外连接
   
   select e.*,d.dname from emp e left  join dept d on e.dno=d.dno;
   
   //自连接,一表看成两张表
   1.查询员工和领导的姓名(只需要在一张表中查询,但是领导也属于员工)
   select a.name,b.name from emp a,emp b where a.mangerid=b.id;
   2.如果员工没有领导也要查询出来(左外)
   
   select a.name ,b.name from emp a left join emp b on a.mangerid=b.id;
   
   

联合查询(union,union all)

  1.将薪资低于5000 和年龄>50 的员工
  select * from emp where salary<5000 
  union all
  select * from emp where age >50;
  
  select * from emp where salary<5000 
  union 
  select * from emp where age >50; //去重
  

子查询

//标量子查询(返回单个值)= <> > >= < <=才能用
//1.查询“销售部” 部门员工信息
select ename from employee where dno=(select id from dept where name='销售部'); 

//2.查询“xxx”入职之后的员工信息
select ename from employee where entrydate >(select entrydate from emp where name='xxx');

//列子查询,对于返回值的列用 IN,NOT IN,ANY(只要任意一个满足就返回),ALL,SOME

//1.查询‘销售部’和‘市场部’的所有员工信息
select * from emp where dep_id in (select id from dept where name='销售部' or name='市场部');

//查询比销售部员工都高的人
select * from emp where salary > all (select salary from dept where name='销售部')
;

//查询比销售部员工任意一个高的人
select * from emp where salary >some (select salary from emp where id= (select id from dept where name='销售部'); 


//行子查询:返回结果时一行(可是多列) = <> in not in
//1.查询与“xxx”的薪资及直属领导 相同的员工信息
select * from emp where (salary,mangerid)=(select salary ,mangerid from emp where name='xxx');

//表子查询 in
//查询和xxx和yyy薪资和直属领导一样的员工
select * from emp where (salary, mangerid) in (select salary, mangerid from emp where name='xxx' or name='yyy');

//查询在“2006-1-1”之后的员工和部门信息
select e.* ,d.* from (select * from emp where date>'2006-1-1' ) e left join dept d on e.dno=d.dno ;


修改更新删除表

 //将id为1的数据,name修改为it
 update  employee set name='it' where id=1;
 update employee set name='is',gender='nv' where id=1;
 update employee set date='2008-2-1';
 //删除表
 delete from emp where gender='女';
 delete from emp;