数据库mysql

it2026-03-08  4

一、什么是数据库

数据库:长期保存在计算机内的数据集合,相当于一个仓库。

作用:用来保存和管理数据

数据库的基本命令

修改密码

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)

如果一个关系满足第二范式,并且除了主键以外的其他列都不传递依赖于主键列,则满足第三范式.

第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。

引用

http://mp.weixin.qq.com/mp/homepage?__biz=Mzg2NTAzMTExNg==&hid=4&sn=044c8767bd3c1825a329c2b98fff2ffe&scene=18#wechat_redirect

 

最新回复(0)