Mysql常用部分
MYSQL
1.表table
表是一种结构化的文件,表中有,字段,行,主键
每一个字段都有: 1. 字段名称, 2. 字段数据类型, 3. 字段约束(空/非空), 4. 字段长度 命令: desc +tablename; 查看表结构 show create table +tablename; 查看建表语句
SQL的分类五
数据查询语言(DQL-data query language)——操作数据;select
数据操纵语言(DML-data manipulation language)——操作数据insert,delete,update;
数据定义语言(DDL-data definition language)——增删改表结构create,drop,alter;
事物控制语言(TCL-transactional control language)——操作事物commit,rollback
数据控制语言(DCL-data control language)——控制权限;grant,revoke
条件查询六
between and用在数字是闭区间,前面是小值后面是大值;应用在字符区间则是前闭后开;
null表示什么都没有,不是值,只能用is/is not查询;
and 优先级比or高,其实无所谓,想让谁优先级高就在哪个条件加括号;
包含查询,in相当于多个or,注意not in中的数据不能有null,这么用 not in(...is not null)就可以
in(not in)
select ename from emp where job in(not in) ('manager','SAlesman');
job是manager和job是salesman
等价于
select ename from emp where job = 'manager' or job='salesman';
模糊查询:%任意字符,_任意一个字符
select distinct... :distinct:去重只能出现在所有字段的最前,只是将结果集去除重复记录
case...when...then...when...then...else...end
类似于java中的switch...case...
4.排序三
排序采用order by子句,order by后面跟上排序字段,排序字段可以放多个,多个采用逗号间隔,order by默认采用升序;降序加desc,升序用asc;
如果存在where子句那么order by必须放到where语句的后面;
order by后可以加数字表示根据第几个字段排序,但是健壮性不强;
5.数据处理函数/单行处理函数九
lower(字段)/upper():转大/小写
substr(字段,起始位置,截取长度)
length(..):取长度
trim(..):去空格
round(数字/数字字段[,四舍五入到小数点n位]):四舍五入
rand():随机数
ifnull(字段,目标):如果空,那么...
str_to_date (字符串,匹配格式):可以将字符串转换成date日期格式
date_formate select date_format(now(),'%Y-%m-%d %H %i %s'); 2018-10-01 17:39:27
6.分组函数/聚合函数/多行处理函数五
count()
count(字段),不为空的记录总数
count(*),满足条件的记录总数
sum()
avg()
max()
min()
注意:
多行处理函数自动忽略空值
2.分组函数不能直接使用在where子句中 :分组函数必须在分组完成之后进行,因为分组需要用到group by,而此时group by还没被执行
mysql> select ename,sal from emp where sal > avg(sal);
ERROR 1111 (HY000): Invalid use of group function
7.分组查询
分组查询涉及到的两个字句是:
group by
having
group by 若sql中含有group by子句,那么select 后面只能跟参与分组的字段和分组函数 1.查询每个部门的平均薪水 select deptno,avg(sal) avgsal from emp group by deptno ;
2.计算不同部门中中不同工作岗位的最高薪水 select deptno,job,max(sal) maxsal from emp group by deptno,job; 就是deptno和job两个字段联合起来分组
3.找出每个工作岗位的最高薪水,除了Manager之外 select job,max(sal) from emp where job != 'MANAGER' group by job; 4.找出每个工作岗位的平均薪水,要求显示平均薪水大于1500 select job,avg(sal) from emp group by job having avg(sal)>1500;
having
having和where功能都是为了完成数据的过滤;where和having 后面都要添加条件;
但是能在where中过滤的一定要过滤,无法过滤的数据,通常都是需要先分好组的,group by分好组了,又要在having中过滤肯定是不行的;
DQL的执行顺序 select ... from ... where ... group by ... having ... order by ... 执行顺序: 1. from 从某张表中检索数据 2. where 经过某条件进行过滤 3. group by 然后分组 4. having 分组之后不满意再分组 5. select 查询出来 6. order by 排序输出
连接查询
什么是连接查询?
查询的时候只从一张表中检索数据,即单表查询
在实际的开发中,数据并不是存储在一张表中的,是同时存储在多张表中,这些表和表之间存在关系,我们在检索的时候通常是需要将多张表联合起来取得有效数据,这种多表查询被称为连接查询或者叫跨表查询。
连接查询根据出现年代分类:
SQL92
SQL99
连接查询根据连接方式可以分为:
内链接:返回链接所满足的链接条件记录
等值连接:是非常常用的一种连接,前提必须是表之间有关联列
SQL92语法,再想过滤的话用and加条件
SQL99语法把表连接操作用(inner )join...on...分离出来,再想过滤数据的话用where,结构清晰
非等值连接:..
自连接:同一张表,不常用
外连接:不仅返回满足链接条件的记录,还将返回不满足链接条件的记录
左外连接(左链接):将左表全显示出来
右外连接(右链接):..
当多张表进行连接查询,若没有任何条件进行限制,会产生笛卡儿积
案例
1.找出每一个员工对应的工资等级,要求显示员工名,工资,工资等级
2.找出每一个员工的上级领导名称,要求显示员工名以及对应的领导名
3.找出每一个员工对应的部门名称,要求部门名称全部显示
4.找出每一个员工对应的领导名,要求显示所有的员工
5.找出每一个员工对应的部门名称,以及该员工对应的工资等级
9.子查询
什么是子查询?
select嵌套select
子查询可以出现在哪儿?
select..(select)
from..(select)
where..(select)
案例
1.找出薪水比公司平均薪水高的员工,要求显示员工名和薪水(在where后使用子查询)
2.找出每个部门的平均薪水,并且找出相应的薪水等级(在from后使用子查询)
3.找出员工对应的部门名称(在select后使用子查询)
其它操作
1.union,合并结果集
注意,mysql中只要求结果集的个数相同,Oracle中不仅有以上要求对数据格式也要求相同;
2.limit
limit用来获取一张表中的某部分数据
只在M'ySQL中存在,不通用
大数据下如何做分页:
MySQL并不是跳过offset行,而是取offset+N行,然后放弃前offset行,返回N行,所以当offset大的时候,效率自然低下;这样要么控制返回的总页数,要么对超过特定阈值的页数进行SQL改写:
10.DDL、DML、常用数据类型
格式 1. DDL create table tableName( columnName dataType(length), ……………….. columnName dataType(length) ); set character_set_results='utf8';#创建表
2.DML insert into tableName[(column[,column...])] values(value[,value...)]);#增,字段可以省略
常用数据类型
Char(长度) 定长字符串,存储空间大小固定,适合作为主键或外键
Varchar(长度) 变长字符串,存储空间等于实际数据空间
double(有效数字位数,小数位) 数值型 DOUBLE(7,2),7个有效数字2个小数位
Float(有效数字位数,小数位) 数值型
Int( 长度) 整型 int(3)表示最大为999
bigint(长度) 长整型
Date 日期型
BLOB Binary Large OBject(二进制大对象) 图片等,视频太大不建议
CLOB Character Large OBject(字符大对象) 4G+的大文本
Last updated