目录
文章目录
MySQL
把查询结果去除重复记录
- 关键字:distinct
- distinct只能出现在所有字段的最前方。
这样就是表示两个字段联合去重。
连接查询
什么是连接查询?
- 多张表联合起来查询数据
连接查询的分类
年代分类:
- SQL92
- SQL99
连接方式分类:
- 内连接
- 等值连接
- 非等值连接
- 自连接
- 外连接
- 左外连接(左连接)
- 右外连接(右连接)
- 全连接(用的少)
当两张表进行连接查询时没有条件限制?
- 查询结果条数为两张表的条数乘积。(笛卡尔积现象)
怎么避免笛卡尔积现象
- 连接时加条件。
- 匹配的过程中,匹配的次数没有减少。
内连接之等值连接
- 条件是等量关系,所以称为等值连接。
- 例:
select
e.ename,d.dname
from
emp e
join
dept d
on
e.deptno=d.deptno;
内连接之非等值连接
- 条件不是一个等量关系,称为非等值连接。
内连接之自连接
- 一张表连接自身。(一张表看成两张表)
外连接
- 例:
select
e . ename,d. dname
from
emp e right join dept d
on
e. deptno = d. deptno ;
right代表什么:表示将join关键字右边的这张表看成主表,主要是为了将这张表的数据全部查询出来,捎带着关联查询左边的表。
在外连接当中,两张表产生了主次关系。 - 带有right的是右外连接,又叫做右连接。
带有left的是左外连接,又叫做左连接。
任何一个右连接都有左连接的写法。任何一个左连接都有右连接的写法。
多表连接
子查询
什么是子查询?
- select语句中嵌套select语句,被嵌套的语句称为子查询。
子查询都可以出现在哪里?
- select
…(select)…
from
…(select)…
where
…(select)…
where子句中的子查询
- 找出比最低工资高的员工姓名和工资?
select ename,sal from emp where sal >(select min(sal)from emp);
from子句中的子查询
- 注意:From后面的子查询,可以将子查询的查询结果当做一张临时表。
- 找出每个岗位的平均工资的薪资等级
- select
t.*, s. grade
from
(select job, avg(sal) as avgsal from emp group by job) t
join
salgrade s
on
t.avgsal between s .losal and s.hisal ;
在select后面出现的子查询
union合并查询结果集
- 查询工作岗位是MANAGER和SALESMAN的员工
select ename,job from emp where job = ‘MANAGER’
union
select ename,job from emp where job = ’ SALESMAN’ ; - union的效率要高一些。对于表连接来说,每连接一次新表,则匹配的次数满足笛卡尔积,成倍的翻。。。
但是union可以减少匹配的次数。在减少匹配次数的情况下,还可以完成两个结果集的拼接。 - **注意事项:**union在进行结果集合并的时候,要求两个结果集的列数相同。
limit
limit作用
- limit是将查询结果集的一部分取出来,通常使用在分页查询当中。
limit怎么使用
- 完整用法:limit startIndex,length
startIndex是起始下标,length是长度 。
起始下标从0开始。
缺省用法:limit 5;这是取前5。 - **注意:**mysql 当中limit在order by之后执行!
分页
- 每页显示pagesize条记录
第pageNo页:limit(pageNo - 1)* pagesize,pageSize
表的创建(建表)
建表的语法格式
- create table 表名(字段名1 数据类型,字段名2 数据类型,字段名3 数据类型);
表名:建议以t _ 或者tbl _ 开始,可读性强。
关于MySQL中常见的数据类型?
- varchar
会根据实际的数据长度动态分配空间。 - char
分配固定长度的空间去存储数据。
使用不恰当的时候,可能会导致空间的浪费。 - int
数字中的整数型。 - bigint
数字中的长整型。 - float
单精度浮点型数据。 - double
双精度浮点型数据。 - data
短日期类型。 - datatime
长日期类型。 - clob
- 字符大对象。
最多可以存储4G的字符串。
比如:存储一篇文章,存储一个简介。 - blob
二进制大对象。
专门用来存储图片、声音、视频等流媒体数据。
往blob类型字段上插入数据时,需要使用IO流。
删除表
- drop table;
drop table if exists 表名;
插入数据(insert)
- 语法格式:
insert into 表名(字段名1,字段名2,字段名3…) values(值1,值2,值3…); - **注意:**字段名和值要一一对应。什么是一一对应? 数量要对应。数据类型要对应。
前面的字段名省略,等同于都写上了
insert插入日期
- str_to_date:将字符串varchar类型转换成date类型。
- data_format:将date类型转换成具有一定格式的varchar字符串类型。
date和datetime两个类型的区别?
- date是短日期:只包括年月日信息。
- datetime是长日期:包括年月日时分秒信息。
- 在mysql当中怎么获取系统当前时间?
now()函数。(datetime类型)
修改update
- 语法格式:
update 表名 set 字段名1=值1,字段名2=值2,字段名3=值3…where 条件; - 更新所有:
不加条件。
删除数据delete
- 语法格式?
delete from 表名 where 条件; - **注意:**没有条件会删除整张表的数据。