当你专注一件事的时候,时间总是过得很快!

  • foreign key 练习
  1. -- 切换数据库
  2. use stumgr
  3. -- 删除班级表
  4. drop table t_class1
  5. -- 创建一个班级表
  6. create table t_class1 (
  7. cno int auto_increment not null,
  8. cname varchar (12) not null,
  9. room int (4),
  10. primary key (cno)
  11. );
  12. -- 查看班级表
  13. desc t_class1
  14. -- 添加班级数据
  15. insert into t_class1 values (null,'Javay1班',501),(null,'Javay2班',502),(null,'大数据1班',401);
  16. -- 查看班级表信息
  17. select * from t_class1
  18. -- 清空班级表数据
  19. truncate table t_class1
  20. -- 删除学生表
  21. drop table t_student1
  22. -- 创建学生表
  23. create table t_student1 (
  24. sno int primary key auto_increment,
  25. name varchar (20),
  26. sex char (1) default '男',
  27. age int,
  28. classno int,
  29. constraint fk_t_student1_classno foreign key (classno) references t_class1 (cno)
  30. );
  31. -- 查看学生表
  32. desc t_student1
  33. -- 添加学生表数据
  34. insert into t_student1 values (null,'张三','男',22,1);
  35. insert into t_student1 values (null,'李思','女',23,3);
  36. insert into t_student1 values (null,'王武','男',22,3);
  37. insert into t_student1 (name,age,classno) values ('赵六',21,2),('孙琦',21,1);
  38. -- 查看学生表数据
  39. select * from t_student1
  40. -- 清空学生表数据
  41. truncate t_student1
  • 单行函数练习
  1. -- 单行函数
  2. select * from emp
  3. select lower(ename) from emp
  4. select upper(ename) from emp
  5. select ename from emp
  6. select ename,lower(ename) from emp
  7. select ename,lower(ename),upper(ename) from emp
  8. select ename,lower(upper(ename)) from emp
  9. -- 使用函数并没有更改数据库中的数据值,只是简化了查询的代码量
  10. select sal from emp
  11. select min(sal),max(sal),sum(sal),avg(sal),count(sal) from emp
  12. -- 函数的分类
  13. -- 单行函数 即对(多行)每一条记录进行操作,分别产生一条记录
  14. -- lower(ename)、upper(name)
  15. -- 多行函数 对(多行)每一条记录进行操作,结果只产生一条记录
  16. -- max(sal)、min(sal)、sum(sal)、avg(sal)、count(sal)
  17. -- 区分单行函数和多行函数
  18. -- 方法1、按照定义区分
  19. -- 方法2、除了多行函数(常用的有5个),都是单行函数
  20. -- 字符函数
  21. select * from emp where length(ename) = 6
  22. select ename from emp where length(ename) = 6
  23. select ename,sal from emp where length(ename) = 6
  24. select ename,lower(ename),upper(ename) from emp
  25. select empno,ename,job,substring(ename,1,3) subname from emp -- 截取字符串 从第一位到第三位 显示职员信息(工号,姓名,岗位)
  26. select empno,ename,job,replace(job,"CLERK",'店员') from emp where job = 'clerk'
  27. select empno,ename,job,replace(job,'MANAGER','经理') from emp where job = "MANAGER"
  28. select job from emp where job = 'manager'
  29. -- select job where job = 'manager' from emp -- 错误的写法
  30. select empno,ename,job,replace(job,"MANAGER","经理") from emp where job = 'manager'
  31. select empno,ename,job,replace(job,'manager',"经理") from emp where job = "MANAGER" -- replace()括号中的职位名必须和表格中一样,不然显示不出后面的汉字
  32. -- 数值函数
  33. select
  34. abs(-5), -- 取绝对值
  35. ceil(3.2), -- 向上取整
  36. floor(3.2), -- 向下取整
  37. round(3.4),
  38. round(3.5), -- 四舍五入
  39. mod(10,3),
  40. mod(10,5), -- 取模 相当于取余
  41. pi(), -- 圆周率
  42. sqrt(25), -- 开平方
  43. pow(2,5),
  44. pow(5,2) -- 幂运算
  45. select rand(),rand(),rand() -- 返回0~1之间的随机数
  46. select truncate(3.1415926,3) -- truncate(num,n)返回num舍弃小数点后第n位后的数值
  47. -- 日期函数
  48. select now(),sysdate(),sleep(3),sysdate(),now()
  49. select now(),curdate(),curtime()
  50. -- 流程函数
  51. select ename,deptno,sal,if(sal >= 3000,"high","low") from emp
  52. select ename,deptno,sal,if(sal >= 3000,'高收入层','低收入层') from emp order by sal
  53. select ename,deptno,job,sal*12+comm year_income from emp -- 算上补贴的年收入,补贴(comm)为null无法算出年收入
  54. select ename,deptno,job,sal*12+ifnull(comm,0) year_income from emp -- 加上ifnull(comm,0)可以把补贴为null的置为0,从而得出年收入
  55. -- ifnull(comm,0) if comm is null then comm = 0
  56. select nullif(1,1),nullif(1,2),nullif(2,1),nullif(2,2) -- if 1 == 2 then null else 1
  57. select ename,deptno,sal,case when sal >= 3000 then '高收入' else "低收入" end sal_level from emp
  58. select ename,deptno,sal,
  59. case when sal >= 3000
  60. then 'high'
  61. else case when sal >= 2000
  62. then 'mid'
  63. else 'low'
  64. end
  65. end
  66. from emp
  67. -- 其他函数
  68. select database(),user(),version(),password('zhangsan'),inet_aton('192.168.10.1'),inet_ntoa(3232238081)
  69. -- mysql 提供了一个名为dual的虚拟表 默认的from dual是可以省略的
  • 单表查询练习
  1. -- where 子句练习
  2. select * from emp -- 先查看下员工表信息
  3. select * from emp where empno = 7566 -- 查询工号为7566的职员信息
  4. select * from emp where sal > 3000 -- 查看薪水大于3000的职员信息
  5. select * from emp where job = 'MANAGER'
  6. select * from emp where JOB = 'manager' -- mysql 中默认不去分大小写
  7. -- 加上区分大小写的条件 即在查询的字段名前加上binary
  8. select * from emp where binary job = 'manager'
  9. select * from emp where job != 'manager'
  10. select * from emp where job > 'manager' -- 字符串也可以大于小于
  11. select * from emp where job <> "manager"
  12. select * from emp where hiredate < '1981-12-23'
  13. -- and 逻辑运算符
  14. select * from emp
  15. select * from emp where sal <= 3000 and sal >= 1200
  16. select * from emp where sal between 1200 and 3000 -- between 表示的意思是闭区间
  17. select * from emp where sal not between 3000 and 1200
  18. select * from emp where sal <= 3000 && sal >= 1200 -- &&等同于and
  19. -- or 逻辑运算符
  20. select * from emp where deptno = 30 or 10 -- 不能这样表述
  21. select * from emp where deptno = 30 or deptno = 10 -- 查询部门编号为3010
  22. select * from emp where deptno = 30 || deptno = 10 -- ||等同于or
  23. select * from emp where deptno in (30,10)
  24. select * from emp where deptno in (10,30)
  25. -- 模糊匹配
  26. -- 姓名中带K %代表任意多个字符
  27. select * from emp
  28. select * from emp where ename = '%K%' -- 不能使用等号 而是要用单词 like
  29. select * from emp where ename like '%k%' -- K 不区分大小写
  30. -- 加上binary就是区分大小写
  31. select * from emp where binary ename like '%K%'
  32. select * from emp where binary ename like '%k%'
  33. select * from emp where binary ename not like '%k%'
  34. select * from emp where binary ename not like '%K%'
  35. -- 姓名的第二个字母是L _单个下划线代表任意一个字符 第几个字符要加几个_
  36. select * from emp where ename like '__m%' -- 名字中第二个字母是m的职员信息
  37. select * from emp where ename like '_M%' -- 名字中第一个字母是m的职员信息
  38. select * from emp where binary ename like '_m%' -- 区分大小写 名字中第一字母是小写m的职员信息
  39. select * from emp where binary ename like '_M%' -- 名字中第一个字母是大写M的职员信息
  40. -- is null
  41. select * from emp where comm = 0 -- 不是is null的用法
  42. select * from emp where comm is null -- 查看commnull的职员信息,commnullcomm = 0 代表的含义是不同的
  43. select * from emp where comm is not null -- is 后加 not 是正确的用法 not加在is前不符合语法要求
  44. -- select * from emp where comm not is null
  45. select * from emp where comm != 0 -- 不包括commnull的数据
  46. -- 小括号 优先级高
  47. select * from emp where job = 'salesman' or "CLERK" and sal >= 1280 -- and运算符的优先级比or 不包括工资大于1280clerk
  48. select * from emp where (job = "salesman" or job = "clerk") and sal >= 1280
  49. select * from emp where job = 'SALESMAN' or (job = 'CLERK' and sal >1280)
  • 表单查询多行函数
  1. -- 多行函数
  2. select max(sal),min(sal),sum(sal),count(sal),avg(sal) from emp
  3. select
  4. max(comm),min(comm),sum(comm),avg(comm),count(comm)
  5. from emp
  6. select * from emp
  7. select
  8. max(ename),min(ename),sum(ename),avg(ename),count(ename)
  9. from emp
  10. -- 统计有几个员工
  11. select
  12. empno,count(1)
  13. from emp
  14. select count(comm) from emp -- 不能通过领补贴的人来统计
  15. -- 统计有几个部门
  16. select deptno from dept
  17. select count(distinct deptno) from emp -- 部门40并未出现在emp表中,所以此语句输出的部门个数是3
  18. select count(deptno) from dept
  19. -- 对任意一张表,统计有几条记录
  20. select count(*) from emp
  21. select count(*) from dept
  22. select empno from emp -- 可以通过主键统计
  23. select 1 from emp
  24. select count(1) from emp -- 统计表的记录个数建议用此方法,比count(*)效率高
  25. -- 统计有几个岗位
  26. select count(distinct job) from emp
  27. -- 多行函数会自动排除null
  28. -- max(),min(),count()适用于所有数据类型
  29. -- sum()avg()仅限于数值类型(整点 浮点)
  30. -- 多行函数会更多地用在分组查询中 group by
  • 多表查询练习
  1. -- SQL99多表连接查询
  2. -- 查询员工的编号、姓名和部门编号
  3. select * from emp
  4. select empno,ename,deptno from emp
  5. -- 查询员工的编号、姓名和部门编号、部门的名称
  6. -- 交叉连接 使用关键字join
  7. select * from dept
  8. select * from emp
  9. select *
  10. from emp
  11. cross join dept
  12. select *
  13. from dept
  14. cross join emp -- 左和右的区别 左连接 右连接
  15. -- 自然连接
  16. select *
  17. from emp
  18. natural join dept
  19. -- 使用关键字natural 会自动按照所有的同名列进行匹配,并且同名列只显示一次
  20. -- 优点是:简单
  21. select empno,ename,deptno,dname
  22. from emp
  23. natural join dept
  24. -- 缺点:没有指定各字段属于哪个表,执行时需要进行判断,效率低
  25. -- 解决:给各个字段指定表的名字
  26. select emp.empno,emp.ename,deptno,dept.dname -- 自然连接中同名列不能使用表名前缀
  27. from emp
  28. natural join dept
  29. -- 缺点:表名如果很长,字段多的时候,SQL语句就会显得复杂
  30. -- 解决:使用别名
  31. select e.empno,e.ename,deptno,d.dname
  32. from emp e
  33. natural join dept d
  34. -- using 子句
  35. -- 自然连接的缺点:会自动按照“所有的”同名列进行匹配,如果希望按照某一个同名列进行匹配,自然连接无能为力
  36. -- 解决:使用using子句
  37. select *
  38. from emp e
  39. join dept d
  40. using(deptno) -- e.deptno = d.deptno
  41. select e.empno,e.ename,deptno,d.dname
  42. from emp e
  43. join dept d
  44. using(deptno)
  45. -- on子句
  46. -- naturalusing的缺点:都必须有同名列
  47. -- 连接查询要求两个表必须由关联(比如empdeptnodeptdeptno),但是不要同名
  48. -- 如果有关联,但是不同名,该怎么解决?
  49. select empno,ename,d.deptno,d.dname -- 关联列必须使用前缀
  50. from emp e
  51. join dept d
  52. on(e.deptno = d.deptno) -- 此处eddeptno碰巧同名了
  53. -- 查询员工的编号、姓名、部门编号、部门的名称,要求薪水大于2000
  54. select empno,ename,d.deptno,d.dname
  55. from emp e
  56. join dept d
  57. on(e.deptno = d.deptno)
  58. where sal > 2000
  59. -- 小结:
  60. -- 实际开发中尽量使用on子句,不管是否有同名列,都可以使用;虽然稍显复杂,但是可读性高
  61. -- SQL99连接查询的优点:连接条件和筛选条件是分开的
  62. -- 连接条件:on(e.deptno = d.deptno) using(deptno) natural cross
  63. -- 筛选条件:where sal > 2000
  64. -- SQL92中,连接条件和筛选条件是没有分开的
  • 外连接查询
  1. -- SQL99外连接查询
  2. select * from dept
  3. select * from emp
  4. update emp set deptno = null where empno = 7788; -- scott员工设置成没有部门
  5. select *
  6. from emp e
  7. join dept d
  8. on(e.deptno = d.deptno) -- 返回13条记录,缺少了没有部门的员工scott,缺少了没有员工的部门40;只显示匹配的数据
  9. -- 左外连接
  10. select *
  11. from emp e
  12. left join dept d
  13. on(e.deptno = d.deptno)
  14. -- 右外连接
  15. select *
  16. from emp e
  17. right join dept d
  18. on(e.deptno = d.deptno)
  19. -- 全外连接
  20. select *
  21. from emp e
  22. full join dept d
  23. on(e.deptno = d.deptno) -- mysql中没有全外连接
  24. -- 曲线救国
  25. select *
  26. from emp e
  27. left join dept d
  28. on(e.deptno = d.deptno)
  29. union -- 使用union关键字可以曲线实现全外连接
  30. select *
  31. from emp e
  32. right join dept d
  33. on(e.deptno = d.deptno)
  • group by having练习
  1. -- 统计各部门的平均工资(只显示平均工资2000以上的)
  2. select deptno,avg(sal)
  3. from emp
  4. group by deptno
  5. having avg(sal) > 2000
  6. order by avg(sal)
  7. select avg(sal) from emp -- 这是所有部门的平均工资
  8. select deptno from emp
  9. select deptno,avg(sal) from emp -- 字段不能和分组函数共存,除非该字段是分组group by字段
  10. select deptno,avg(sal)
  11. from emp
  12. group by deptno
  13. select deptno,avg(sal)
  14. from emp
  15. -- where avg(sal) > 2000 -- where 子句不能使用多行函数(分组函数)
  16. group by deptno
  17. having avg(sal) >2000 -- 各个子句的书写是有顺序的
  18. order by avg(sal) desc
  19. -- 统计各个岗位的平均工资,除了manager
  20. select distinct job from emp
  21. select job,avg(sal)
  22. from emp
  23. group by job
  24. having job != 'MANAGER'
  25. order by avg(sal)
  26. select job,avg(sal)
  27. from emp
  28. group by job
  29. having job != 'MANAGER' && job != 'PRESIDENT'
  30. order by avg(sal)
  31. -- where 子句不能使用多行函数(分组函数)
  32. select job,avg(sal),count(1)
  33. from emp
  34. where count(1) > 3
  35. group by JOB
  36. -- 如果没有group by子句,select列表中不允许出现字段(单行函数)与多行函数混用的情况
  37. -- 出现在select列表中的字段,如果不是包含在多行函数中,那么该字段必须同时在group by子句中出现
  38. -- 不允许在where子句中使用多行函数
  39. -- 小结
  40. -- where子句和having子句的联系和区别
  41. -- 联系
  42. -- 都是筛选记录
  43. -- 区别
  44. -- wheregroup by之前,havinggroup by之后
  45. -- where中不能出现在多行函数,having中可以出现多行函数
  46. -- select语句总结
  47. -- select语法格式
  48. -- select column,group_function(column)
  49. -- from table
  50. -- ◆[where condition]
  51. -- ◆[group by group_by_expression]
  52. -- ◆[having group_condition]
  53. -- ◆[order by column]
  54. -- select语句执行顺序
  55. -- from--->where--->group by--->select-having--->order by
  • group by having加强练习
  1. -- 列出工资最小值小于2000的职位
  2. select job,min(sal)
  3. from emp
  4. group by job
  5. having min(sal) < 2000
  6. order by min(sal)
  7. -- 获取各个职位的最小工资
  8. select job,min(sal)
  9. from emp
  10. group by job
  11. having min(sal)
  12. order by min(sal) desc -- 按最小工资降序排列
  13. -- 获取各个职位的最小工资,筛选出小于2000
  14. select job,min(sal)
  15. from emp
  16. group by job
  17. having min(sal) < 2000
  18. -- 列出平局工资大于1200元的部门和工作搭配组合
  19. select * from emp
  20. select * from dept
  21. select distinct deptno from emp
  22. select distinct job from emp
  23. select distinct job,deptno from emp
  24. select deptno,job,avg(sal),count(1)
  25. from emp
  26. group by deptno,job
  27. having avg(sal) > 1200
  28. order by avg(sal) desc
  29. -- 统计人数小于4的部门的平均工资
  30. select deptno,avg(sal),count(1)
  31. from emp
  32. group by deptno
  33. having count(1) < 4
  34. -- 统计各部门的最高工资,排除最高工资小于3000的部门
  35. select deptno,max(sal)
  36. from emp
  37. group by deptno
  38. having max(sal) >= 3000
  39. order by max(sal)

一休哥~~~

MySQL练习与小结的更多相关文章

  1. Node + Express + Mysql的CMS小结

    因为之前用过上述的组合完成过很多系统,而这一次是为了实现一个帮助系统的静态网页发布.因为很久不写,重点说遇到的几个坑: 1.库版本的问题 比如mysql连接数据库一直报错,因为系统重装过,所以重新安装 ...

  2. MySQL常用数据库小结

    SQL分类: DDL-数据定义语言(CREATE,ALTER,DROP,DECLARE) DML-数据操纵语言(SELECT,DELETE,UPDATE,INSERT) DCL-数据控制语言(GRAN ...

  3. MySQL常用数据类型小结

    在 MySQL 中,有三种主要的类型:字符串.数字和日期/时间类型. 目录 [隐藏]  1 字符串类型 2 数值类型 3 日期和时间类型 4 使用建议 5 艺搜参考 字符串类型 CHAR 0-255字 ...

  4. mysql数据库优化小结

    一.常见数据库的优化操作 1.表的设计要符合三范式. 2.添加适当的索引,索引对查询速度影响很大,必须添加索引.主键索引,唯一索引,普通索引,全文索引 3.添加适当存储过程,触发器,事务等. 4.读写 ...

  5. MySQL数据备份小结

    一 MySQL备份恢复总结: 1,备份所有库 2,分库备份 3,备份某库中的某表 4,备份某库中的多个表 5,分表备份 6,只备份表结构 7,只备份数据 二 MySQL备份恢复参数总结: -A 备份所 ...

  6. [转载] 新浪微博MySQL优化的小结和反思

    原文: http://mp.weixin.qq.com/s?__biz=MzA4Nzg5Nzc5OA==&mid=206762682&idx=1&sn=1233ed1496d7 ...

  7. MySql数据备份与恢复小结

    方法1 备份 .sql" FROM 表名; 恢复 .sql" INTO TABLE 表名; 补充几个设置 1. FIELDS TERMINATED BY ',' #字段间隔符2. ...

  8. MySQL 视图知识点小结

    视图本身是一个虚拟表,不存放任何数据.在使用SQL语句访问视图的时候,它返回的数据是MySQL从其他表中生成的.视图和表在同一个命名空间, MySQL在很多地方对于视图和表是同样对待的.不过视图和表也 ...

  9. mysql 存储过程项目小结

    1. false :0  true 1 切记 官方文档:http://dev.mysql.com/doc/refman/5.0/en/numeric-type-overview.html BOOL,  ...

随机推荐

  1. 原生JS滚动条位置处理

    // 滚动条位置 var scrollPosition = { // 位置 result: 0, // 监听位置 rememberPosition: function () { var type = ...

  2. vue的v-for循环渲染列表时,解决没有:key警告问题(:key的作用)

    :key是为vue的响应式渲染提供方法,在列表中单条数据改变的情况下,可以进行单独渲染,减少页面资源消耗. 当前页面如果有列表渲染v-for,并且在v-for的循环标签中没有:key元素时,控制台会出 ...

  3. Qt应用程序的发布

    1 Windows平台上的应用程序发布 Windows发布工具 windeployqt.exe是Qt自带的Windows平台发布工具.windeployqt.exe文件在Qt的bin目录下,Qt的每一 ...

  4. Node Buffer 利用 slice + indexOf 生成 split 方法

    demo let buf = Buffer.from('你你我们我你们'); Buffer.prototype.split = function (seq) { let arr=[]; let len ...

  5. Proxy + Reflect 实现 响应的数据变化

    Proxy 对象用于定义基本操作的自定义行为(如属性查找,赋值,枚举,函数调用等) let p = new Proxy(target, handler); get(target, propKey, r ...

  6. POJ 3741 Raid (平面最近点对)

    $ POJ~3741~Raid $ (平面最近点对) $ solution: $ 有两种点,现在求最近的平面点对.这是一道分治板子,但是当时还是想了很久,明明知道有最近平面点对,但还是觉得有点不对劲. ...

  7. 【GDOI2016模拟3.9】暴走的图灵机

    题目 分析 我们发现当两个字符串合并时,a0.a1表示左右两个字符串中有多少个T,C表示合并处新增的T的个数,那么 a0=a1 a1=a0+a1+C 令s0和s1表示左右手两个字符串,那么每一次操作后 ...

  8. Vue-Awesome-Swiper实现缩略图控制循环,循环背景图,显示多图轮播,点击左右滚动一张图

    效果图: 本姐只展示关键代码哈 上代码:网站有完整代码,但是数据不是循环的.https://surmon-china.github.io/vue-awesome-swiper/ 循环数据的代码在此: ...

  9. SQL SERVER 数据库如何限制一列不能重复(已经有主键)

    ALTER TABLE 表名ADDCONSTRAINT 约束名 UNIQUE (列名) -------------------------------------------------------- ...

  10. [CF1188B]Count Pairs 题解

    前言 这道题目是道好题. 第一次div-2进前100,我太弱了. 题解 公式推导 我们观察这个式子. \[(a_i+a_j)(a_i^2+a_j^2)\equiv k \mod p\] 感觉少了点什么 ...