Mysql——子查询、分页查询、表的增删改

  • 子查询
  • where语句中使用子查询
  • from后嵌套子查询
  • select后嵌套子查询
  • Union
  • limit 分页查询
  • 创建表
  • insert 增加数据
  • update 更新数据
  • delete 删除数据


子查询

子查询就是嵌套的select语句,可以理解为子查询是一张表。
select语句当中嵌套select语句,被嵌套的select语句是子查询。

select
  …(select).
from
  …(select).
where
  …(select).

where语句中使用子查询

案例:找出高于平均薪资的员工信息

#第一步:找出平均薪资
mysql> select avg(sal) from emp;
#第二步:使用where嵌套查询
mysql> select * from emp where sal > (select avg(sal) from emp);

from后嵌套子查询

案例:找出每个部门平均薪水的等级。

#第一步:找出每个部门平均薪水(按照部门编号分组,求sal的平均值)
mysql> select deptno,avg(sal) as avgsal from emp group by deptno;

#第二步:将以上的查询结果当做临时表t,让t表和salgrade s表连接(上一步的语句作为一张表)
mysql> select
    -> t.*,s.grade
    -> from
    -> (select deptno,avg(sal) as avgsal from emp group by deptno) t
    -> join
    -> salgrade s
    -> on
    -> t.avgsal between s.losal and hisal;

案例:找出每个部门平均的薪水等级。

#第一步:找出每个员工的薪水等级。
mysql> select e.ename,e.sal,e.deptno,s.grade from emp e join salgrade s on e.sal between s.losal and s.hisal;
#第二步:基于以上结果,继续按照deptno分组,求grade平均值。
mysql> select
    -> e.deptno,avg(s.grade)
    -> from
    -> emp e
    -> join
    -> salgrade s
    -> on
    -> e.sal between s.losal and s.hisal
    -> group by
    -> e.deptno;

select后嵌套子查询

案例:找出每个员工所在的部门名称,要求显示员工名和部门名。

#不常用
mysql> select 
    -> e.ename,(select d.dname from dept d where e.deptno = d.deptno) as dname 
    -> from 
    -> emp e;

Union

使用union可以将查询的结果集相加。

案例:找出工作岗位是SALESMAN和MANAGER的员工。

mysql> select ename,job from emp where job = 'MANAGER'
    -> union
    -> select ename,job from emp where job = 'SALESMAN';

案例:两张不相干的表中的数据拼接在一起显示。

mysql> select ename from emp
    -> union
    -> select dname from dept;

limit 分页查询

limit取结果集中的部分数据。

limit是mysql特有的,其他数据库中没有,不通用。(Oracle中有一个相同的机制,叫做rownum)

语法机制:

limit startIndex, length
=startIndex表示起始位置,从0开始,0表示第一条数据。
length表示取几个。

案例:取出工资前5名的员工(思路:降序取前5个)

mysql> select ename,sal from emp order by sal desc limit 0,5;
#startindex省略的时候默认是0
mysql> select ename,sal from emp order by sal desc limit 5;

limit是sql语句最后执行的一个环节。

案例:找出工资排名在第4到第9名的员工。

mysql> select ename,sal from emp order by sal desc limit 3,6;

【通用的标准分页sql】
每页显示pageSize条记录:
第pageNo页:(pageNo - 1) * pageSize, pageSize

pageSize:是每页显示多少条记录
pageNo:显示第几页

创建表

1.建表语句的语法格式:

create table 表名(
  字段名1 数据类型,
  字段名2 数据类型,
  字段名3 数据类型,
  …
);

2.MySQL当中字段的常见数据类型:
int   整数型
bigint   长整型
float   浮点型
char   定长字符串
varchar   可变长字符串
date   日期类型
BLOB   二进制大对象(存储图片、视频等流媒体信息) Binary Large OBject (
CLOB   字符大对象(存储较大文本,比如,可以存储4G的字符串。) Character Large OBject

3.char和varchar的选择
在实际的开发中,当某个字段中的数据长度不发生改变的时候,是定长的,例如:性别、生日等都是采用char。

当一个字段的数据长度不确定,例如:简介、姓名等都是采用varchar。

4.BLOB和CLOB类型的使用
图片和视频不常存放在数据表当中,占用内存太大。

5.表名在数据库当中一般建议以:t_或者tbl_开始。

6.创建学生表
学生信息包括:
学号、姓名、性别、班级编号、生日
学号:bigint
姓名:varchar
性别:char
班级编号:int
生日:char

mysql> create table t_student(
    -> no bigint,
    -> name varchar(255),
    -> sex char(1),
    -> classno varchar(255),
    -> birth char(10)
    -> );

insert 增加数据

1.insert 插入数据
(1)语法格式:

insert into 表名(字段名1,字段名2,字段名3,…) values(值1,值2,值3,…)
要求:字段的数量和值的数量相同,并且数据类型要对应相同。

mysql> insert into t_student(no,name,sex,classno,birth) values(1,'zhangsan','1','1ban','1950-10-12');

#可以变换位置,但是要对应上
mysql> insert into t_student(name,sex,classno,birth,no) values('lisi','1','1ban','1950-10-12',2);

#也可以插入某一个字段,其他字段默认为NULL
#除name字段之外,剩下的所有字段自动插入NULL。
mysql> insert into t_student(name) values ('wangwu');

当一条insert语句执行成功之后,表格当中必然会多一行记录。即使多的这一行记录当中某些字段是NULL,后期也没有办法在执行insert语句插入数据了,只能使用update进行更新。

(2)改变字段的默认值

#删除某张表
mysql> drop tabel if exists t_student; //当这个表存在的话删除。

#创建表,制定name的默认值为1
mysql> create table t_student(
    -> no bigint,
    -> name varchar(255),
    -> sex char(1) default 1,
    -> classno varchar(255),
    -> birth char(10)
    -> );

#这是插入的数据中,sex的值为1
mysql> insert into t_student(name) values('zhangsan');

(3)简略写法/一次插入多行数据
字段可以省略不写,但是后面的value对数量和顺序都有要求。

mysql> insert into t_student values(1,'rose','0','class1','2010-03-20')
#每个字段都必须指定值

#一次插入多行数据
mysql> insert into t_student
    -> (no,name,sex,classno,birth)
    -> values
    ->  (3,'Alice','1','class2','1998-01-02'),(3,'Jack','1','class2','1998-08-02');

(4)表的复制
语法:

create table 表名 as select语句;
将查询结果当做表创建出来。

#对表emp1的复制
mysql> create table emp1 as select * from emp;

(5)将查询结果插入到一张表中
这张方式对于表的结构有要求,得对应上。

mysql> create table dept1 as select * from dept;
mysql> insert into dept1 select * from dept;
#将表dept的查询结果放到dept1里

update 更新数据

语法格式:

update 表名 set 字段名1=值1,字段名2=值2… where 条件;
PS:没有条件整张表数据全部更新,注意中间字段逗号连接。

案例:将部门10的LOC修改为SHANGHAI,将部门名称修改为RENSHIBU。

mysql> update dept1 set loc = 'SHANGHAI',dname='RENSHIBU' where deptno = 10;

#不加条件更新所有记录
mysql> update dept1 set loc='x',dname='y';

delete 删除数据

语法格式:

delete from 表名 where 条件;
PS:不加条件全部删除。

#删除10部门数据
mysql> delete from dept1 where deptno = 10;
#删除所有记录
mysql> delete from emp1;

truncate table 表名:表被截断,不可回滚。永久丢失。用于删除大表的数据,速度快。

删表:
drop table 表名; //通用写法
frop table if exists 表名; //oracle不支持这种写法

mysql> truncate table dept1;

对于表结构的修改使用工具完成即可,因为在实际开发中表一旦设计好之后,对表结构的修改是很少的,修改表结构就是对之前的设计进行了否定,即使需要修改表结构,我们也可以直接使用工具操作。

增删改查有一个术语:CRUD操作
Create(增) Retrieve(检索) Update(修改) Delete(删除)