-
sql结构化查询语言
DQL数据查询语言
DML数据操作语言
DDL数据定义语言 创建对象 表视图 索引
DCL数据控制语言 权限
-
概念
关系:可以理解是一张二维表,关系型数据库就是二维表数据库 关系名是表名
元组:二维表的一行,或是记录
属性:一列 ,字段
域:取值范围
-
DQL
格式:select 列名 from 表名 where 条件1 and/or 条件2 groud by 列 having 分组条件 order by 排序
注释格式 –
条件用字符串来代表用双引号""括起来
模糊查询 like %代表是任意多个字符 _代表是一个字符
多条件联合查询 and or
范围查询 在一个连续值的范围之内 between 1 and 10
对查询结果进行排序 order by asc是升序默认 desc是降序 也可以进行多个列排序
分页:limit
select * from table limit 4 每次查询前4行
select * from table limit 0,4 分别查询第几页 默认是从零开始的,每页显示几条数据
举例:select * from table where sal>1000 order by sal desc limit 0,4
-
函数 是数据库里的方法,直接调用
单行函数:指的是操作一行数据返回一行数据,
字符串函数:
长度 select name,length(name)from emp;
拼接 select concat(name,"=",sex) from emp;
替换 select name,replace(sex,“1”,“男”)from emp;
dual假表 是为了满足from后面的条件不然报错,
其他函数:
空值的处理 ifnull(a,b) a=null 显示b
加密算法md5 不可逆加密 select MD5(123) from dual;
多行函数 :处理多行数据只返回一个结果,把数据分成多个组,返回的数据条数和组数一样
max最大值 min最小值 avg平均值 sum求和 count求总数
注意不要把普通的列和组函数写在一起,语法不会错但是结果是错的,
就是说这个很坑,数据库不报错,因为是先执行了组函数, 求出了一个值,在显示一条数据只能是名字的第一条数据了
-
数据分组
按照一个条件进行分组,每一个组返回对应结果,
group by可以对指定列进行分组,
having是可以对分组进行过滤
where是行级过滤,处理表中的行数据,having是分组过滤,处理的是查询出来分组后的数据,
能使用where就不要使用having ,
注意分组的列和普通的列不能放在一起,会发生错乱
select job,avg(sal) from emp group by job; 这是按照jop来分组,显示分组,显示分组sal的最大值,是可以的
select job,avg(sal),name from emp group by job 这样是不会报错但是name是错误的,要注意分组列和普通列不能在一起 ,不能和组函数在一起,
-
单表查询执行顺序
from-where-group by-having-select-order by
-
多表关联 99关联
自然连接:会自动进行关联列相同的数据 也就等值连接
select e.name,d.name from emp e,dept d where e.deptno=d.deptno and e.sal >2000; 这个是92语法 不用自动关联表,关联条件写在where后面
select e.name,d.name from emp e natural join dept d where e.sal>2000; 99关联 用natura join来关联表
还有一种是使用using关键字来进行指定条件的等值连接
select e.name,d.name from emp e join dept d using(deptno) ; 这个就是可以使用指定等值列
on 关键字可以可以进行等值连接和非等值连接 添加条件在on后面
select e.name,d.name from emp e join dept d on(e.deptno=d.deptno);
select e.name,d.name from emp e join dept d on(e.sal between s.losal and s.hisal);
三表关联 :
select e.name,d.name,s.grade from emp e,dept d,salgrads s where e.deptno = d.deptno and e.name = s.name 92语法
select e.name,d.name,s.name from emp e join dept d join salgrade on(e.sal=s.sal and s.sal =d.sal);
外连接: 多表连接时查询出的数据会忽视null数据 使用外连接可以得道被忽视的孤儿数据, 包含null数据
left join right join 全外连接 使用union关键字 或是union all
union 作用是将两个sql语句查询出来的数据合并在一起, 注意这查询出来的字段要一样
union会去重复数据 union包含重复数据,
多表连接时要注意 给表起别名,别名是表首字母,关联条件要有,没有会出现笛卡尔乘积,多表查询的条件是等值或是不等值,
语法包含了99语法和92语法,
99语法就是表关联是关联语句 关联条件 和条件语句都是分开的,
92语法不用表关联,条件可以放到where后面
等值连接用using关键字 非等值连接用on
select from table1 join table2 using(等值列)
select from table1 join table2 on (条件)
-
其他连接
自连接 自己连自己 像是有病
select e.name,m,name from emp e,emp m where e.mgr = m.empno;
子连接 就是将一条sql语句查询结果作为数据源成为另一条sql的查询条件
select name,sal from emp where sal=(select min(sal) from mp)
可以用于from或是where后面
-
还有数据库必学技能,
导出表成文档
导出成sql文件
-
mysql中的执行计划
可以根据执行计划看到优化器的过程,
可以通过explain关键字来模拟优化器执行sql语句,
了解一下数据库查询过程 查询请求-sql解析-处理-生成执行计划 -数据库使用引擎来执行执行计划-返回结果
启动执行计划 如图
-
Explain 中的列详解
id :是查询执行顺序 id值越高优先执行,id值相同表示从上到下执行,是同一组,
select_type:查询类型是什么样的,
simple 表示查询中不包含子查询或是union
primary 有子查询是在外层
derived 是子查询 在from后面
subquery 在select 或是 where后面包含了子查询
table:显示是哪个表
partitions:显示是哪个分区
type:这个是重要的列,显示了连接使用了什么类型,最好到最差的连接类型是system ,const,eq_reg,ref,range,index和all
就是说了查询效率,
system查询出一条数据,all表中只有一个条数据
const 表示速度快,返回只有一条数据,
possibe_keys: 查询条件字段涉及到的索引,
key : 实际上使用到的索引,没有使用则为null,
key_len:表示索引中使用的字节数,
rows : 估算出所需要读取的行数,
fitered:显示通过条件过滤出的行数的百分值,
-
存储引擎
数据库依赖数据引擎进行创建,查询,更新和删除数据,不同的引擎提供不同的存储机制,索引技巧,mysql使用innoDB引擎,
innoDB引擎底层是B+树,支持事务处理,
-
数据库的三大范式
范式就是对表结构就行规范,表结构要满足数据不要冗余,
第一个范式 :每一列保证数据的原子性, 都是不能在分开的最小单元,
第二个范式:一个表描述一个事情,
第三范式:表中的普通列不要相互依赖,