美文网首页
2019-03-25

2019-03-25

作者: 沫忘丶 | 来源:发表于2019-03-25 17:06 被阅读0次

    -- 建表

    -- 新建一张表

    create table 表名(

    ....

    )

    -- 子查询建表 只继承结构和数据 不继承约束

    create table emp_copy

    as

    SELECT * from emp

    CREATE table emp_copy1

    AS

    select empno,ename,sal from emp where deptno = 10

    CREATE table emp_copy2

    AS

    select empno 工号,ename,sal from emp where deptno = 10

    -- 建一张空表

    create table emp_copy3

    AS

    SELECT * from emp where 1 = 0

    -- 修改工作地点在new york 或chicago 的员工工资 工资增加500

    update emp2

    set sal = sal+500

    where deptno in(SELECT deptno FROM dept where loc in('new york','chicago'))

    -- 删除工作在new york 的员工记录

    delete from emp2

    where deptno in(SELECT deptno FROM dept where loc in('new york'))

    -- 函数 函数名(参数)

    -- 虚表 DUAL

    -- abs 绝对值

    select abs(sal)

    from emp

    -- round(x,y) 将x精确到小数点后y位 四舍五入

    select round(99.567,2),round(99.567,1),round(99.567,0)

    from DUAL

    -- truncate(x,y) 截断

    select truncate(99.567,2),truncate(99.567,1),truncate(99.567,0)

    from DUAL

    -- 字符串函数

    -- substr(str,pos位置 从第几个,length)

    select SUBSTR('helloworld',1,3)

    from dual

    -- 查询姓名以s开头的员工信息

    SELECT ename

    from emp

    where substr(ename,1,1) = 's'

    -- 查询姓名以s,j,m开头的员工信息

    select ename

    from emp

    where substr(ename,1,1) in ('s','j','m')

    -- 显示所有员工姓名的前三个字符

    select ename,substr(ename,1,3)

    FROM emp

    -- 日期函数

    -- mysql 5.6以后支持日期作为默认值

    create table test7(

    regtime datetime default now()

    )

    -- CURDATE()和CURRENT_DATE() :获取当前日期函数;CURRENT_TIME() 获取当前时间函数

    -- now :返回服务器的当前日期和时间

    select curdate(),current_date(),now()

    from dual

    -- DATE_FORMAT(date,format):格式化日期;

    -- %Y 年份

    -- %m(M) 月份(英文)

    -- %d 日

    -- %h 时

    -- %i 分钟

    -- %s 秒

    select DATE_FORMAT(now(),'%Y-%m-%d %h:%i:%m')from dual

    -- DATEDIFF(expr1, expr2):返回两个日期相减相差的天数;

    select hiredate,DATEDIFF(curdate(),hiredate)

    from emp

    -- EXTRACT(unit  FROM  date):从日期中抽取出某个单独的部分或组合

    select hiredate,

    extract(year from hiredate),

    extract(month from hiredate),

    extract(day from hiredate),

    extract(HOUR from now()),

    extract(minute from now()),

    extract(second from now())

    from emp

    select *

    from emp

    where extract(year from hiredate) = '1981'

    -- 一般函数

    -- substr(str,pos,len),

    -- substr(str,pos)

    -- round,`TRUNCATE`(X,D)

    -- 查询部门10,20的员工截止到2000年1月1日,工作了多少个月,入职的月份

    -- TIMESTAMPDIFF() 按照什么求差 日期1,日期2

    select TIMESTAMPDIFF(month,hiredate,now()),

    EXTRACT(month from hiredate),

    DATE_FORMAT(hiredate,'%m')

    from emp

    where deptno in (10,20)

    -- 流程控制函数

    -- case ..when..then

    -- decode

    -- 查询员工姓名 工资 部门编号 部门名称

    select ename,sal,deptno,(case deptno

    when 10 then '开发部'

    when 20 then '实施部'

    when 30 then '测试部'

    else '小卖部' end) dname

    from emp

    -- 计算2000年1月1日到现在有多少月,多少周(四舍五入)。

    select TIMESTAMPDIFF(month,'2000-1-1',now()),TIMESTAMPDIFF(week,'2000-1-1',now())

    from dual

    -- 查询员工ENAME的第三个字母是A的员工的信息(使用2个函数)。

    SELECT *

    from emp

    where ename like '__A%'

    -- 将员工工资按如下格式显示:123,234.00 RMB 。

    select concat(sal,'RMB')

    from emp

    -- 查询员工的姓名及其经理编号,要求对于没有经理的显示“No Manager”字符串。

    select ename,IFNULL(mgr,'No Manager') mgr

    from emp

    -- 将员工的参加工作日期按如下格式显示:月份/年份。

    select DATE_FORMAT(hiredate,'%m/%Y')

    from emp

    -- 在员工表中查询出员工的工资,并计算应交税款:

    -- 如果工资小于1000,税率为0,

    -- 如果工资大于等于1000并小于2000,税率为10%,

    -- 如果工资大于等于2000并小于3000,税率为15%,

    -- 如果工资大于等于3000,税率为20%。

    select sal,(case

    when sal < 1000 then 0

    when sal >=1000 and sal<2000 then sal*0.1

    when sal >=2000 and sal<3000 then sal*0.15

    else sal*0.2 end)tax

    FROM emp

    select sal,(case truncate(sal/1000,0)

    when 0 then 0

    when 1 then sal*0.1

    when 2 then sal*0.15

    else sal*0.2 end)tax

    FROM emp

    -- 问题

    -- 查询语句 查询员工姓名 部门名称 工作地点

    select ename,dname,loc

    from emp,dept

    -- 涉及的表示一张以上 两张表就会发生自动连接

    -- 连接规则 :笛卡尔积 一张表的所有记录与另一张表记录全部匹配的情况

    select ename,dname,loc

    from emp,dept

    where emp.deptno = dept.deptno

    -- 注意 同名列需要加表名作为前缀

    -- 涉及一张以上表 别落下条件 否则会出现笛卡尔积

    --      表名也可以起别名, 方便写前缀

    -- 查询所有员工编号 姓名 部门编号 工作地点

    select empno,ename,d.deptno,loc

    from emp e,dept d

    where e.deptno = d.deptno

    -- 查询工作地点在 new york 的员工编号 姓名 部门编号 工作地点

    select empno,ename,d.deptno,loc

    from emp e,dept d

    where e.deptno = d.deptno and loc = 'NEW YORK'

    -- 1.写一个查询,显示所有员工姓名,部门编号,部门名称。

    select ename,d.deptno,dname

    from emp e,dept d

    where e.deptno = d.deptno

    select ename,d.deptno,dname

    from emp e

    join dept d

    on e.deptno = d.deptno

    -- where loc = 'chicago'

    -- 2.写一个查询,显示所有工作在CHICAGO并且奖金不为空的员工姓名,工作地点,奖金

    select ename,loc,comm

    from emp e,dept d

    where e.deptno = d.deptno and loc = 'CHICAGO' and comm is not null

    -- 3.写一个查询,显示所有姓名中含有A字符的员工姓名,工作地点。

    select ename,loc

    from emp e,dept d

    where e.deptno = d.deptno and ename like '%A%'

    -- 工资登记表

    -- 1 0 600

    -- 2 601 1500

    -- 3 1501 2500

    -- 4 2501 4000

    -- 5 4001 10000

    create table salgrade(

    grade int auto_increment,

    losal decimal(7,2) default 0,

    hisal decimal(7,2) default 0,

    primary key(id)

    )

    -- 查询员工姓名 工资 奖金 工资等级

    select ename,sal,comm,grade,losal,hisal

    from emp

    join salgrade

    on sal >= losal and sal<= hisal

    select ename,sal,comm,grade,losal,hisal

    from emp

    join salgrade

    on sal between losal and hisal

    -- 查询员工姓名 工资 奖金 工资等级 部门名称 要求只显示工资等级2以上的信息

    select ename,sal,comm,grade,dname

    from emp e

    join dept d

    join salgrade

    on e.deptno = d.deptno and sal BETWEEN losal and hisal

    where grade >2

    -- 自连接

    -- 查询每个员工的姓名和直接上级姓名

    select e.ename,m.ename

    from emp e

    join emp m

    on e.mgr = m.empno

    相关文章

      网友评论

          本文标题:2019-03-25

          本文链接:https://www.haomeiwen.com/subject/ynebvqtx.html