1、创建表
create table user(name varchar(10),age int(2),date DATE);
2、查看表的结构信息
desc user
查看表结构(详细)
show create table user;
3、删除表
drop table user;
4、修改相关
修改字段属性(modify)
alter table 表名 modify column 字段名 类型。
例如
alter table task_info modify column price float(8,2);
新增字段(add)
alter table user add column new_column varchar(10);
删除字段(drop)
alter table user drop column age;
字段改名(change)
alter table user change age age1 int;
修改表名(rename)
alter table user rename user1;
MySQL事务的锁是行锁。例如,当一个事务对一个表的某一行进行修改时,MySQL会对该行进行排他锁定,其他事务不能对该行进行读取和修改。而其他行则可以被其他事务同时读取和修改,不会被该事务锁定。这就表明MySQL事务锁是行锁,而不是表锁。
事务必须满足四个条件:持久性、隔离性、一致性、原子性
1、持久性
事务处理结束后,对数据的修改是永久的
,不会因为系统故障导致丢失。
2、隔离性
并发事务同时对其数据进行读写和修改时,不会互相影响
默认隔离级别是:可重复读
隔离级别分为:
**读未提交(**Read Uncommitted):是最低的隔离级别,允许一个事务读取并使用另一个事务尚未提交的修改。因此,在该级别下可能会发生脏读问题。
读已提交(Read Committed):一个事务只能读取到已经提交的其他事务所修改过的数据。因此,该级别解决了脏读问题。
可重复读(Repeatable Read):一个事务在执行期间多次读取同一行数据,将得到相同的结果。因此,在该级别下解决了不可重复读问题。
串行化(Serializable):串行化是最高的隔离级别,它强制事务串行执行,避免了脏读、不可重复读(多次读取同一数据时,得到的结果不一致)和幻读等问题。在该级别下,MySQL会对所有读取的数据行都加共享锁或排他锁,直到事务结束。
3、一致性
这是事务的最终目的,事务的前后数据的完整性必须保持一致,事务必须是使数据库从一个正常状态转换为另一个正常状态。
一致性体现在两个层面:
(1)数据库机制层面
数据库层面的一致性是,在一个事务执行之前和之后,数据会符合你设置的约束(唯一约束,外键约束,Check约束等)和触发器设置。比如:A有90,向B转了100,这时A的账户余额就是负数,而金额的字段设置了unsigned(即非负数),这时数据库就会报错,违反了非负约束的一致性。
(2)业务层面
于业务层面来说,一致性是保持业务的一致性。比如:A有100,B有0,A向B转了100,这时AB的账户之和还得是100。如果不是就违反了业务逻辑的一致性。再比如扣了2块手续费,B只收到了98,那么业务上就必须处理考虑手续费的这2块,不然也就违反了业务的一致性。
4、原子性
一个事务(transaction)中的所有操作要么全部完成,要么全部不完成
。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有被执行过一样。
begin或start transaction,提交commit,回滚rollback。
在事务中插入多条数据,并成功提交事务
START TRANSACTION;
-- 插入数据到表A
INSERT INTO table_A (column1, column2) VALUES ('value1', 'value2');
INSERT INTO table_A (column1, column2) VALUES ('value3', 'value4');
-- 插入数据到表B
INSERT INTO table_B (column1, column2) VALUES ('value5', 'value6');
INSERT INTO table_B (column1, column2) VALUES ('value7', 'value8');
-- 提交事务
COMMIT;
假设我们有一个银行账户表(accounts
),我们想要在一个事务中转账操作,但如果余额不足,则触发回滚:
START TRANSACTION;
-- 获取账户 A 的余额
SELECT balance INTO @balance FROM accounts WHERE account_id = 'A';
-- 判断余额是否足够
IF @balance >= 100 THEN
-- 扣除账户 A 的金额
UPDATE accounts SET balance = balance - 100 WHERE account_id = 'A';
-- 增加账户 B 的金额
UPDATE accounts SET balance = balance + 100 WHERE account_id = 'B';
-- 其他操作...
COMMIT;
ELSE
-- 回滚事务
ROLLBACK;
END IF;
基于表之间的隐含列名相等关系进行连接,不需要显式指定连接条件,且消除重复的列
SELECT * FROM USER NATURAL JOIN user2
在自然连接基础上添加一个on 做等值条件,只要匹配的记录,不会删除重复的字段
SELECT * FROM USER INNER JOIN user2 ON USER.name = user2.name
不等值连接,即使用不等号!=,将name不等的筛选出来
会对被连接的两张表做笛卡尔运算
SELECT * FROM USER INNER JOIN user2 ON USER.NAME != user2.NAME
左外连接会保留左表的全部记录,相当于在左表的基础上加上右表中满足ON条件的数据,剩余的空位以NULL填充
SELECT * FROM USER LEFT JOIN user2 ON USER.NAME = user2.NAME
右外连接会保留右表的全部记录,相当于在右表的基础上加上左表中满足ON条件的数据,剩余的空位以NULL填充
SELECT * FROM USER RIGHT JOIN user2 ON USER.NAME = user2.NAME
全外连接是左外连接和右外连接结果的并集。也可以把全外连接理解为在内连接基础上,把左表和右表中未被匹配的记录分别添加进来
注意,MySQL是没有FULL JOIN的,但是可以用UNION左外连右外连实现全外连接
(SELECT * FROM USER LEFT JOIN user2 ON USER.NAME = user2.NAME) UNION (SELECT * FROM USER RIGHT JOIN user2 ON USER.NAME = user2.NAME)
不加连接条件,左表的每一个记录对应右表的全部记录,行数 = A的行数*B的行数
SELECT * FROM user,user2
或者
SELECT * FROM user CROSS JOIN user2
或者
SELECT * FROM user INNER JOIN user2
-- 当使用内连接(INNER JOIN)而没有指定连接条件时,它将被解释为笛卡尔积连接。