数据库的一些概念题:
DB DBMS 和DBS三者之间的关系
DBS(数据库系统) 包含DB(数据库)和DBMS(数据库管理系统)
DB:是指datebase(数据库)
DBS:是指datebase systerm (数据库系统)
DBMS:是指datebase mangement systerm(数据库管理系统)
区别:数据库就是存放数据的仓库,数据库管理系统就是用来管理数据库的,其中数据库系统是一个通称,包括数据库、数据库管理系统、数据库管理人员等的统称,是最大的范畴。
常见存储引擎的类型
需改表alter
4.修改表结构: 语法: 1. 修改表名 ALTER TABLE 表名 RENAME 新表名; 2. 增加字段 ALTER TABLE 表名 ADD 字段名 数据类型 [完整性约束条件…], ADD 字段名 数据类型 [完整性约束条件…]; ALTER TABLE 表名 ADD 字段名 数据类型 [完整性约束条件…] FIRST; ALTER TABLE 表名 ADD 字段名 数据类型 [完整性约束条件…] AFTER 字段名; 3. 删除字段 ALTER TABLE 表名 DROP 字段名; 4. 修改字段 ALTER TABLE 表名 MODIFY 字段名 数据类型 [完整性约束条件…]; ALTER TABLE 表名 CHANGE 旧字段名 新字段名 旧数据类型 [完整性约束条件…]; ALTER TABLE 表名 CHANGE 旧字段名 新字段名 新数据类型 [完整性约束条件…];
外键的设置
在员工表里面先设置 emp_id的字段然后再关联 emp表里面的字段
1、安装mysql和navicat
2、Mysql数据语法学习
数据库的种类:关系型数据库和非关系型数据库
mysql数据库的操作
查看数据库 show databases; show create database db1; select database(); 选择数据库 USE 数据库名 删除数据库 DROP DATABASE 数据库名; 修改数据库 alter database db1 charset utf8;
查入数据insert
1. 插入完整数据(顺序插入) 语法一: INSERT INTO 表名(字段1,字段2,字段3…字段n) VALUES(值1,值2,值3…值n); 语法二: INSERT INTO 表名 VALUES (值1,值2,值3…值n); 2. 指定字段插入数据 语法: INSERT INTO 表名(字段1,字段2,字段3…) VALUES (值1,值2,值3…); 3. 插入多条记录 语法: INSERT INTO 表名 VALUES (值1,值2,值3…值n), (值1,值2,值3…值n), (值1,值2,值3…值n); 4. 插入查询结果 语法: INSERT INTO 表名(字段1,字段2,字段3…字段n) SELECT (字段1,字段2,字段3…字段n) FROM 表2 WHERE …;
更新数据UPDATE
语法: UPDATE 表名 SET 字段1=值1, 字段2=值2, WHERE CONDITION(条件); 示例: UPDATE mysql.user SET password=password(‘123’) where user=’root’ and host=’localhost’;
一定要加where
mysql表的操作
表的数据类型:
#1. 数字: 整型:tinyinit int bigint 小数: float :在位数比较短的情况下不精准 double :在位数比较长的情况下不精准 0.000001230123123123 存成:0.000001230000 decimal:(如果用小数,则用推荐使用decimal) 精准 内部原理是以字符串形式去存 #2. 字符串: char(10):简单粗暴,浪费空间,存取速度快 root存成root000000 varchar:精准,节省空间,存取速度慢 sql优化:创建表时,定长的类型往前放,变长的往后放 比如性别 比如地址或描述信息 >255个字符,超了就把文件路径存放到数据库中。 比如图片,视频等找一个文件服务器,数据库中只存路径或url。 #3. 时间类型: 最常用:datetime #4. 枚举类型与集合类型 enum('male','female') set('play','music','read','study')
MariaDB [db1]> create table consumer( -> name varchar(50), -> sex enum('male','female'), -> level enum('vip1','vip2','vip3','vip4','vip5'), #在指定范围内,多选一 -> hobby set('play','music','read','study') #在指定范围内,多选多 -> );
表的约束
#1、建立表关系: #先建被关联的表,并且保证被关联的字段唯一 #----- 父表-------- create table dep( id int primary key, name char(16), comment char(50) ); 部门表和员工表 foreign key设置在员工表 #再建立关联的表 create table emp( id int primary key, name char(10), sex enum('male','female'), dep_id int, foreign key(dep_id) references dep(id) on delete cascade # 删除同步 只要被关联的 ,关联的 也删除 解散it部门,其他关联it部门的员工也删除 on update cascade # 更新同步, );
表与表之间的关系
分析步骤: #1、先站在左表的角度去找 是否左表的多条记录可以对应右表的一条记录,如果是,则证明左表的一个字段foreign key(外键) 右表一个字段(通常是id) #2、再站在右表的角度去找 是否右表的多条记录可以对应左表的一条记录,如果是,则证明右表的一个字段foreign key 左表一个字段(通常是id) #3、总结: #多对一: 如果只有步骤1成立,则是左表多对一右表 如果只有步骤2成立,则是右表多对一左表 #多对多 如果步骤1和2同时成立,则证明这两张表时一个双向的多对一,即多对多,需要定义一个这两张表的关系表来专门存放二者的关系 #一对一: 如果1和2都不成立,而是左表的一条记录唯一对应右表的一条记录,反之亦然。这种情况很简单,就是在左表foreign key右表的基础上,将左表的外键字段设置成unique即可
mysql字段的操作
mysql表的查询
单表查询和多表查询
select count(学号) as “总人数” FROM student;
这个as可以写也可以不写
单表查询: http://www.cnblogs.com/linhaifeng/articles/7267592.html 1.单表查询的语法 2.关键字的执行优先级(重点) 3.简单查询 4.where 约束 5.分组查询:group by 在where之后查询 6.having 过滤 7.查询排序:order by
8.限制查询得记录数:limit 9.使用正则表达式查询
多表查询:
SELECT DISTINCT <select_list> FROM <left_table> <join_type> JOIN <right_table> ON <join_condition> WHERE <where_condition> GROUP BY <group_by_list> HAVING <having_condition> ORDER BY <order_by_condition> LIMIT <limit_number>
内连接:只取两张表的共同部分 select * from employee inner join department on employee.dep_id = department.id ; 左连接:在内连接的基础上保留左表的记录 select * from employee left join department on employee.dep_id = department.id ; 右连接:在内连接的基础上保留右表的记录 select * from employee right join department on employee.dep_id = department.id ; 全外连接:在内连接的基础上保留左右两表没有对应关系的记录 select * from employee full join department on employee.dep_id = department.id ; select * from employee left join department on employee.dep_id = department.id union select * from employee right join department on employee.dep_id = department.id ;
7.4 使用事务保证数据完整性
事务就是将一组SQL语句放在同一批次内去执行,如果一个SQL语句出错,则该批次内的所有SQL都将被取消执行。
注意:
MySQL事务处理只支持InnoDB和Berkeley DB数据表类型
ACID,指数据库事务正确执行的四个基本要素的缩写。
包含:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。
一个支持事务(Transaction)的数据库,必须要具有这四种特性,否则在事务过程(Transaction processing)当中无法保证数据的正确性。
使用场景:
银行的交易系统
原子性:执行事务要么都成功,要么都不成功
一致性:执行后,保存数据的一致性
隔离性:事务之间相互独立,互不影响
持久性:数据永远存储在数据库中
start transaction = begin等效
start transaction; update user set balance=900 where name='wsb'; #买支付100元 update user set balance=1010 where name='egon'; #中介拿走10元 update user set balance=1090 where name='ysb'; #卖家拿到90元 commit; #出现异常,回滚到初始状态 start transaction; update user set balance=900 where name='wsb'; #买支付100元 update user set balance=1010 where name='egon'; #中介拿走10元 uppdate user set balance=1090 where name='ysb'; #卖家拿到90元,出现异常没有拿到 rollback; # 回滚到原来的状态 commit; # 只有提交了,事务操作才完成
问题:有没有遇到脏读问题,怎么解决,用事务(隔离级别处理),事务是什么?
查看默认事务隔离级别
select @@tx_isolation;
如何关闭和开启MySQL的自动提交?
在MySQL中执行命令时,通常都直接被确定提交了。也就是说用户不用意识此事,所有的命令都会被自动COMMIT。特别是当存储引擎为MyISAM的情况下,本身它是不支持事务处理的,只要执行了命令,所有的命令部会被提交。 这样的默认自动提交的功能就被称为自动提交功能。自动提交功能默认被置为ON的状态。但是,如果存储引擎为InnoDB 时,当执行了START TRANSACTION或BEGIN命令(MySQL事务处理-删除后回滚)后,将不会自动提交了,只有明确执行了COMMIT命令后才会被提交,在这之前可以执行ROLLBACK 命令回滚更新操作。 用户可以将自动提交功能强制置为OFF。这样用户执行SQL语句后将不会被提交了,而执行COMMIT命令才提交,执行ROLLBACK命令回壤。 下面是将自动提交功能置为ON以及置为OFF的具体语法。 将自动提交功能置为ON SET AUTOCOMMIT=0; 将自动提交功能置为OFF SET AUTOCOMMIT=1; 我们将演示自动提交功能设置为OFF后,会出现的什么样的变化。置为OFF,我们向表user里插入一条数据后,看看是否能回滚。 将自动提交功能设置为OFF,执行结果如下。 mysql> SET AUTOCOMMIT=0; Query OK, 0 rows affected (0.00 sec)
MySQL的事务处理实现流程是什么?
如果存储引擎为InnoDB 时,不需要
将自动提交功能置为ON SET AUTOCOMMIT=0;
1、关闭自动提交 2、开始事务 3、执行SQL语句操作 4、要么rollback 要么commit 如果存储引擎为InnoDB 时,当执行了START TRANSACTION或BEGIN命令(MySQL事务处理-删除后回滚)后,将不会自动提交了,只有明确执行了COMMIT命令后才会被提交,在这之前可以执行ROLLBACK 命令回滚更新操作。
5、set autocommit=1;把提交变为初试状态
7.5 使用DQL命令查询数据
mysql语言的分类
SQL语言共分为四大类:数据查询语言DQL,数据操纵语言DML,数据定义语言DDL,数据控制语言DCL。 1. 数据查询语言DQL 数据查询语言DQL基本结构是由SELECT子句,FROM子句,WHERE 子句组成的查询块: SELECT <字段名表> FROM <表或视图名> WHERE <查询条件> 2 .数据操纵语言DML 数据操纵语言DML主要有三种形式: 1) 插入:INSERT 2) 更新:UPDATE 3) 删除:DELETE 3. 数据定义语言DDL 数据定义语言DDL用来创建数据库中的各种对象-----表、视图、 索引、同义词、聚簇等如: CREATE TABLE/VIEW/INDEX/SYN/CLUSTER | | | | | 表 视图 索引 同义词 簇 DDL操作是隐性提交的!不能rollback 4. 数据控制语言DCL 数据控制语言DCL用来授予或回收访问数据库的某种特权,并控制 数据库操纵事务发生的时间及效果,对数据库实行监视等。如: 1) GRANT:授权。 2) ROLLBACK [WORK] TO [SAVEPOINT]:回退到某一点。 回滚---ROLLBACK 回滚命令使数据库状态回到上次最后提交的状态。其格式为: SQL>ROLLBACK; 3) COMMIT [WORK]:提交。 在数据库的插入、删除和修改操作时,只有当事务在提交到数据 库时才算完成。在事务提交前,只有操作数据库的这个人才能有权看 到所做的事情,别人只有在最后提交完成后才可以看到。 提交数据有三种类型:显式提交、隐式提交及自动提交。下面分 别说明这三种类型。 (1) 显式提交 用COMMIT命令直接完成的提交为显式提交。其格式为: SQL>COMMIT; (2) 隐式提交 用SQL命令间接完成的提交为隐式提交。这些命令是: ALTER,AUDIT,COMMENT,CONNECT,CREATE,DISCONNECT,DROP, EXIT,GRANT,NOAUDIT,QUIT,REVOKE,RENAME。 (3) 自动提交 若把AUTOCOMMIT设置为ON,则在插入、修改、删除语句执行后, 系统将自动进行提交,这就是自动提交。其格式为: SQL>SET AUTOCOMMIT ON;
练习:创建学生表、教师表、课程表、成绩表
1、创建学生表:
create table student(学号 int primary key not null ,姓名 char null,年龄 int not null,性别 enum('男','女'))
2、创建教师表:
create table teacher(教师编号 int primary key not null,教师姓名 char)
3、创建课程表:与教师编号一对多关系
create table class(课程编号 int primary key not null,
课程名 char,教师编号 int,
foreign key(教师编号) references teacher(教师编号) on delete cascade on update cascade);
4、创建成绩表:成绩对应多个学生,成绩对应多个课程
create table score(学号 int,课程编号 int,成绩 int,foreign key(学号) references student(学号) on delete cascade on update cascade,
foreign key(课程编号) references class(课程编号) on delete cascade on update cascade);
插入数据:
插入学生数据:
insert into student(学号,姓名,年龄,性别) values(1001,'张三',10,'男'),(1002,'李四',11,'女')