DBMS(数据库操作系统)
对数据库进行操作时需要用到sql语言,sql语言分为DQL、DML、DDL、TCL、DCL
DQL:堆数据库中的数据进行查询操作(select)(重点)
DML:对数据进行增删改操作(insert、delete、update)(重点)
DDL:对数据库中的表结构进行增删改(create、drop、alter)
TCL:事物控制语言,对事物进行提交(submit)、回滚(rollback)
DCL:数据控制语言,进行授权grant、撤销权限revoke
DQL:对数据进行查询操作,基础语法是select 字段名1,字段名2,… from 表名 where 条件
create table student(id int auto_increment primary key,
name varchar(20),
age int);
-
基本应用
select id,name,age from student where name =‘xiaoma’;
可以查询得到一张表,表头是id、name、age以及对应的数据信息
-
查询并对字段名重命名
select id,name as sname from student
这条语句把字段名name改成了sname,用关键字as,不过as可以省略不写,中间用空格隔开
select id,name sname from student
-
条件查询
where后面可以加查询条件,连接符有= != > < >= <= <> between and is null id not null in not in and or like等,其中在使用like时,%代表任意个字符,_ 表示单个字符
-
from 从哪张表中查询
from student A:从student表,并把student表当成A表。
-
group by 和 having
group by 是分组,group by class 以班级为单位进行分组,group by后面可以接两个字段名,先对第一个进行分组,如果第一个字段相同,再对第二个字段名进行分组
having:分组之后的过滤,having后面可以写分组函数(count、sum、max、min、avg5个,如果遇到null自动省略)
-
order by排序
order by 字段名1,字段名2,… asc/desc,对字段1进行升序/降序排列,如果字段1相同,再对字段2进行排序。
-
limit分页
limit start_index,length start_index代表从第几个数据开始分页,(下标是从0开始,不写时默认从0开始),length表示当前页要显示几条数据。
一般limit pagesize*(pageno-1),pagesize pageno表示当前是第几页,pagesize表示每页的数据条数。
-
select 字段 from 表 where 条件 group by 分组字段 having 分组后过滤 order by 排序 limit 分页
⑤ ① ② ③ ④ ⑥ ⑦
insert:insert into 表名(字段1,字段2,…) values(值1,值2,…) 向表中插入数据,其中字段名可以省,省略时表示从第一个字段开始插入
delete:delete from 表名 where 条件,从表中删除满足条件的数据
update:update 表名 set 字段名1 = 值1,字段名2 = 值2,… where 条件;从表中修改满足条件的数据
数据类型
int 整数型
bigint 长整数型
float 浮点型
double 浮点型(精度更高)
char 字符型,固定长度,声明时要加上长度
varchar 可变字符型,声明时也要加上最大长度
date 日期
BLOB 二进制对象,可以存储照片、视频等对象
CLOB 大文本型,可以存储较大的字符串类型,(比如4G的文本)
char与varchar的区别:char 的长度是固定的,比如声明char(6),如果写入的数据是‘ma’,在内存中这个变量也是占了6个字符的内存;声明varchar(6),写入‘ma’,在内存中这个变量只占了2个字符内存
DDL:对表结构进行增删改(create、drop、alter),一般是直接用工具对表结构进行操作,不用sql语言
create table 表名(字段名1 数据类型 约束,字段名2 数据类型 约束,…);
drop table 表名;
约束条件:
非空:not null,该字段不能是null空值
唯一:unique,该字段在整个表中是唯一的,可以是null值;
对单一字段声明唯一:username varchar(100) unique
对两个字段合起来是唯一:unique(studentname,studentage) studentname和studentage两个字段合起来必须是唯一的, 单个字段可以重复,但两个字段合起来不能重复
主键(PK):primary key 声明了主键之后自动变成非空且唯一,一个表中只能有一个主键
自增:auto_increment
外键(FK):foreign key 声明方式,在建表时,在values中加入 foreign key(字段名1) references 表2(字段名2) 该表中的字段名1是外键,连接表2中的字段名2, 那么会产生父子表,表2是父表,该表是子表,创建时先创父表,再创子表,而删除时先删子表,再删父表。向该表插入数据时外键值可以为null
存储方式/引擎MyISAM方式:最常用,它在内存中产生三个文件.frm(存表结构的文件) .MYD(数据文件) .MYI(索引),
优点:可以被压缩,节省空间,可以转为只读表
缺点:不支持事务
InnoDB(默认):表结构存在.frm文件中,数据存在tablespace中(逻辑概念)
优点:支持事务,最安全,支持行级锁、外键等,MySQL崩溃时可以自动恢复
MEMORY:数据存在内存中,容易丢失数据,断电就没,不支持事务,不能存储CLOB BLOB类型的数据
优点:查询最快
事务:transaction:事务,一个完整的业务逻辑单元,不可再分,用来保证数据的安全性、完整性。常用在银行转账中,打款和收款这两步必须同时成功或失败,就可以用事务来控制。
事务特性:ACID
A:原子性,事务是最小的工作单元,不可再分
C:一致性,必须保证多条DML语句同时成功或者失败
I:隔离性,事务A与事务B具有隔离
D:持久性,最终数据必须持久化到硬盘中,事务才算成功
事务隔离级别: 一级:READ uncommitt读未提交,两个事务可以读取到对方的数据,产生脏读问题
二级:READ committed读已提交,事务A提交之后,事务B可以读取到A提交之后的数据,这会导致一个问题:不可重复读的问题,事务B读取同一个表可能返回的结果不一样,可能是A提交之前的,也可能是A提交之后的
三级:Repeated read可重复读,解决不可重复读的问题,但产生幻读问题:事务A对表数据修改提交后,导致事务B的数据毫无意义
四级:Serializable 序列化读/串行化读,解决脏读、不可重复读、幻读问题,但是事务之间要排队等候。
MySQL默认是三级隔离级别,事务是自动提交
数据库设计三范式:
第一范式:每个表都有主键,且每个字段不可再分。
第二范式:在第一范式的基础上,非主键字段完全依赖主键,不能产生部分依赖。即一张表上的数据是相关的,不能产生没有关系的数据。(学生表中出现饮水机的厂家,这两个就不想关)
第三范式:在第二范式的基础上,每一张表的非主键字段都直接依赖主键,不能间接依赖。(订单表上出现客户id即可,避免出现客户地址、姓名等其他信息,会造成数据冗余)
由三范式设计表时,如果是多对多的关系(学生与老师),设计三张表:学生表(主键)、老师表(主键)、学生_老师关系表(主键+2个外键);如果是一对多的关系(学生与班级,一个学生只有一个班级,一个班级有多个学生,学生是多,班级是一),设计两张表,学生表(主键+外键),班级表(主键)。
总结:多对多,三张表,关系表俩外键;一对多,两张表,多的表加外键
不过在实际开发中,还是以客户需求为主,有时也可以用冗余换速度。



