MySQL学习(第1天课程)
语法格式(执行顺序):limit是sql语句最后执行的一个环节:
select 5
…
from 1
…
where 2
…
group by 3
…
having 4
…
order by 6
…
limit 7
…;
分组查询、连接查询、子查询
注:查询结果的去重:
内连接:等值连接、非等值连接、自连接
语法:(where、inner可以省略)
…
A
inner join
B
on
连接条件
where
…
迪尔卡积现象:select ename,dname from emp,dept;
(1)等值连接:条件是等量关系
案例:查询每个员工的部门名称,要求显示员工名和部门名。
select e.ename,d.dname from emp e
join dept d
on e.deptno = d.deptno;
(2)非等值连接:连接条件中的关系是非等量关系
案例:找出每个员工的工资等级,要求显示员工名、工资、工资等级。
select
e.ename,e.sal,s.grade
from
emp e
inner join
salgrade s
on
e.sal between s.losal and s.hisal;
(3)自连接:一张表看做两张表。自己连接自己
案例:找出每个员工的上级领导,要求显示员工名和对应的领导名。
select
a.ename as ‘员工名’,b.ename as ‘领导名’
from
emp a
join
emp b
on
a.mgr = b.empno;
外连接:主表的数据无条件的全部查询出来
左外连接(左连接left):表示左边的这张表是主表。
右外连接(右连接right):表示右边的这张表是主表。
案例:找出每个员工的上级领导?(所有员工必须全部查询出来。)
主表位置,左右连接输出结果一样,顺序更换一下
左
select
a.ename ‘员工’, b.ename ‘领导’
from
emp a //a是主表
left outer join //out可以省略
emp b
on
a.mgr = b.empno;
右
select
a.ename ‘员工’, b.ename ‘领导’
from
emp b
right join
emp a //a是主表
on
a.mgr = b.empno;
案例:找出哪个部门没有员工(加了where)
select
d.
from
emp e
right join
dept d
on
e.deptno = d.deptno
where
e.empno is null;
(多张表连接查询)案例:找出每一个员工的部门名称、工资等级、以及上级领导。
e先和d连接,之后e继续和s连接,最后e作主表,e1作副表。
select
e.ename ‘员工’,d.dname,s.grade,e1.ename ‘领导’
from
emp e
join
dept d
on
e.deptno = d.deptno
join
salgrade s
on
e.sal between s.losal and s.hisal
left join
emp e1
on
e.mgr = e1.empno;
select
…(select).
from
…(select).
where
…(select).
(1)where子句中使用子查询
案例:找出高于平均薪资的员工信息。
select * from emp where sal > (select avg(sal) from emp);
(2)from后面嵌套子查询
案例:找出每个部门平均薪水的等级。
select
t.*,s.grade
from //from后面的表命名为t
(select deptno,avg(sal) as avgsal from emp group by deptno) t
join
salgrade s
on
t.avgsal between s.losal and s.hisal;
案例:找出每个部门平均的薪水等级。
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;
(3)在select后面嵌套子查询。
案例:找出每个员工所在的部门名称,要求显示员工名和部门名。
elect
e.ename,d.dname
from
emp e
join
dept d
on
e.deptno = d.deptno;
第二种方法:
select
e.ename,(select d.dname from dept d where e.deptno = d.deptno) as dname
from
emp e;
(1)union:可以将查询结果集相加,行列数要求相同
案例:找出工作岗位是SALESMAN和MANAGER的员工。
第一种:select ename,job from emp where job = ‘MANAGER’ or job = ‘SALESMAN’;
第二种:
select ename,job from emp where job = ‘MANAGER’
union
select ename,job from emp where job = ‘SALESMAN’;
(2)limit:取结果集中的部分数据
limit startIndex, length
startIndex表示起始位置,从0开始,0表示第一条数据。
length表示取几个
案例:取出工资前5名的员工(思路:降序取前5个)
select ename,sal from emp order by sal desc limit 0, 5;//0能默认不写
总结:
每页显示pageSize条记录:
第pageNo页:(pageNo - 1) * pageSize, pageSize
java代码{
int pageNo = 2; // 页码是2
int pageSize = 10; // 每页显示10条
limit (pageNo - 1) * pageSize, pageSize
}
(DML表数据方面:insert、delete、update、select 增删改查)
(DDL表结构方面:create ,drop,alter)
建表语句的语法格式:
create table 表名(
字段名1 数据类型,
字段名2 数据类型,
字段名3 数据类型,
…
);
MySQL当中字段的数据类型?以下只说常见的
int 整数型(java中的int)
bigint 长整型(java中的long)
float 浮点型(java中的float double)
char 定长字符串(String)
varchar 可变长字符串(StringBuffer/StringBuilder)
date 日期类型 (对应Java中的java.sql.Date类型)
BLOB 二进制大对象(存储图片、视频等流媒体信息) Binary Large OBject (对应java中的Object)
CLOB 字符大对象(存储较大文本,比如,可以存储4G的字符串。) Character Large OBject(对应java中的Object)
…
案例:创建学生表
create table t_student(
no bigint,
name varchar(255),
sex char(1),
classno varchar(255),
birth char(10)
);
表的复制
语法:
create table 表名 as select语句;
将查询结果当做表创建出来。
mysql> create table emp1 as select * from emp; // 把emp复制给emp1;
语法格式:
insert into 表名(字段名1,字段名2,字段名3,…) values(值1,值2,值3,…)
要求:
字段的数量和值的数量相同,并且数据类型要对应相同;
字段可以省略不写,但后面的value对数量和顺序都有要求;
字段和数值可以写几对,不需要写全,没写的对默认为null.
将查询结果插入到一张表中
mysql> insert into dept1 select * from dept;
语法格式:
delete from 表名 where 条件;
注意:没有条件全部删除。
语法格式:
update 表名 set 字段名1=值1,字段名2=值2… where 条件;
注意:没有条件整张表数据全部更新。
案例:将部门10的LOC修改为SHANGHAI,将部门名称修改为RENSHIBU
update dept1 set loc = ‘SHANGHAI’, dname = ‘RENSHIBU’ where deptno = 10;
update dept1 set loc = ‘x’, dname = ‘y’; //更新所有记录