一:sql分类及语法
1.sql分类:
(1)DDL:数据库定义语言,用于定义表,列,索引等数据库对象. create,drop,alter等
(2)DML:数据库操纵语言,增删改查数据库的记录insert,delete,update,select等
(3)DCL:数据库控制语言,定义了数据库的表,字段,用户的访问权限和安全级别 grant,revoke等
2.DDL语句
(1)创建数据库:create database test1;
(2)删除数据库:drop database test1;
(3)创建表:create table user(name varchar(10),age int(2));
(4)删除表:drop table user;
(5)修改表:
alter table user modify name varchar(20);
alter table user add column sex varchar(10);
alter table user drop column age;
Alter table user change age age1 int(4);
Alter table user rename user1;
3.DML语句
(1)插入记录insert into user(name,age)values(‘zhangsan’,18);
(2)删除记录:delete from user where name=’张三’
(3)更新记录:update user set age=1 where name=’ 张三’
(4)查询记录:select * from user;
(5)查询不重复的记录j:select distinct name from user;
(6)排序查询:select from user order by age desc;
(7)限制排序:select * from user order by age limit 1,30;
(8)聚合:select name,age from user group by age;
(9)聚合后条件:select name,age from user group by age having age > 18;
(having和where的区别:having是聚合后条件,where是聚合前条件)
(10)表连接:
①内连接:
Select ename,deptname from emp,dept where emp.deptno=dept.deptno;
②外连接:
左连接:(查询 emp 中所有用户名和所在部门名称:)
select ename,deptname from emp left join dept on emp.deptno=dept.deptno;
右连接:
select ename,deptname from emp left join dept on emp.deptno=dept.deptno;
· 左连接:包含所有的左边表中的记录甚至是右边表中没有和它匹配的记录
· 右连接:包含所有的右边表中的记录甚至是左边表中没有和它匹配的记录
(11)子查询:需要的条件是另一个select的结果
(子查询的关键字主要包括in, not in,=,!=,exists,not exists )
(如果查询结果数唯一,可用=代替in)
select * from emp where deptno in(select deptno from dept);
select * from emp where deptno = (select deptno from dept limit 1);
(12)记录联合:
select * from t1 union select * from t2
select * from t1 union all select * from t2
(union和union all的区别:union是将union all查询出来的结果进行了一次distinct,去除重复后的结果)
4.DCL语句
(1)授权:创建一个数据库用户 z1,具有对 sakila 数据库中所有表的 SELECT/INSERT 权限:
grant select,insert on sakila.* to 'z1'@'localhost' identified by '123';
(2)收回权限:由于权限变更,需要将 z1 的权限变更,收回 INSERT,只能对数据进行 SELECT 操作:
revoke insert on sakila.* from 'z1'@'localhost';
二:mysql支持的数据类型
数字类型,字符串类型,日期和时间类型
1.数值类型
2.字符串类型
3.日期类型
三.mysdql中的运算符
(1)算数运算符
(2)比较运算符
(3)逻辑运算符
(4)位运算符
四.mysql中常用的函数
1.字符串函数
2.数值函数
3.日期时间函数
4.其它常用函数
五.存储引擎
1.查询当前数据库支持的存储引擎
Show engines \G
2.Mysql常见存储引擎对比
(1)Myisam
Mysam是mysql的默认存储引擎
Myisam不支持事务和外键
优势是访问速度快
(2)Innodb
Innodb提供事务和外键
占用磁盘空间保留索引,写的效率比innodb差
(3)Memory
数据存放在内存中
访问速度非常快(使用hash索引)
但服务一旦关闭,表中的数据丢失
六.选择合适的数据类型
1.char与varchar?
Char属于固定长度的字符类型,varchar属于可变长度的字符类型
所以char处理速度比varchar快得多,但是浪费存储空间
(但随着mysql版本的升级varchar的性能也在不断的提升,所以目前varchar被更多的使用)
2.text与blob?
(1)两者都能保存大文本数据
Blob能用来保存二进制数据,比如照片
Text只能保存文本数据,如文章
(2)text和bolo 字段在进行删除操作时会出现“空洞”现象(表数据文件的大小并没有因为删除数据而减小),可以使用OPTIMIZE TABLE t; 进行优化操作
(3)采用的优化操作一般是把blob或text列放到一个单独的表中
3.浮点数与定点数?
(1)定点数:小数点固定在某个位置上的数据。 就好像 0.0000001 ,0.0001111;
(2)浮点数:小数点位置可以浮动的数据。就像数学中的 1222.210^3也可以表示为1.222210^6;
(3)在java中,我们知道System.out.print("7.22-7.0=" + (7.22f-7.0f));的结果并不是0.22而是0.219999,因此在程序中尽量避免浮点数的比较,运算。而是通过定点数进行比较和运算
BigDecimal b1 = new BigDecimal(Double.toString(v1));
(4)数据库中,float,double表示浮点数
用decimal或numberic表示定点数
所以对于货币等敏感数据,用定点数存储
4.日期类型的选择?
如果只记录年份,用year
如果还要记录时分秒,用datetime
如果考虑不同时区,用timestamp
七.字符集
(1)第一个字符集ASCII
(2)为了处理不同的文字,又出现了几百种字符集。如iso-8859,GBK,GB2312等
(3)为了统一编码,国际标准化组织iso制定了国际字符集标准UCS,这种标准采用四字节编码,将代码空间划分位组,面,行,格
(4)这种UCS编码遭到了很多美国计算机协会的反对(sun,apple,ibm等)它们组成了unicode的协会,并推出了unicode1.0(二字节)
(5)后来为了编码格式的统一,双方展开谈判,将unicode编码并入UCS的0组0字面。把它称作基本多语言文字面(BMP),剩下的两个字节做辅助字面和专用字面
(6)其实人们常用到的还是unicode里的字符(99%),但是要用unicode里没有而ucs有的怎么办呢?所以制定了UTF-16,后来UTF-16在使用过程中出现了一系列的问题,所以出现了UTF-8(1至4字节编码)
八.索引的设计和使用
0.什么是索引?
系统根据某种算法,将已有的数据(和未来新增的数据)单独建立一个文件,文件能够实现快速的匹配数据,并能够快速的找到对应表中的记录
1.每种存储引擎(innodb,myidsam等)对每个表至少支持16个索引,myisam和innodb默认创建的都是BTREE索引,memory存储引擎默认使用hash索引
2.创建索引:
create index 索引名 on 表名 列命
3.删除索引
drop index 索引名 on 表名
4.mysql中提供的索引类型?
(1)主键索引
(2)唯一索引
(3)全文索引:根据文章内部的关键字进行索引
(4)普通索引
九.视图
1.什么是视图?
视图是一种虚拟存在的表。通俗的讲,视图就是一条SELECT语句执行后返回的结果集。
2.什么时候用到视图?
(1)经常用到的查询或复杂的联合查询
(2)涉及到权限管理(比如表中某部分字段含有机密信息,不让低权限的用户看到,可以提供给他们一个适合他们权限的视图
3.语句
(1)创建:Create or replace view 视图名 as + 查询语句
(2)查看:show create view 视图名
(3)删除:drop view 视图名
4.视图的意义
(1)可以节省sql语句(将一条复杂的查询结果通过视图保存)
(2)视图操作是怎对查询出来的结果,不会对原数据产生影响,相对安全
(3)更好的进行权限控制
十.函数
1.什么是函数?
将一段代码封装到一个结构中,在需要执行代码的时候调用函数即可(实现了复用)(任何函数都有返回值,因此函数通过select调用)
1.函数的分类?
(1)系统函数:系统调用好的函数,直接调用即可
Select subString(字符串,开始,结束)
Select char_length(字符串)
(2)自定义函数:
创建语法:create function 函数名(形参列表)
Begin
函数体
Return 类型
End
调用: select 函数名();
十一.存储过程
1.存储过程是什么?
存储过程是没有返回值的函数
2.创建过程?
Create procedure 过程名字(参数列表)
Begin
---过程
End
3.调用过程?
(过程没有返回值,不能用select调用。有一个专门的关键字call)
Call 过程名();
4.删除过程
Drop proceddure pro1;
5.过程参数
过程参数还有自己的类型限定(In out inout)
IN参数:
仅需要将数据传入存储过程,并不需要返回计算后的该值。
OUT参数:
不接受外部传入的数据,仅返回计算之后的值。
INOUT参数:
需要数据传入存储过程经过调用计算后,再传出返回值。
十二.触发器
1.什么是触发器?
Tigger,监视某种情况并触发某种操作
十三.范式
1.什么是范式?
1.范式是一种离散数学的知识,是为了解决数据存储和优化的问题,保存数据的存储之后,凡是能通过关系寻找出来的数据,坚决不再重复存储:终极目标是减少数据的冗余(以最少的数据完成最大的存储)
2.范式是一种分层结构的规范
分为6层,1NF,2NF..6NF(6NF最高层,最严格)
每一层都比上一层更加严格,若要满足下一层范式,前提是要满足上一层范式.
2.为什么范式等级不是越高越好?
范式只是为了解决空间问题,而数据库不单是要解决空间问题,还要解决效率问题,所以数据库的设计不能完全按照范式要求实现,一般情况下只有前三种范式要满足
3.前三种范式
(1).第一范式(1NF)
第一范式:第一范式要求数据具有原子性
如上表中的代课时间,当需要取代课的开始时间,需要将字段拆分,不满足第一范式。解决方案是单独两个字段存储开始时间和结束时间
(2).第二范式(2NF)
第二范式:表中不允许出现部分依赖
出现部分依赖的原因是因为出现了复合主键,如下表中的讲师和班级才能组合成一个主键,但性别只依赖于讲师,教室只依赖于班级,出现了部分依赖
解决方案是使用逻辑主键(增加一个id做主键)
(3)第三范式(3NF)
第三范式:不允许出现传递依赖
下表中性别依赖讲师,讲师依赖主键。教室依赖班级,班级依赖主键。所以,教室和性别都存在传递依赖
解决方案:将存在依赖的字段取出,形成一个单独的表
注意:
永远不要将逻辑主键看作是真正的主键,比如讲师表中,真正的主键是讲师,如果把id当成真正的主键,永远会有依赖传递
而上面存在依赖传递的表中,真正的主键是(讲师+班级),所以才会存在性别依赖讲师,讲师依赖主键(id=讲师+班级)这种传递依赖
4.逆规范化
规范化程度较高的时候,我们可能需要做很多的关联查询,这样势必会导致效率的降低。所以有时设计表时,直接存储想要的信息,而不去存储id进行关联查询。这是一种磁盘利用率于效率的对抗