重拾MySQL
时间:2021-07-01 10:21:17
帮助过:12人阅读
--
注释信息(Navicat工具中)
# 这是一段注释文字
/* 这是另一段注释文字 */
数据类型:数字
类型 大小 说明
TINYINT 1字节 小整数
SMALLINT 2字节 普通整数
MEDIUMINT 3字节 普通整数
INT 4字节 较大整数
BIGINT 8字节 大整数
FLOAT 4字节 单精度浮点数
DOUBLE 8字节 双精度浮点数
DECIMAL ------- DECIMAL(
10,
2)
不精确的浮点数
十进制的浮点数无法在计算机中用二进制精确表达
数据类型:字符串
类型 大小 说明
CHAR 1-
255字符 固定长度字符串
VARCHAR 1-
65535字符 不固定长度字符串
TEXT 1-
65535字符 不确定长度字符串
MEDIUMTEXT 1-
1千6百万字符 不确定长度字符串
LONGTEXT 1-
42亿字符 不确定长度字符串
数据类型:日期类型
类型 大小 说明
DATE 3字节 日期
TIME 3字节 时间
YEAR 1字节 年份
DATETIME 8字节 日期时间
TIMESTAMP 4字节 时间戳
数据库的范式
第一范式:原子性
数据表的每一列都是不可分割的基本数据项,同一列中不能有多个值,也不能存在重复的属性。
第二范式:唯一性
数据表中的每条记录必须是唯一的。为了实现区分,通常要为表加上一个列用来存储唯一标识,这个唯一属性列被称作主键列
第三范式:关联性
每列都与主键有直接关系,不存在传递依赖;依照第三范式,数据可以拆分保存到不同的数据表,彼此保持关联
字段约束
MySQL中的字段约束共有四种:
约束名称 关键字 描述
主键约束 PRIMARY KEY 字段值唯一,且不能为NULL
非空约束 NOT NULL 字段值不能为NULL
唯一约束 UNIQUE 字段值唯一,且可以为NULL
外键约束 FOREIGN KEY 保持关联数据的逻辑性
MySQL索引待续···
数据表的索引:MySQL利用二叉树结构,对数据表的记录排序,从而加速
数据的检索速度(B+
树)
数据分页:使用LIMIT关键字
SELECT …… FROM …… LIMIT 起始位置 , 偏移量 ;
结果集排序:ORDER BY
SELECT …… FROM …… ORDER BY 列名 [ ASC |
DESC ] ;
去除重复记录:使用DISTINCT关键字
SELECT DISTINCT 字段 FROM …… ;
备注:使用DISTINCT的SELECT子句中只能查询一列数据,如果查询多列,去除重复记录就会失效
条件查询:四类运算符(数学运算符、比较运算符、逻辑运算符、按位运算符)
数学运算符:+ 加法、- 减法、* 乘法、/ 除法、%
求模
比较运算符:>、>=、<、<=、=、!=、IN(包含:deptno IN(
10,
30,
40))
逻辑运算符:AND、OR、NOT(非关系)、XOR(异或关系:age >
18 XOR sex =
"男")
按位运算符:& 位与关系、| 位或关系、~ 位取反、^ 位异或、<< 左移、>>
右移
条件执行的顺序是从左到右的。所以我们应该把索引条件,或者筛选掉记录最多的条件写在最左侧
聚合函数
1、SUM函数用于求和,只能用于数字类型,字符类型的统计结果为0,日期类型统计结果是毫秒数相加。SUM函数求和会排除NULL值
select sum(comm)
from emp;
2、MAX函数用于获得非空值的最大值
select max(empno)
from emp;
3、MIN函数用于获得非空值的最小值
select min(empno)
from emp;
4、AVG函数用于获得非空值的平均值,非数字数据统计结果为0
select avg(sal+IFNULL(comm,
0))
from emp;
5、COUNT(*
)用于获得包含空值的记录数,COUNT(列名)用于获得包含非空值的记录数。
select count(*)
from emp;
select count(comm)
from emp;
分组查询:Group By
GROUP BY子句的作用是通过一定的规则将一个数据集划分成若干个小的区域,然后针对每个小区域分别进行数据汇总处理
select deptno,avg(sal)
from emp group by deptno;
逐级分组:数据库支持多列分组条件,执行的时候逐级分组
select deptno,job,count(*),avg(sal)
from emp group by deptno,job order by deptno;
查询语句中如果含有GROUP BY子句,那么SELECT子句中的内容就必须要遵守规定:SELECT子句中可以包括聚合函数,或者GROUP BY子句的分组列,其余内容均不可以出现在SELECT子句中
with rollup:
group by 后可以跟with rollup,表示在进行分组统计的基础上再次进行汇总统计
GROUP_CONCAT函数:可以把分组查询中的某个字段拼接成一个字符串
select deptno,GROUP_CONCAT(name),count(*)
from emp
where sal>
2000 group by deptno
查询结果会将符合条件的name,拼接起来
执行顺序:
FROM -> WHERE -> GROUP BY -> SELECT -> ORDER BY->
LIMIT
HAVING子句:
缘由:WHERE子句先于GROUP BY执行,一旦WHERE子句中出现了汇总函数,数据库根本不知道按照什么范围计算汇总值,此时就可以将汇总函数放在having中
注:HAVING子句中能够使用三种要素:常数,聚合函数,GROUP BY子句中指定的列名(聚合建)
用having就一定要和group by连用, 用group by不一有having(它只是一个筛选条件用的)
相对于HAVING子句,更适合写再Where子句中的条件:
where子句 =
指定行所对应的条件
having子句 =
指定组所对应的条件
聚合建所对应的条件不应该书写在HAVING子句中,而应书写在WHERE子句当中。虽执行结果一样,但将条件写在where子句中比写在having子句中的处理速度更快,返回结果时间更短。
原因:聚合操作时,DBMS内部会进行排序处理,where在排序之前就对数据进行过滤,having是在排序之后在对数据进行分组。
表连接
表连接分为两种:内连接和外连接
内连接是结果集中只保留符合连接条件的记录
外连接是不管符不符合连接条件,记录都要保留在结果集中
内连接的多种语法形式
SELECT …… FROM 表1 JOIN 表2 ON 连接条件 ;
SELECT …… FROM 表1 JOIN 表2 WHERE 连接条件 ;
SELECT …… FROM 表1 , 表2 WHERE 连接条件 ;
外连接与内连接的区别在于,除了符合条件的记录之外,结果集中;分为左外连接和右外连接;左外连接就是保留左表所有的记录,与右表做连接。如果右表有符合条件的记录就与左表连接。
如果右表没有符合条件的记录,就用NULL与左表连接。右外连接也是如此。
UNION关键字可以将多个查询语句的结果集进行合并
注:内连接只保留符合条件的记录,所以查询条件写在ON子句和WHERE子句中的效果是相同的。但是外连接里,条件写在WHERE子句里,不合符条件的记录是会被过滤掉的,而不是保留下来。
子查询是一种查询中嵌套查询的语句
子查询可以写在三个地方:WHERE子句、FROM子句、SELECT子句,但是只有FROM子句子查询是最可取的
WHERE子查询:这种子查询最简单,最容易理解,但是却是效率很低的子查询(用表连接替代WHERE子查询)
FROM子查询:这种子查询只会执行一次,所以查询效率很高
SELECT子查询:这种子查询每输出一条记录的时候都要执行一次,查询效率很低
相关子查询:查询语句执行的时候要多次的依赖于子查询的结果,这类子查询被称作相关子查询
1、WHERE子查询和SELECT子查询都属于相关子查询
2、因为相关子查询要反复多次执行,所以应该避免使用
单行子查询和多行子查询
单行子查询的结果集只有一条记录,多行子查询结果集有多行记录
多行子查询只能出现在WHERE子句和FROM子句中
WHERE子句中的多行子查询
WHERE子句中,可以使用IN、ALL、ANY、EXISTS关键字来处理多行表达式结果集的条件判断
select name
from emp
where age>ALL(
select age
from emp
where name IN(
"LILEI",
"FORD"))
exists关键字
在sql语句中出现exists关键字的时候,它先会对外表进行循环查询并且查询都会查看exists条件语句是否符合条件。
当exists里的条件语句能够返回记录行时,条件就为真,就会返回当前数据。反之如果exists里的条件语句不能返回记录行,则当前循环到的这条数据就会被丢弃。
exists的条件就是一个过滤条件,当能返回结果集则为true,不能返回结果集则为false;
exists与in的区别:
1、in引导的子句只能返回一个字段,exists子句可以有多个字段;
2、通常情况下采用exists要比in效率高,因为in不走索引,但要但要具体情况具体分析:in适合于外表大而内表小的情况;exists适合于外表小而内表大的情况
重拾MySQL
标签:行合并 rgba float rgb 树结构 一个 外键约束 检索 相同