增删改查:
增加 insert into table values();
删除 delete from table where ...;
修改 update ... set ... where ...;
查询 select
查看数据表结构
mysql> describe table;
约束
1、主键约束(不可重复,不可为空)
Primary key约束,联合主键值加起来不重复即可自增约束重复则自动增长后添加主键Alter table table_name add primarykey(id);删除alter table table_name drop primary key;
2、唯一约束
Unique禁止重复Unique(id,name)表示两个键在一起不重复即可删除alter table table_name drop index name;添加alter table table_name modify namevarchar(20) unique;建表就添加约束可使用alte...add..alter...modify...删除alter...drop..
3、非空约束
修饰字段不能为空 NULL
4、默认约束
插入字段,未传值,则用默认值
传值了,则不会使用默认值
5、外键约束
涉及:主表,副表
1、主表没有的数据,副表不能用
2、主表记录被副表引用,不能删除
三大设计范式
第一范式(拆字段)
1NF
字段可继续拆,则不满
范式,设计越详细,对某些操作可能更好,但不一定都是好处
第二范式
2NF
1NF+除主键外的每一列都必须完全依赖与主键
如果不完全依赖,只可能发生在联合组件
问题,除主键以外的其他列,只依赖与主键的部分字段,怎么办?
答:拆表
分成三个后,就满足第二范式
例:createtable myorder(product_idint,customer_idint,product_namevarchar(20),customer_namevarchar(20),primarykey(product_id,customer_id));拆分:createtable myorder(order_idint primary key,product_idint,customer_idint,);createtable product(idint primary keynamevarchar(20));createtable customer(idint primary key,name varchar(20));
分成三个后,就满足第二范式
第三范式
3NF
2NF+除主键外的其他列之间不能有传递依赖关系
mysql查询练习
distinct(排除重复)
查询区间between...and...
表示或关系 in
表或者 or
降序desc,升序asc
统计count
分组 group by
联合求并集 union
表示任意一个 any
表示所有 all
别名 as
最大max(…),最小min(…)
SQL的四种连接查询
一、内连接
innerjoin 或 join
内联查询,其实就是两张表中的数据,通过某个字段相等,查询出相关记录数据。
二、外连接
1、左连接 left join 或者 left outer join
左外连接,会把左边表里面所有数据取出来,而右边表中的数据,如果有相等的,就显示出来,没有,会补NULL
2、右连接 right join 或者 right outer join
右外连接,会把右边表里面所有数据取出来,而左边表中的数据,如果有相等的,就显示出来,没有,会补NULL
3、完全外连接 full join 或者 full outer join
mysql不支持 full join
mysql事务
mysql中,事务其实是一个最小的不可分割的工作单元,事务能够保证一个业务的完整性,比如银行转账。
实际的程序中,如果只有一条语句执行成功了,而另外一条没有执行成功?
因为出现数据前后不一致。
多条sql语句,可能会有同时成功的要求,要么就是同时失败。
那么mysql中如何控制事务呢?
自动提交?@@autocommit
手动提交?commit;
事务回滚?rollback;
mysql默认是开启事务的。(自动提交)
mysql> select @@autocommit;+--------------+| @@autocommit |+--------------+| 1 |+--------------+1 row in set (0.00 sec)
默认事务开启的作用是什么?
当我们去执行一个sql语句的时候,效果会立即体现出来,且不能回滚。
事务回滚:撤销sql语句执行效果(rollback)
设置mysql自动提交为false
set autocommit=0;mysql> select @@autocommit;+--------------+| @@autocommit |+--------------+| 0 |+--------------+1 row in set (0.00 sec)上面的操作,关闭了mysql的自动提交(commit)
再一次插入数据
手动提交数据
再撤销是不可以撤销的(持久性)
如果这时候插入数据:
事务给我们提供了一个返回的机会;
begin; 或者 start transaction都可以手动开启一个事务;
开启事务后,事务回滚,没有被撤销
手动开启事务后,回滚,被撤销
事务开启后,一旦commit提交,就不可以回滚(即提交时就结束了)
事务的四大特性(ACID):
原子性(Atomicity):事务单元最小的单位,不可再分割。
一致性(Consistency):失误要求,同一事务中的sql语句,必须保持同时成功或者同时失败。
隔离性(Isolation):事务1 和事务2 之间具有隔离性。
持久性(Durability):事务一旦结束(commit,rollback),就不可以返回
事物的隔离性:
1、readuncomitted; 读未提交的
2、readcommitted; 读已提交的
3、repeatableread; 可以重复读
4、serializable;串行化
--如何查看数据库的隔离级别?
mysql 8.0;--系统级别select @@global.transaction_isolation;--会话级别select @@transaction_isolation;mysql 5.x;select @@global.tx_isolation;select @@tx_isolation;
--mysql默认隔离级别 REPEATABLE-READ
--如何修改隔离级别?
mysql> set global transaction isolationlevel 级别;
1-read uncomitted
如果有事务a,和事务b.
a 事务对数据进行操作,在操作过程中,事务没有被提交,但是b 可以看见a 操作的结果
如果两个不同的地方,都在进行操作,如果事务a开启之后,他的数据可以被事务读取到。这样就会出现(脏读)
脏读:一个事务读取到另外一个事务没有提交的数据。
实际开发是不允许脏读出现的。
2、readcommitted; 读已提交的
虽然只能读取到另外一个事务提交的数据,但还会出现问题
读取同一个表的数据,发现前后不一致。
不可重复读取现象:read committed
3、repeatableread; 可以重复读
会导致幻读:
即事务a 和事务b 同时操作一张表,事务a 提交的数据,也不能被事务b 读取到,就可以造成幻读。
4、serializable; 串行化
sql语句被卡住
当表被另外一个事务操作的时候,其他事务里面的写操作,是不可以进行的。
进入排队状态(串行化),直到d 事务结束后,c 这个的写入操作才会执行。
在没有等待超时的情况下
*串行化问题,性能差!!
性能优到差(隔离级别越高,性能越差):
READ-UNCOMMITTED>READ-COMMITTED>REPEATABLE-READ>SERIALIZABLE
mysql 默认隔离级别为 REPEATABLE-READ
个人观点,学数据库应该多加练习,做到熟悉增删改查。
最后希望大家能在公众号给我留言,需要改正的地方。




