一、什么是数据库
数据库:长期保存在计算机内的数据集合,相当于一个仓库。
作用:用来保存和管理数据
数据库的基本命令
修改密码
updata user set password=password('123456') where user='root';
刷新数据库
flush privileges;
show databases; 显示所有数据库 use dbname;打开某个数据库 show tables; 显示数据库mysql中所有的表 describe user; 显示表mysql数据库中user表的列信息 create database name; 创建数据库 use databasename; 选择数据库
二、查询语句的分类
DDL数据定义语言 create、drop、alter
DML数据操作语言 insert、updata、delete
DQL数据查询语言 select
DCL数据控制语言 grant、commint、rollback
数据字段属性
UnSigned无符号的声明该数据列不允许负数 .ZEROFILL 0填充的不足位数的用0来填充 , 如int(3),5则为005
Auto_InCrement自动增长的 , 每添加一条数据 , 自动在上一个记录数上加 1(默认)通常用于设置主键 , 且为整数类型可定义起始值和步长当前表设置步长(AUTO_INCREMENT=100) : 只影响当前表SET @@auto_increment_increment=5 ; 影响所有使用自增的表(全局)
NULL 和 NOT NULL默认为NULL , 即没有插入该列的数值如果设置为NOT NULL , 则该列必须有值
DEFAULT默认的用于设置默认值
例如,性别字段,默认为"男" , 否则为 "女" ; 若无指定该列的值 , 则默认值为"男"的值
三、DML语言(操作)
-
insert(添加数据语句)
-
update(更新数据语句)
-
delete(删除数据语句)
外键:将一个表的值放入第二个表来表示关联
主要目的是控制存储在外键表中的数据,形成约束。
使两张表形成关联,外键只能引用外表中的列的值或使用空值。
create table grade(
gradeid int(10) not null auto_increment comment'年级ID',
gradename varchar(50) not null comment'年级名称',
primary key(gradeid)
)engine=innodb default charset=utf8
)
CREATE TABLE `student` (
studentno INT(4) NOT NULL COMMENT '学号',
studentname VARCHAR(20) NOT NULL DEFAULT '匿名' COMMENT '姓名',
primary key(studentno ),
key `FK_gradeid` (`gradeid`),
constraint FK_gradeid foreign key(`gradeid`) refrences`grade` (`gradeid`)
) ENGINE=INNODB DEFAULT CHARSET=utf8
DML语言
insert into test(coll) values(row1),(row2),(row3);
delete from test;
truncate table test;//删除表数据
四、DQL语言
SELECT
[left | right | inner join table_name2] -- 联合查询 [WHERE ...] -- 指定结果需满足的条件 [GROUP BY ...] -- 指定结果按照哪几个字段来分组 [HAVING] -- 过滤分组的记录必须满足的次要条件 [ORDER BY ...] -- 指定查询记录按一个或多个条件排序 [LIMIT {[offset,]row_count | row_countOFFSET offset}] -- 指定查询的记录从哪条至哪条
AS 子句作为别名
select studentno as 学号,studentname as 姓名 from student;//列取别名
select studentno as 学号,studentname as 姓名 from student as s;//表取别名
selecr concat('姓名:',studentname) as 新名字 from studnet//查询结果取名字
DISTINCT去掉SELECT查询返回的记录结果中重复的记录
SELECT DISTINCT studentno FROM result;
where条件语句
-- 查询考试成绩在95-100之间的select studentno,studentresult from result where studentresult >=95 and studentresult<=100;
and可换为&&,between 95 and 100;
模糊查询
-- 查询姓刘的同学的学号及姓名 -- like结合使用的通配符 : % (代表0到任意个字符) _ (一个字符) SELECT studentno,studentname FROM student WHERE studentname LIKE '刘%'; -- 查询姓刘的同学,后面只有一个字的 SELECT studentno,studentname FROM student WHERE studentname LIKE '刘_'; -- 查询姓刘的同学,后面只有两个字的 SELECT studentno,studentname FROM student WHERE studentname LIKE '刘__'; -- 查询姓名中含有 嘉 字的 SELECT studentno,studentname FROM student WHERE studentname LIKE '%嘉%'; -- 查询姓名中含有特殊字符的需要使用转义符号 '\' -- 自定义转义符关键字: ESCAPE ':'-- IN -- ============================================= -- 查询学号为1000,1001,1002的学生姓名 SELECT studentno,studentname FROM student WHERE studentno IN (1000,1001,1002); -- 查询地址在北京,南京,河南洛阳的学生 SELECT studentno,studentname,address FROM student WHERE address IN ('北京','南京','河南洛阳'); -- ============================================= -- NULL 空 -- ============================================= -- 查询出生日期没有填写的同学 -- 不能直接写=NULL , 这是代表错误的 , 用 is null SELECT studentname FROM student WHERE BornDate IS NULL; -- 查询出生日期填写的同学 SELECT studentname FROM student WHERE BornDate IS NOT NULL; -- 查询没有写家庭住址的同学(空字符串不等于null) SELECT studentname FROM student WHERE Address='' OR Address IS NULL;
连接查询
多张数据表的数据进行查询
student result
内连接inner join
查询两个表中的结果集中的交集select s.studentno,studentname,subjectno,result from
student s inner join result r on
r.studentno=s.studentno
外连接
左外连接left join
以左表作为基准,右边表来一一匹配,匹配不上的,返回左表的记录,右表以NULL填充select s.studentno,studentname,subjectno,result from
student s left join result r on
r.studentno=s.studentno
右外连接right join
以右表作为基准,左边表来一一匹配,匹配不上的,返回右表的记录,左表以NULL填充select s.studentno,studentname,subjectno,result from
student s right join result r on
r.studentno=s.studentno
等值连接
select s.studentno,studentname,subjectno,result from
student s ,result r
where r.studentno=s.studentno
自连接
排序
order by
asc升序
dasc降序
select s.studentno,studentname,subjectname,subjectresult
from student s inner join result r on r.studentno=s.studentno
inner join subject sub on r.studentno=sub.studentno
where subjectname='数据库结构-1'
order by studentresult desc
分页
select s.studentno,studentname,subjectname,subjectresult
from student s inner join result r on r.studentno=s.studentno
inner join subject sub on r.studentno=sub.studentno
where subjectname='数据库结构-1'
order by studentresult desc,studentno
limit 0,5
子查询
在查询语句中的WHERE条件子句中,又嵌套了另一个查询语句 嵌套查询可由多个子查询组成,求解的方式是由里及外; 子查询返回的结果一般都是集合,故而建议使用IN关键字;-- 查询 数据库结构-1 的所有考试结果(学号,科目编号,成绩),并且成绩降序排列 -- 方法一:使用连接查询select s.studentno,studentname,subjectname,subjectresult
from student s inner join result r on r.studentno=s.studentno
inner join subject sub on r.studentno=sub.studentno
where subjectname='数据库结构-1'
order by studentresult desc
-- 方法二:使用子查询(执行顺序:由里及外select studentno,subjectno,studentresult
from result
where subjectno=(
select subjectno from subject
where subjectname='数据库结构-1'
)
聚合函数
SELECT SUM(StudentResult) AS 总和 FROM result;
SELECT AVG(StudentResult) AS 平均分 FROM result;
SELECT MAX(StudentResult) AS 最高分 FROM result;
SELECT MIN(StudentResult) AS 最低分 FROM result;
五、事物
事物:
事务就是将一组SQL语句放在同一批次内去执行
如果一个SQL语句出错,则该批次内的所有SQL都将被取消执行
同生共死
事物的特性(ACID)
原子性(Atomic)
整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节。
事务在执行过程中发生错误,会被回滚(ROLLBACK)到事务开始前的状态。
一致性(Consist)
事务必须始终保持系统处于一致的状态,不管在任何给定的时间并发事务有多少。
其主要特征是保护性和不变性
以转账案例为例,假设有五个账户,每个账户余额是100元,那么五个账户总额是500元,
如果在这个5个账户之间同时发生多个转账,无论并发多少个,比如在A与B账户之间转账5元,在C与D账户之间转账10元,在B与E之间转账15元,
五个账户总额也应该还是500元,这就是保护性和不变性。
隔离性(Isolated)
给定时间内执行的唯一操作。不同事物之间互不影响
如果有两个事务,运行在相同的时间内,执行相同的功能,
事务的隔离性将确保每一事务在系统中认为只有该事务在使用系统。
这种属性有时称为串行化,为了防止事务操作间的混淆,必须串行化或序列化请求,使得在同一时间仅有一个请求用于同一数据。
持久性(Durable)
在事务完成以后,该事务对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。
六、事务的隔离级别
读未提交(Read UnCommitted/RU)
又称为脏读,一个事务可以读取到另一个事务未提交的数据。这种隔离级别岁最不安全的一种,因为未提交的事务是存在回滚的情况。读已提交(Read Committed/RC)
又称为不可重复读,一个事务因为读取到另一个事务已提交的修改数据,导致在当前事务的不同时间读取同一条数据获取的结果不一致。可重复读(Repeatable Read/RR)
又称为幻读,一个事物读可以读取到其他事务提交的数据,但是在RR隔离级别下,当前读取此条数据只可读取一次,在当前事务中,不论读取多少次,数据任然是第一次读取的值,不会因为在第一次读取之后,其他事务再修改提交此数据而产生改变。因此也成为幻读,因为读出来的数据并不一定就是最新的数据。
串行化(Serializable)
所有的数据库的读或者写操作都为串行执行,当前隔离级别下只支持单个请求同时执行,所有的操作都需要队列执行。所以种隔离级别下所有的数据是最稳定的,但是性能也是最差的。数据库的锁实现就是这种隔离级别的更小粒度版本。
七、索引
八、三大范式
插入的数据要满足三大范式
第一范式 (1st NF)
第一范式的目标是确保每列的原子性
第二范式(2nd NF)
第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。
第二范式要求每个表只描述一件事情
第三范式(3rd NF)
如果一个关系满足第二范式,并且除了主键以外的其他列都不传递依赖于主键列,则满足第三范式.
第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。
引用