mysql 全解
https://www.cnblogs.com/snake23/p/9635822.html 引擎的介绍
primarykey 主键 PERIMARY KEY
foreign key 外键 FOREIGN KEY
references 连接 REFERENCES
auto increment 自动增长 AUTO_INCREMENTY
uniquekey 唯一约束 UNIQUE KEY
unsigned 无负数 (无符号) 2倍int UNSIGNED
一般情况下 int【-127->128】 加 UNSIGNED 变为 INT【0-255】
default 默认值 DEFAULT
create table abc(
id int(10) NOT NULL AOTO_INCREMENT PRIMARY KEY,
username VARCHAR(10) NOT NULL UNIQUE KEY,
password VARCHAR(10) NOT NULL UNIQUE KEY,
sex TINYINT(5) NOT NULL DEFAULT ‘0‘,
);
成功后————————》
CREATE TABLE `abc` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(10) NOT NULL,
`password` varchar(10) NOT NULL,
`sex` tinyint(3) NOT NULL DEFAULT ‘0‘,
PRIMARY KEY (`id`),
UNIQUE KEY `username` (`username`),
UNIQUE KEY `password` (`password`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
INSERT INTO abc(id,username,password,sex) values(1,‘aaa‘,‘123‘,0);
SELECT * FROM abc ;
SELECT id,username,password,sex FORM abc;
UPDATE abc set username=‘ccc‘ WHERE id=1;
DELETE FROM abc WHERE id=1;
DROP TABLE abc;
//添加单列
ALTER TABLE ABC ADD age int(10) NOT NULL //添加列
//添加多列
ALTER TABLE ABC ADD (hobby varchar(10) NOT NULL,kp varchar(10) NOT NULL) //添加列
//添加 默认 约束
ALTER TABLE ABC ADD age TINYINT DEFAULT 0;
//设置修改 默认值 约束
ALTER TABLE ABC alter age set default 15;
//删除 默认 约束
ALTER TABLE ABC alter age DROP default;
//删除主键约束
ALTER TABLE ABC DROP PRIMARY KEY;
//删除唯一约束
ALTER TABLE ABC DROP UNIQUE ;
//删除外键约束
ALTER TABLE ABC DROP FOREIGN KEY;
//修改该 字段的定义
ALTER TABLE ABC MODIFY id int(5) NOT NULL SET DEFAULT 1;
//修改该 字段的名字
ALTER TABLE ABC CHANGE id pid int(5);
IF NOT EXISTS
-查询没有选修102号课程的学生的学生和姓名
select SNO,SNAME from Stu where not exists(
select *from SCORE where(Stu.SNO=SNO and CNO=‘102‘)
)
--查询选修了所有课程的学生的学号和姓名
select SNO,SNAME from Stu where not exists(
select * from C where not exists(
select * from SCORE where SNO=Stu.SNO and C.CNO=CNO)
)
mysql数据库,当且仅当引擎是InnoDB,才支持【事务】;
//设置mysql的隔离级别:形式为:set session transaction isolation level 设置事务隔离级别
查 级别语句 show variables like ‘transaction_isolation‘; repeatable-read (默认的)
//设置read uncommitted级别:
set session transaction isolation level read uncommitted;
读尚未提交的数据 不能解决(脏读,幻读,不可重复度)
//设置read committed级别:
set session transaction isolation level read committed;
读已提交的数据 解决(脏读)
//设置repeatable read级别:
set session transaction isolation level repeatable read;
可重复读 解决(脏读不可重复度)
//设置serializable级别:
set session transaction isolation level serializable;
串行化 数据 解了(脏读,幻读,不可重复度)
MySQL大致可归纳为以下【3种锁】:
表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。
行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般
【加锁】
MyISAM在执行查询语句(SELECT)前,会自动给涉及的所有表加读锁,在执行更新操作(UPDATE、DELETE、INSERT等)前,
会自动给涉及的表加写锁,这个过程并不需要用户干预,因此用户一般不需要直接用LOCK TABLE命令给MyISAM表显式加锁
【加锁】
给MyISAM表显式加锁,一般是为了一定程度模拟事务操作,实现对某一时间点多个表的一致性读取。
【例如】,有一个订单表orders,其中记录有订单的总金额total,同时还有一个订单明细表order_detail,其中记录有订单每一产品的金额小计subtotal,假设我们需要检查这两个表的金额合计是否相等,可能就需要执行如下两条SQL:
1
SELECT SUM(total) FROM orders;
2
SELECT SUM(subtotal) FROM order_detail;
这时,如果不先给这两个表加锁,就可能产生错误的结果,因为第一条语句执行过程中,order_detail表可能已经发生了改变。因此,正确的方法应该是:
1
LOCK tables orders read local,order_detail read local;
2
SELECT SUM(total) FROM orders;
3
SELECT SUM(subtotal) FROM order_detail;
4
Unlock tables;