mysql基础
1)mysql存储结构: 数据库 -> 表 -> 数据 sql语句
2)管理数据库:
增加: create database 数据库 default character utf8;
删除: drop database 数据库;
修改: alter database 数据库 default character gbk;
查询: show databases / show create database 数据库;
3) 管理表:
选择数据库:use 数据库;
增加: create table 表(字段名1 字段类型,字段名2 字段类型......);
删除: drop table 表;
修改:
添加字段: alter table 表 add [column] 字段名 字段类型;
删除字段: alter table 表 drop [column] 字段名;
修改字段类型: alter table 表 modify 字段名 新的字段类型;
修改字段名称 : alter table 表 change 旧字段名 新字段名 字段类型;
修改表名称: alter table 表 rename [to] 新表名;
查询:
show tables / desc student;
4) 管理数据:
增加: insert into 表(字段1,字段2,。。。) values(值1,值2.。。。。);
删除: delete from 表 where 条件;
修改: update 表 set 字段1=值1,字段2=值2...... where 条件;
查询:
4.1)所有字段: select * from 表;
4.2)指定字段: select 字段1,字段2.... from 表;
4.3)指定别名: select 字段1 as 别名 from 表;
4.4 )合并列: select (字段1+字段2) from 表;
4.5)去重: select distinct 字段 from 表;
4.6)条件查询:
a)逻辑条件 :and(与) or(或)
select * from 表 where 条件1 and/or 条件2
b)比较条件: > < >= <= = <> between and(在。。。之间)
select * from 表 where servlet>=90;
c)判空条件:
判断null: is null / is not null
判断空字符串: ='' / <>''
d)模糊条件: like
%: 替换任意个字符
_: 替换一个字符
4.7 分页查询:limit 起始行,查询行数
起始行从0开始
4.8 排序: order by 字段 asc/desc
asc: 正序,顺序
desc:反序,倒序
4.9 分组查询:group by 字段
4.10: 分组后筛选: having 条件
SQL语句的分类:
DDL: 数据定义语言
create / drop / alter
DML:数据操作语句
insert / delete /update / truncate
DQL: 数据查询语言:
select / show
mysql加强
1)数据约束(表约束)
默认值: default 默认值
非空: not null
唯一: unique
主键: primary key (非空+唯一)
自增长: auto_increment
外键: foreign key 约束两种表
2)关联查询(多表查询)
2.1 交叉连接(产生笛卡尔积:原因:连接条件不足够) 表数量-1
2.2 内连接查询: inner join
只有满足连接条件的数据才会显示!!!
2.3 左【外】连接查询:left [outer] join
左表的数据必须全部显示,用左表去匹配右表的数据,如果右表有符号条件的数据则显示符 合条件的数据;如果不符合条件,则显示null。
2.4 右【外】连接查询: right [outer] join
右表的数据必须全部显示,用右表去匹配左表的数据,如果左表有符号条件的数据则显示符 合条件的数据;如果不符合条件,则显示null。
2.5 自连接查询
3)存储过程
-- 创建存储过程语法
delimeter 结束符号
create procedure 名称(IN/OUT/INOUT 参数名称 参数类型)
begin
带逻辑的sql语句
end 结束符号
--调用存储过程
CALL 存储过程名称(实际参数);
存储引擎:某一张表的存储数据的格式,mysql数据库特有的,可以在my.ini文件中修改 default-storage-engine
MyISAM:可以设置为只读来加快检索效率,设置压缩节省空间 格式.frm,数据.MYD ,索引文件.MYI
InnoDB:默认的,支持事物,支持外键以及引用的的完整性,包括级联删除和更新。.frm格式表示,崩溃后提供自动恢复
MEMORY:速度快,表数据、索引存储在内存中。表级锁机制,不包含TEXT或BLOB字段,不能存图片
事物:Transaction
一个最小的不可在分的工作单元。
通常一个事务对应一个完整的业务。如转账
而一个完整的业务选由批量的DML语句(insert,update,delete)共同联合完成。
事物只和DML语句有关系,或者说DML语句才有事务。
原子性:事务的最小工作单元,不可再分
一致性:事务要求所有的DML语句操作的时候,必须保证同时成功或者同时失败
隔离性:事务A和事务B之间具有隔离
持久性:事务的保证,事务终结的标志。
开启事务:Start Transaction 任何dml语句的执行,标志事务的开启
事务结束:end Transaction 提交、回滚操作
提交事务:commit Transaction 将dml语句操作历史记录和底层硬盘文件的数据进行同步
回滚事务:rollback Transaction 将dml语句操作历史记录全部清空
和事务有关的SQL语句【TCL】
事务进行过程中,未结束之前,DML语句是不会更改底层数据文件中的数据
在mysql数据库管理系统中,默认情况下,事务是自动提交的。
关闭自动提交的方式:
1)手动开启事务。
2)查询自动提交状态。show variables like '%commit%'; 关闭自动提交 set autocommit=off;(on开启)
本次session有效:set session autocommit=off;
事务的四个特性之一:隔离性(isonlation)
4个隔离级别:
read uncommitted 读未提交
——事务A和事务B,事务B可以读取到。读到“脏数据”,“Dirty Read”脏读
——隔离级别最低,理论上存在,数据库默认的都高于该级别
read committed 读已提交
——事务A和事务B,事务A提交的数据,事务B才能读取到。
——导致“不可重复读”,假如A、B共用同一账户,A第一次读,余额1000,在次期间,B花掉200,A第二次看,只剩下800了。oracle默认是该级别
repeatable read 可重复读
——事务A和事务B,事务A提交之后的数据,事务B读取不到。
——事务B是可以重复读取数据的。
——换句话说:对方提交之后的数据我还是读取不到,类似读的缓存数据
——mysql默认该级别,可以达到重复读的效果,但插入操作是会导致“幻象读”,(innoDB无幻,尚未理解)
serializable 串行化
——事务A和事务B,在事务A在操作数据库中表的数据的时候,事务B只能排队等待。
——很少用,效率低,可以避免幻读,因为每次都是读取数据库中真实的记录。不存在并发操作了。
以上4个级别,这篇博文写的通俗易懂:http://blog.csdn.net/qq_33290787/article/details/51924963
修改隔离级别方法:级别可在配置文件中设置:transaction-isolation = READ-COMMITTED
命令修改方式
set [无/session(会话级)/global(全局级)] transaction isolation level <isolation-level>;
<isolation-level>可选值:
READ UNCOMMITTED
READ COMMITTED
REPEATABLE READ
SERIALIZABLE
查看隔离级别:select @@tx isolation; (@@session.tx 会话级,@@global.tx全局级)
1)什么是索引?
1。索引:index,相当于一本字典的目录,用于提高程序的检索【查询】效率
2.主键自动添加索引,所以通过主键查询,效率较高
3.索引和表相同,都是一个对象,表是存储在硬盘文件中,那么索引是表的一部分,索引也是存储在硬盘文件中。
4。在mysql数据库管理系统中,对表中记录进行检索的时候,通常包括几种检索方式:
——全表扫描【效率较低】
——通过索引进行检索【提高查询效率】
索引是排序的
5.一个表中的所有字段都可以添加索引。
6.什么情况下适合给表中的某个字段添加索引?
——字段数据量庞大
——字段很少进行DML操作【经常修改的字段,需要不断的维护索引,反而会影响效率】
——字段经常出现在where条件中
7如何创建索引?例子:dept_dname_index:索引名称 dept 表名 dname 建索引的字段
create index dept_dname_index on dept(dname);
create unique(唯一性约束) index dept_dname_index on dept(dname);
8.怎么删除索引
drop index dept_dname_index
视图:创建格式
created view myview(这是视图名) as select * from emp;只来源于查询语句
create table emp3 as select * from emp;区别?
相当于建立了一张临时表:查询语法不变,更新操作会对应到 来源表
删除视图会影响到源表
用途:隐藏表的细节
DBA命令:待续
数据库设计三范式:
设计数据库表的时候所依据的规范,共三个
第一范式:要求有主键,并且要求每一个字段原子性不可再分
第二范式:所有非主键字段完全依赖主键,不能产生部分依赖(多对多关系,尽量别使用联合主键,以避免数据冗余)
第三范式:所有非主键字段和主键字段之间不能产生传递依赖
几个比较经典的设计:
一对一:分两张表,共享主键 分两张表,外键唯一
一对多:多的一方加外键,外键字段引用一的一方中的主键
多对多:学生表,教师表,师生关系表,
实际开发中是怎样的?
待续