复习

day01 数据库相关:

create database db4 character set utf8;
show databases;
show create database db4;
drop database db4;
use db4;

表相关:
create table t1 (字段);
show tables;
desc t1;
show create table t1;
create table t2 (字段)engine=innodb/myisam    charset=utf8;

修改:
rename table t2 to t3;
alter table t2 add age int;
               change age age2 int;
               modify age double after id;
               drop age;
drop table t2;

数据相关:
,,),(,,)
,);
 ;
;
select * from t1;
;

day02:
主键  primary key 唯一 非空
auto_increment
not null
comment
‘’   ``
事务 ;
show variables like '%autocommit%'
begin  commit  rollback
数据库分类
DDL:数据定义语言 craete alter drop
DML: 数据操作语言 insert update delete select
DQL select
TCL:事务控制语言  begin commit rollback
DCL:数据控制语言 控制表的权限
数据类型
整数 int bitint
浮点数 double decimal(m,d)
日期 date time  datatime timestamp
字符串 char varchar text
其他

day03
 别名
    去重 distinct
    where
    and or
    ,,)
    between x and y
    like  _  单个未知   %多个未知
    order by 字段名1,字段名2
    limit ,
    concat(s1,s2,s3)
    数值计算
    ,)
    日期:
    now() curdate() curtime()
    date(now()) time(now())
    extract(year from now())
    month day hour minute second

    date_format(now(),'') %Y y m c d H h i s
    str_to_date('','') 把字符串时间转成date

    age = ifnull(x,y);
    聚合函数
    sum() avg() count(*) max() min()

    字符串函数
    char_length()
    instr(x,y)
    locate(x,y)
    insert(str,begin,length,newStr)
    lower()  upper()
    left() right()
    ,)
    trim()
    repeat ()
    replace(str,'a','b')
    reverse('abc')

数学
floor()
)
truncate
,
 

GROUP BY 语句

-查询hero表中男女的平均年龄
select sex,avg(age) from hero
group by sex;

-查询hero表 每类型的平均年龄
select type,avg(age) from hero
group by type;

-查询 每种类型中 价格最贵的
select type,max(money) from hero
    group by type;

-查询每种类型的人数
select type,count(*) from hero
    group by type;


-查询 每种性别 平均价格,最大年龄和最便宜的价格 是多少
select sex,avg(money) 平均价格,max(age) 最大年龄,min(money) 最便宜价格 from hero
    group by sex;


-查询 每种类型 年龄在30岁以下的人数是多少
  select type,count(*) from hero

    group by type;

-查询 每种类型下男女各多少人
select type,sex,count(*) from hero
group by type,sex;


-- 查询出每个分类下商品的库存总量
 select category_id,sum(num)
    from t_item
    group by category_id; 

-- 查询出每个分类商品所对应的平均单价
 select category_id,avg(price)
    from t_item
    group by category_id;

-- 查询每个部门各多少人
 select deptno,count(*)
    from emp
    group by deptno;

1.案例:查询emp表中每个部门的编号,人数,工资总和,最后根据人数进行升序排列,如果人数一致,根据工资总和降序排列。
 select deptno,count(*) c,sum(sal) s
    from emp
    group by deptno
    order by c,s desc;
2.案例:统计每个部门下工资在1000~3000之间的部门的编号,平均工资,最低工资,最高工资,根据平均工资进行升序排列。
select deptno,avg(sal) a,min(sal),max(sal) from emp

    group by deptno
    order by a;


3.案例:查询含有上级领导的员工,每个职业的人数,工资的总和,平均工资,最低工资,最后根据人数进行降序排列,如果人数一致,根据平均工资进行升序排列
select job,count(*) c,sum(sal),avg(sal) a,min(sal)
    from emp
    where mgr is not null
    group by job
    order by c desc,a;

练习

-- 1. 每个部门中,每个主管的手下人数
 select deptno,mgr,count(*)
    from emp
    group by deptno,mgr;

-- 2. 每种工作的平均工资
select job,avg(sal)
    from emp
    group by job;


-- 提高题 3. 每年的入职人数
 select extract(year from hiredate) y,count(*)
    from emp
    group by y;

有条件分组统计

HAVING 子句

-聚合函数不能写在where 后面 因为执行where的时候聚合函数还没有执行
-having要和聚合函数结合使用,虽然可以写普通字段的条件 但是普通字段的条件推荐写在 where后面

-查询hero表中平均年龄在30岁以下的类型
 select type,avg(age)
    from hero

    group by type

    order by 字段名

SQL关键字执行顺序: 1.from 从那张表 2.where 普通字段过滤 3.group by 分组 4.having 聚合字段过滤 5.order by 排序 6.select 筛除

-查询所有分类商品所对应的库存总量中,高于1000的总量
 select category_id,sum(num) s
    from t_item
    group by category_id
    ;

-查询所有分类商品所对应的平均单价中,均价低于100分类
 select category_id,avg(price) a
        from t_item
        group by category_id
        ;

-查询编号238和编号917分类商品的平均单价
select category_id,avg(price)
    from t_item
    ,)
    group by category_id;

回顾:group by 和 having

课堂练习

1.案例:查询emp表中,每个部门的平均工资高于2000的部门的编号,部门的人数,平均工资,  最后根据平均工资进行升序排列。
 select deptno,avg(sal) a,count(*)
    from emp
    group by deptno

    order by a;

2.案例:查询emp表中名字中不是以'K'开头的信息,每个部门的最低工资高于1000的部门的编号,工资总和,平均工资以及最低工资,最后根据平均工资进行升序排列。
 select deptno,min(sal) m,sum(sal),avg(sal) a
    from emp
    where ename not like 'k%'
    group by deptno

    order by a;

3.案例:查询emp表中部门编号是10,30号部门的员工,每个职业的最高工资低于5000的职业的名称,人数,平均工资,最高工资,最后根据人数进行升序排列,如果人数一致,根据最高工资进行降序排列。
 select job,max(sal) m,count(*) c,avg(sal) a
    from emp
    ,)
    group by job

    order by c,m desc;

4.案例:查询emp表中,每个部门的编号,人数,工资总和,最高工资以及最低工资,过滤掉最高工资是5000的部门,根据部门的人数进行升序排列,如果人数一致,则根据最高工资进行降序排列。
  select deptno,count(*) c,sum(sal) s, max(sal) max, min(sal) min
    from emp
    group by deptno

    order by c,max desc;

5.案例:查询emp表中工资在1000~3000之间的员工信息,每个部门的编号,工资总和,平均工资,过滤掉平均工资低于2000的部门,按照平均工资进行升序排列
 select deptno,sum(sal) s,avg(sal) a
    from emp

    group by deptno

    order by a;

6.案例:查询emp表中名字不是以‘S’开头,每个职位的名字,人数,工资总和,最高工资,过滤掉工资是3000的职位,根据人数进行升序排列,如果人数一致,根据工资总和进行降序排列。
 select job,count(*) c,sum(sal) s,max(sal) m
    from emp
    where ename not like 's%' 

    group by job
    order by c,s desc;

7.案例:查询emp表的信息,每个职位的名称,人数,平均工资,最低工资,过滤掉平均工资是3000的职位信息,根据人数进行降序排列,如果人数一致,根据平均工资进行升序排列
 select job,count(*) c,avg(sal) a,min(sal)
    from emp
    group by job

    order by c desc,a;

子查询

MySQL子查询

思考:查询攻击力最高的英雄的所有信息
-如果不用子查询 需要写两行sql

    ;
-通过子查询 把两条sql语句整合到一起
    select * from hero where att=(select max(att) from hero);

-练习:查询年龄大于平均年龄的英雄信息
    select * from hero where age>(select avg(age) from hero);   

**能用where用where 不能才用having**
**having要和group by结合使用**    

.案例:拿最低工资的员工信息

    select * from emp
    where sal=(select min(sal) from emp);

.案例:工资多于平均工资的员工信息

    select * from emp
    where sal>(select avg(sal) from emp);

.案例:最后入职的员工信息

    select * from emp
    where hiredate=(select max(hiredate) from emp);
.案例:查询出哪些分类在商品表中出现过,并查询此分类的详情
-得到商品表里出现的分类id
    select distinct category_id from t_item
-从分类表里查询商品表出现的分类信息
    select * from t_item_category
    where id in (select distinct category_id from t_item);

.案例:查询工资高于20号部门最高工资的员工的所有信息

    select * from emp where sal>(select max(sal) from emp
    );
.案例:查询emp表中姓名是‘KING’所属的部门的编号,名称

    select * from dept
    where deptno=(select deptno from emp where ename='king');
.案例:查询部门名称是SALES的部门下所有员工的编号,姓名,职位,以及所属部门的编号

    select empno,ename,job,deptno
    from emp
    where deptno=(select deptno from dept where dname='sales');

.案例:查询部门地址是DALLAS的部门下所有员工的所有信息

    select * from emp
    where deptno=(select deptno from dept where loc='dallas');

.案例:查询跟JONES同样工作的员工的所有信息(包含JONES)
    select * from emp where job=(select job from emp where ename='jones') and ename!='jones';

关联查询数据

  • 查看每个员工的名字以及所在部门的名字

    select emp.ename,dept.dname
    from emp,dept
    where emp.deptno=dept.deptno;
  • 查看每个商品及所对应的分类名称

    select i.title,c.name
    from t_item i,t_item_category c
    where i.category_id=c.id;
  • 如果不写关联关系

笛卡尔积

通常情况下 笛卡尔积是无用的结果
是两张表相乘得到的结果
切记工作时不要出现这种情况
.查看在new york工作的员工

    select e.ename,d.loc
    from emp e,dept d
    where e.deptno=d.deptno
    and d.loc='new york';
.查看工资高于3000的员工,名字,工资,部门名,所在地

    select e.ename,e.sal,d.dname,d.loc
    from emp e,dept d
    where e.deptno=d.deptno
    ;

等值连接/内连接

-等值连接
select * from A,B 

-内连接
select * from
A [inner] join B
on A.x=B.x

.查看在new york工作的员工

    select e.ename,d.loc
    from emp e join dept d
    on e.deptno=d.deptno
    where d.loc='new york';

.查看工资高于3000的员工,名字,工资,部门名,所在地

    select e.ename,e.sal,d.dname,d.loc
    from emp e join dept d
    on e.deptno=d.deptno
    ;

.查询价格高于1000的dell商品,显示商品名字,库存,商品分类名,结果按库存降序排序
内连接只能查询出有关联关系的数据

select
from type t right join hero h
on t.id=h.typeid
左外连接
以join左边的表为基准 查询结果显示左边表的所有数据,没有关联关系的显示null

select e.ename,d.dname from
emp e left join dept d
on e.deptno=d.deptno
右外连接
以join右边的表为基准 查询结果显示右边表的所有数据,没有关联关系的显示null

select e.ename,d.dname from
emp e right join dept d
on e.deptno=d.deptno;

关联查询数据案例

代码实践

-- 查询出所有可以匹配的商品分类及商品数据
    select *
    from t_item i join t_item_category c
    on i.category_id=c.id;
-- 查询出所有的分类,以及与之匹配的商品
    select *
    from t_item i right join t_item_category c
    on i.category_id=c.id;
-- 查询出所有的商品,以及与之匹配的分类
    select *
    from t_item i left join t_item_category c
    on i.category_id=c.id;

强化练习

代码实践

-- 查询出所有有地址的用户
    select *
    from emp join dept
    on emp.deptno=dept.deptno
    where dept.loc is not null;
-- 查询出所有用户,同时查出这些用户的地址

    select *
    from emp left join dept
    on emp.deptno=dept.deptno;
-- 查询出所有的地址,同时查出地址所对应的用户信息
    select *
    from emp right join dept
    on emp.deptno=dept.deptno;

课程回顾: 1. group by 分组 having 聚合函数的条件 2. 子查询 在sql语句中嵌套dql 可以多层 3. 关联查询 等值连接 和 内连接 4. 左外和右外

练习

  1. 每个部门的人数,根据人数排序

  2. 每个部门中,每个主管的手下人数

  3. 每种工作的平均工资

  4. 每年的入职人数

  5. 少于等于3个人的部门

  6. 拿最低工资的员工信息

  7. 只有一个下属的主管信息

  8. 平均工资最高的部门编号

  9. 下属人数最多的人,查询其个人信息

  10. 拿最低工资的人的信息

  11. 最后入职的员工信息

  12. 工资多于平均工资的员工信息

  13. 查询员工信息,部门名称

  14. 员工信息,部门名称,所在城市

  15. DALLAS 市所有的员工信息

  16. 按城市分组,计算每个城市的员工数量

  17. 查询员工信息和他的主管姓名

  18. 员工信息,员工主管名字,部门名

  19. 员工信息,部门名,和部门经理

  20. 员工和他所在部门名

  21. 案例:查询emp表中所有员工的编号,姓名,职位,工资以及工资的等级,根据工资的等级进行升序排列

  22. 案例:查询emp表中所有员工的编号,姓名,职位,工资以及该员工上级领导的编号,姓名,职位,工资

  23. 案例:查询emp表中名字中没有字母'K'的所有员工的编号,姓名,职位以及所在部门的编号,名称,地址

  24. 案例:查询dept表中所有的部门的所有的信息,以及与之关联的emp表中员工的编号,姓名,职位,工资

  25. 案例:查询emp表中所有员工的编号,姓名,职位,工资以及工资的等级,该等级的最低工资,按照员工的编号进行升序排列。

MySql学习笔记04的更多相关文章

  1. MySQL学习笔记04 插入中文时出现ERROR 1366 (HY000)

    1 环境: MySQL Server 6.0  命令行工具 2 问题 :  插入中文字符数据出现如下错误: ERROR 1366 (HY000): Incorrect string value: '\ ...

  2. MySql学习笔记(一)之DQL常用查询

    MySql学习笔记(一)之DQL常用查询 前言:mysql是中小型的数据库软件,SQL语言分为DDL,DCL,DML,DQL四种,在这里重点讲解DQL的单表查询. 正文:在学习mysql单表查询之前, ...

  3. Mysql学习笔记(三)对表数据的增删改查。

    正文内容. 这一部分是最简单的,也是最麻烦的.简单是因为其实只包括增删该插四个部分.大体上看,增加数据.删除数据.修改数据.查询数据都不麻烦啊,我们日常都是常用的.这个谁不会呢?以前在培训机构学mys ...

  4. MySQL学习笔记一

    MySQL 学习笔记 一 一.数据库简单介绍 1. 按照数据库的发展时间顺序,主要出现了以下类型数据库系统: Ø 网状型数据库 Ø 层次型数据库 Ø 关系型数据库 Ø 面向对象数据库 上面4中数据库系 ...

  5. Mysql学习笔记(二)数据类型 补充

    原文:Mysql学习笔记(二)数据类型 补充 PS:简单的补充一下数据类型里的String类型以及列类型... 学习内容: 1.String类型 2.列类型存储需求 String类型: i.char与 ...

  6. Mysql学习笔记(一)数据类型

    原文:Mysql学习笔记(一)数据类型 学习内容: Mysql基本数据类型. 1.数字类型.. i.整型     Mysql数据类型             含义(有符号)     tinyint(m ...

  7. 初识mysql学习笔记

    使用VMVirtualBox导入Ubuntu后,可以通过sudo apt-get install mysql-server命令下载mysql. 在学习过程中,我遇到了连接不上Xshell的问题.最终在 ...

  8. MySQL学习笔记-锁相关话题

    在事务相关话题中,已经提到事务隔离性依靠锁机制实现的.在本篇中围绕着InnoDB与MyISAM锁机制的不同展开,进而描述锁的实现方式,多种锁的概念,以及死锁产生的原因.   Mysql常用存储引擎的锁 ...

  9. MySQL学习笔记-事务相关话题

    事务机制 事务(Transaction)是数据库区别于文件系统的重要特性之一.事务会把数据库从一种一致状态转换为另一个种一致状态.在数据库提交工作时,可以确保其要么所有修改都已经保存了,要么所有修改都 ...

随机推荐

  1. linux shell 脚本 历史文件清理脚本,按天,按月,清理前N天的历史文件,删除指定大小历史文件,历史文件归档清理

    不知道大家那有没有要清理的这个事情.需要清理目录历史文件.可能后续也会有很多其他地方需要清理历史文件,可能会用到. 我这两天空闲写了个脚本,清理比较方便,有要进行清理的大量历史文件的话可以用. 脚本用 ...

  2. 2009年3月新浪PHP面试题及答案(二)

    1.请写出PHP5权限控制修饰符. 答案:private protected public. 2.对于大流量的网站,您采用什么样的方法来解决访问量问题? 答案:首先,确认服务器硬件是否足够支持当前的流 ...

  3. Entity Framework小知识

    记录在使用EF中使用的技巧,以备查阅. 1.当需要查询一个列总和的时候,如果列是允许NULL或者未查到信息的时候,想要返回的是0 而非NULL时 db.表名.Sum(p=> (decimal?) ...

  4. Git远程推送文件太大的error解决

    error: RPC failed; curl 56 OpenSSL SSL_read: SSL_ERROR_SYSCALL, errfno 10054 方法1: 改成ssh推送 方法2: 把推送的缓 ...

  5. 移动开发,Webapp 淘宝手机 rem 布局

    (function (doc, win) { var docEl = doc.documentElement, resizeEvt ="orientationchange"in w ...

  6. 说说C#中的enum吧

    enum,就是枚举类型,它是struct,int,single,double一样,都属于值类型,从ValueType类型中派生,存储在栈中.它在被创建时,不需要分配内在空间,所以对程序的性能是有好处的 ...

  7. Lambda动态排序通用方法

    using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; us ...

  8. 关于IE的一些hack

    TIPS:对于完全放弃IE的幸福开发者,以下内容全是废话,建议跳转到 博客园 着页,寻找更优质的文章. 对于前端开发来说IE一直是心里的痛,不管你觉得做的多好的网页,放到它上面总会有一些意想不到的问题 ...

  9. Java调用webservice接口方法(SOAP message、xfire、axis)

    webservice的 发布一般都是使用WSDL(web service descriptive language)文件的样式来发布的,在WSDL文件里面,包含这个webservice暴露在外面可供使 ...

  10. JAVA 与 sqlite3 连接

    SQLite SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中.它是D.RichardHipp建立的公有领域项目.它的设计目标是嵌入式的,而且目前已经 ...