mysql基础

mysql基础

    • Mysql
      • 简单命令
      • 事务
        • 事务满足的条件
      • 使用
        • 成功commit
        • 需要回滚
    • mysql表连接方式
        • 1、内连接
          • 自然连接
          • 等值连接
          • 不等值连接
        • 2、外连接
          • 左外连接
          • 右外连接
          • 全外连接
        • 3、交叉连接,也叫笛卡尔积

Mysql

简单命令

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。

成功commit

在事务中插入多条数据,并成功提交事务

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;

mysql表连接方式

mysql基础_第1张图片

mysql基础_第2张图片

1、内连接

自然连接

基于表之间的隐含列名相等关系进行连接,不需要显式指定连接条件,且消除重复的列

SELECT * FROM USER NATURAL JOIN user2

mysql基础_第3张图片

等值连接

在自然连接基础上添加一个on 做等值条件,只要匹配的记录,不会删除重复的字段

SELECT * FROM USER INNER JOIN user2 ON USER.name = user2.name

mysql基础_第4张图片

不等值连接

不等值连接,即使用不等号!=,将name不等的筛选出来

会对被连接的两张表做笛卡尔运算

SELECT * FROM USER INNER JOIN user2 ON USER.NAME != user2.NAME

mysql基础_第5张图片

2、外连接

左外连接

左外连接会保留左表的全部记录,相当于在左表的基础上加上右表中满足ON条件的数据,剩余的空位以NULL填充

SELECT * FROM USER LEFT JOIN user2 ON USER.NAME = user2.NAME

mysql基础_第6张图片

右外连接

右外连接会保留右表的全部记录,相当于在右表的基础上加上左表中满足ON条件的数据,剩余的空位以NULL填充

SELECT * FROM USER RIGHT JOIN user2 ON USER.NAME = user2.NAME

mysql基础_第7张图片

全外连接

全外连接是左外连接和右外连接结果的并集。也可以把全外连接理解为在内连接基础上,把左表和右表中未被匹配的记录分别添加进来

注意,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)

mysql基础_第8张图片

3、交叉连接,也叫笛卡尔积

不加连接条件,左表的每一个记录对应右表的全部记录,行数 = A的行数*B的行数

SELECT * FROM user,user2

或者

SELECT * FROM user CROSS JOIN user2

或者

SELECT * FROM user INNER JOIN user2

-- 当使用内连接(INNER JOIN)而没有指定连接条件时,它将被解释为笛卡尔积连接。

mysql基础_第9张图片

你可能感兴趣的:(mysql)