数据库mysql

一、什么是数据库

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

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

数据库的基本命令

修改密码

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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值