SQL语法(二)

171 阅读6分钟

单表操作

1,排序

语法结构

SELECT 字段名 FROM 表名 [WHERE 字段 = 值] ORDER BY 字段名 [ASC / DESC]

同时对多个字段进行排序,可以为 字段名1 ASC/DESC,字段名2 ASC/DESC...的方式进行排序

2,聚合函数

语法结构

SELECT 聚合函数(字段名) FROM 表名;
聚合函数作用
count(字段名)统计指定列不为NULL的记录行数
sum(字段名)计算指定列的数值和
max(字段名)计算指定列的最大值
min(字段名)计算指定列的最小值
avg(字段名)计算指定列的平均值

3,分组查询

语法结构

SELECT 分组字段/聚合函数 FROM 表名 GROUP BY 分组字段 [HAVING 条件];

having关键字是对分组后的数据进行过滤时使用

where和having的区别

过滤方式特点
where进行分组前的过滤;后面不能写聚合函数
having进行分组后的过滤;后面可以写聚合函数

4,limit关键字

作用:限制返回的查询结果的行数

语法结构

SELECT 字段1,字段2... FROM 表名 LIMIT offset , length;

offset:起始行数;length:返回的行数

约束

作用:对表中的数据进行进一步的限制,从而保证数据的正确性、有效性、完整性. 违反约束的 不正确数据,将无法插入到表中

分类:

约束名约束关键字
主键约束primary key
唯一约束unique
非空约束not null
外键约束foreign key
  1. 主键约束

特点:不可重复 唯一 非空

作用:用来表示数据库中的每一条记录

添加主键约束

语法结构

字段名 字段类型 primary key

三种方式创建主键约束

方式1 创建一个带主键的表 
CREATE TABLE emp2(
    -- 设置主键 唯一 非空 
    eid INT PRIMARY KEY, 
    ename VARCHAR(20),
    sex CHAR(1)
);

方式2 创建一个带主键的表
CREATE TABLE emp2(
    eid INT ,
    ename VARCHAR(20),
    sex CHAR(1),
    -- 指定主键为 eid字段 
    PRIMARY KEY(eid)
);

方式3 创建一个带主键的表 
CREATE TABLE emp2(
    eid INT ,
    ename VARCHAR(20),
    sex CHAR(1)
)
-- 创建的时候不指定主键,然后通过 DDL语句进行设置 
ALTER TABLE emp2 ADD PRIMARY KEY(eid);

主键自增关键字:AUTO_INCREMENT,自增的主键只能是int类型的

修改主键自增的起始值,语法:

-- 创建主键自增的表,自定义自增其实值
CREATE TABLE emp2(
    eid INT PRIMARY KEY AUTO_INCREMENT,
    ename VARCHAR(20),
    sex CHAR(1)
)AUTO_INCREMENT=100;

DELETE和TRUNCATE对自增长的影响

清空表数据的方式特点
DELETE只是删除表中所有数据,对自增没有影响
TRUNCATE将整个表删除掉,然后创建一个新的表 自增的主键,重新从 1开始
  1. 非空约束(某一列不能为空)

语法结构

字段名 字段类型 not null

3. 唯一约束(表中的某一列的值不能重复( 对null不做唯一的判断 ))

语法结构

字段名 字段类型 unique

数据库事务

定义:事务是一个整体,由一条或者多条SQL语句组成,这些SQL语句要么都执行成功,要么都执行失败, 只要有一条SQL出现异常,整个操作就会回滚,整个业务执行失败

  1. 手动提交事务

语法格式

功能语句
开启事务start transaction; 或者 BEGIN;
提交事务commit;
回滚事务rollback;

START TRANSACTION

这个语句显式地标记一个事务的起始点。

COMMIT

表示提交事务,即提交事务的所有操作,具体地说,就是将事务中所有对数据库的更新都写到磁盘上的物理数据库中,事务正常结束。

ROLLBACK

表示撤销事务,即在事务运行的过程中发生了某种故障,事务不能继续执行,系统将事务中对数据库的所有已完成的操作全部撤销,回滚到事务开始时的状态

执行流程

执行成功的情况: 开启事务 -> 执行多条 SQL 语句 -> 成功提交事务
执行失败的情况: 开启事务 -> 执行多条 SQL 语句 -> 事务的回滚

2. 自动提交事务

MySQL 默认每一条 DML(增删改)语句都是一个单独的事务,每条语句都会自动开启一个事务,语句执行完毕自动提交事务,MySQL默认开始自动提交事务。
语句含义
SHOW VARIABLES LIKE 'autocommit';查看autocommit状态
SET @@autocommit=off设置autocommit为关闭(关闭自动提交事务)
  1. 事务的四大特性
特性含义
原子性每个事务都是一个整体,不可再拆分,事务中所有的SQL语句要么都执行成功, 要么都失败。
一致性事务在执行前数据库的状态与执行后数据库的状态保持一致。如:转账前2个人的 总金额是2000,转账后2个人总金额也是2000.
隔离性事务与事务之间不应该相互影响,执行时保持隔离的状态.
持久性一旦事务执行成功,对数据库的修改是持久的。就算关机,数据也是要保存下来的.
  1. 事务的隔离级别

    • 数据并发访问

      一个数据库可能拥有多个访问客户端,这些客户端都可以并发方式访问数据库. 数据库的相同数据可能被多个事务同时访问,如果不采取隔离措施,就会导致各种问题, 破坏数据的完整性

    • 并发访问会产生的问题

      事务在操作时的理想状态: 所有的事务之间保持隔离,互不影响。因为并发操作,多个用户同时访问同 一个数据。可能引发并发访问的问题

      并发访问问题说明
      脏读一个事务中读取到了另一个事务中尚未提交的数据
      不可重复读一个事务中两次读取到的数据内容不一致,要求的实在一个事务中多次读取的数据是一致的(进行update引发的问题)
      幻读一个事务中某一次select操作得到的结果所表征的数据状态,无法支撑后续的业务操作,查询得到的数据状态不准确,导致幻读
    • 四种隔离级别

      级别会出现的问题
      read uncommitted(读未提交)脏读、幻读、不可重复读
      read committed(读已提交)幻读、不可重复读
      repeatable read(可重复读)幻读
      serializable(串行化)没问题

      隔离级别命令

      命令含义
      select @@tx_isolation;查看隔离级别
      set global transaction isolation level 级别名称;设置隔离级别

      mysql默认隔离级别是repeatable read,可避免脏读和不可重复读,但避免不了幻读

      serializable 串行化可以彻底解决幻读,但是 事务只能排队执行,严重影响效率, 数据库不会使 用这种隔离级别