Msql基础:SQL语言语法
作者:互联网
SQL语言语法
SQL语言分类
可分为以下几种:
DQL(Data query language)
DML(Data manage language)
DDL(Data define language)
TCL(Transaction controller language)
接下来将分别介绍
一、DQL(Data query language)数据查询语言
(一) 基础查询
基本用法
select '1'; -- 查询常量
select 1+1; -- 查询表达式
select version(); -- 查询方法
select * from 表名称; -- 查表
select t.* from 表名称 as t; -- 查表使用别名
select distinct 列名称 from 表名称 -- 使用distinct去重
注意事项: 表达式 + 与Java中的有所不同
对于 字符串+数值 如果字符串能强转为数值,将为数值相加结果;如果不能强转,则只显示数值
如下:
SELECT ‘abc’ + 2;
SELECT ‘1’ + 2;
对于 字符串/数值+null 则都为null
如下:
SELECT 1 + NULL;
(二) 条件查询
条件表达式、逻辑表达式
模糊查询 like(通配符_任意单个 和%任意多个)、 between and 、 in
判断 null 不能用 = 或 <> 需要用 is null 或 安全等于 <=>
(三) 排序查询
order by
SQL常见函数
字符函数: concat\length\upper\lower\substr\instr\trim\lpad、rpad(向左向右填充指定字符)\replace
数学函数:round(四舍五入)\ceil\floor\truncate(截断)\mod
日期函数:now\curdate\curtime\year\str_to_data\data_to_str等
其他:version\database\user
流程控制:if(compare,var1,var2)/switch语句(case when then end)
分组函数:sum/avg/max/min/count
(四) 分组查询
group by
分组前筛选where 分组后筛选having
(五) 多表查询
可分为:内连接、外连接、交叉连接
多表查询有SQL92标准和SQL98标准,SQL92语法只有内连接
SQL92语法
内连接: 等值连接、非等值连接、自连接
select 表1名称.列名称, 表2名称.列名称 from 表1名称,表2名称 where 表1名称.列名称 = 表2名称.列名称;
select 表1名称.列名称, 表2名称.列名称 from 表1名称,表2名称 where 表1名称.列名称 between 表2名称.列名称 and 表2名称.列名称;
select m.列名称, n.列名称 from 表1名称 m,表1名称 n where m.列名称 = n.列名称;
SQL99语法
内连接: 等值连接、非等值连接、自连接
select 表1名称.列名称, 表2名称.列名称 from 表1名称 inner join 表2名称 on 表1名称.列名称 = 表2名称.列名称;
select 表1名称.列名称, 表2名称.列名称 from 表1名称 inner join 表2名称 on 表1名称.列名称 between 表2名称.列名称 and 表2名称.列名称;
select m.列名称, n.列名称 from 表1名称 m inner join 表1名称 n on m.列名称 = n.列名称;
外连接: 用于查询一个表中有,另外一个表中没有的数据
- 特点:如果表中没有和他匹配的,则显示匹配的值;如果没有则显示为null
- 外连接结果 = 内连接 + 主表中有而从表中没有的数据
- 左外:left join 左边的是主表
- 右外:right join 右边的是主表
- 全外连接:full join 内连接结果+表1有但表2没有+表2有但表1没有
例子如下:
select 表1名称.列名称, 表2名称.列名称 from 表1名称 left join 表2名称 on 表1名称.列名称 = 表2名称.列名称;
select 表1名称.列名称, 表2名称.列名称 from 表1名称 right join 表2名称 on 表1名称.列名称 = 表2名称.列名称;
select 表1名称.列名称, 表2名称.列名称 from 表1名称 full join 表2名称 on 表1名称.列名称 = 表2名称.列名称;
交叉连接: 做笛卡尔乘积
select 表1名称.列名称, 表2名称.列名称 from 表1名称 cross join 表2名称;
多表查询使用场景
如图:假设A、B为两张表,查询两表交互内容
(六) 子查询
定义: 出现在其他语句中的select语句
查询按结果集的行列数不同可分为:
- 标量子查询(一行一列)
- 列子查询(一列多行)
- 行子查询(一行多列)
- 表子查询(多行多列)
子查询可能出现的位置:
- select后:标量子查询
- from后:表子查询
- where/having后:标量子查询、列子查询、行子查询
- exists后:表子查询
(七) 分页查询
语法:
limit offset,size;
含义:
- offset:起始索引(从0开始)
- size:条目个数
(八) union联合查询
查询语句1 union 查询语句2;
注意:
- 查询的列数需要一致,否则会报错
- 当列名不一致时,将使用第一条语句的列名
- union查询会自动去重(不需要去重可使用 union all)
二、DML(Data manage language)数据操作语言
分为:插入:insert 、修改:update 、删除:delete
(一) 插入语句
语法:
insert into 表名(列名, ...) values(值, ...); -- 方式一
insert into 表名 set 列名=值, 列名=值, ...; -- 方式二
两种方式比较:
1 方式一支持插入多行,方式二不支持,语法如下:
insert into 表名(列名, ...) values(值1, ...),(值2, ...);
2 方式一支持子查询,方式二不支持, 语法如下:
insert into 表名1(列名, ...) (select 列名, ... from 表名2);
(二) 修改语句
语法:
1 更新单表
update 表名 set 列=新值, ... where 条件;
2 更新多表
update 表1 别名, 表2 别名 set 列=值, ... where 连接条件 and 筛选条件; -- sql92语法
update 表1 别名 inner/left/right join 表2 别名 on 连接条件 set 列=值, ... where 筛选条件; -- sql99语法
(三) 删除语句
语法:
1 单表删除
delete from 表名 where 筛选条件; -- 单表删除
truncate table 表名; -- 整张表记录都删除
delete和truncate区别:
- truncate会删除所有记录不能筛选
- truncate效率高点
- truncate没有返回值而delete有返回值
- truncate删除后自增长列从1开始,而delete从断点开始
- truncate删除不能回滚,delete删除可以回滚
2 多表删除
delete 表1的别名, 表2的别名 from 表1 别名, 表2 别名 where 连接条件 and 筛选条件; -- sql92语法
delete 表1的别名, 表2的别名 from 表1 别名 inner/left/right join 表2 别名 on 连接条件 where 筛选条件; -- sql99语法
三、DDL(Data define language)数据定义语言
用于库和表的管理:
- 库的管理(创建、修改、删除)
- 表的管理(创建、修改、删除)
(一) 库的管理
创建
create database [if not exists] 库名;
修改
rename database 库名 to 新库名;
alter database 库名 character set gbk; -- 更改库的字符集
删除
drop database [if exists] 库名;
(二) 表的管理
创建
create table 表名(
列名 列的类型[类型 约束],
... ,
列名 列的类型[类型 约束]);
修改
alter table 表名 change column 列名 新列名 [类型 约束]; -- 修改列名
alter table 表名 modify column 列名 [类型 新约束]; -- 修改约束
alter table 表名 add column 列名 [类型 约束]; -- 新增列
alter table 表名 drop column 列名; -- 删除列
alter table 表名 rename to 新表名; -- 修改表名
删除
drop table [if exists] 表名;
复制
create table 新表 like 表; -- 复制表的结构
create table 新表 select * from 表; -- 复制表的结构和数据
create table 新表 select * from 表 where 条件; -- 复制表的结构和部分数据
create table 新表 select 列1, 列2, ... from 表 where 1=2; -- 复制表某些字段并且不复制数据
(三) Mysql中数据类型介绍
数值型
注意: 对于decimal m默认为10,d默认为0
字符型
字符串类型有:CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET
注意: char固定长度,varchar可变长度
日期型
注意: datatime受时区影响,timestamp不受时区影响
(四) 常见约束
六大约束类型
- 非空约束: not null
- 默认约束: default
- 主键: primary key
- 唯一约束: unique (可以为空)
- 检查约束: check (注: 但是Mysql没有效果)
- 外键: foreign key (用于限制两张表的关系,用于保证该字段的值必须来自于主表的关联列的值)
约束可分为
- 表级约束: 对多个数据列建立的约束,称为表级约束表级约束只能在列定义后声明
- 列级约束: 对一个数据列建立的约束,称为列级约束列级约束既可以在列定义时声明,也可以在列定义后声明
注: 六大约束都可在列级约束使用,但外键无效果(外键是约束两个表之间的关系)
显而易见,非空和默认不可在表级约束中使用
主键和唯一的大对比:
是否保证唯一性 | 是否允许为空 | 是否可以有多个 | 是否允许组合 | |
---|---|---|---|---|
主键 | 是 | 否 | 否,至多一个 | 是,但不推荐 |
唯一 | 是 | 是 | 是 | 是,但不推荐 |
外键使用的注意点:
- 要求在从表设置外键关系
- 要求关联的类型一致或兼容
- 主表关联的列必须是一个key
- 数据插入和删除时,先插主表数据再插从表,先删从表再删主表
查看表结构语句:
desc 表名; -- 查看表结构
show index from 表名; -- 查看主键、外键、唯一
新增表时添加约束语法:
CREATE TABLE students (
#添加表级约束,直接在类型后添加即可
id INT PRIMARY KEY,
student_name VARCHAR ( 20 ),
sex CHAR ( 1 ),
age INT DEFAULT 18,
majorid INT,
#添加表级约束,直接添加在列创建结束后
CONSTRAINT pk PRIMARY KEY ( id ), #主键,constraint用来命名,不加也可以
CONSTRAINT fk_student_majory FOREIGN KEY ( majorid ) REFERENCES major ( id ) #外键
);
constraint 约束名 约束类型(字段名) -- 表级约束通用语法
修改和删除约束语法:
alter table 表名 modify column 列名 [类型 新约束]; -- 修改列级约束
alter table 表名 add 新约束(列名); -- 修改表级约束
alter table 表名 modify column 列名 [类型]; -- 删除列级约束
alter table 表名 drop 约束; -- 删除表级约束
(五) 标识列
又称为自增长列
语法:
create table 表名(
列名 列的类型[类型 key类型 auto_increment],
... ,
列名 列的类型[类型 约束]);
注意:
- auto_increment必须与有key(包括primary key、unique等)的列相关联
- 一张表只能有一个auto_increment
- 标识列只能是数值型
- 可以通过 set auto_increment_increment=3; 设置步长
四、TCL(Transaction controller)事务控制语言
事务: 一组sql语句要么全部成功要么全部失败
事务的创建:
隐式事务:比如insert、update、delete语句
显示事务:必须先设置自动提交功能为禁用
显示事务步骤如下:
# 步骤一: 开启事物
set autocommit=0;
start transaction;
# 步骤二: 编写sql语句
sql语句1;
sql语句2;
...
# 步骤三: 结束事物
commit; -- 提交事物
rollback; -- 回滚事物
事务的隔离级别:
- 脏读: 脏读指的是读到了其他事务未提交的数据,未提交意味着这些数据可能会回滚,也就是可能最终不会存到数据库中,也就是不存在的数据。读到了并一定最终存在的数据,这就是脏读。
- 可重复读: 可重复读指的是在一个事务内,最开始读到的数据和事务结束前的任意时刻读到的同一批数据都是一致的。通常针对数据更新(UPDATE)操作。
- 不可重复读: 对比可重复读,不可重复读指的是在同一事务内,不同的时刻读到的同一批数据可能是不一样的,可能会受到其他事务的影响,比如其他事务改了这批数据并提交了。通常针对数据更新(UPDATE)操作。
- 幻读: 幻读是针对数据插入(INSERT)操作来说的。假设事务A对某些行的内容作了更改,但是还未提交,此时事务B插入了与事务A更改前的记录相同的记录行,并且在事务A提交之前先提交了,而这时,在事务A中查询,会发现好像刚刚的更改对于某些数据未起作用,但其实是事务B刚插入进来的,让用户感觉很魔幻,感觉出现了幻觉,这就叫幻读。
SQL 标准定义了四种隔离级别,MySQL 全都支持(默认为REPEATABLE READ)。这四种隔离级别分别是:
- 读未提交(READ UNCOMMITTED):会出现脏读、不可重复读、幻读
- 读提交 (READ COMMITTED):会出现不可重复读、幻读
- 可重复读 (REPEATABLE READ):会出现幻读
- 串行化 (SERIALIZABLE):上面的情况都不会出现
相关SQL:
select @@tx_isolation; -- 查看当前连接的事务隔离级别
set session transaction isolation level 隔离类型; -- 修改当前连接的事务隔离级别
set global transaction isolation level 隔离类型; -- 修改全局的事务隔离级别
保存点savapoint的使用:
set autocommit=0;
start transaction;
sql语句1;
savepoint a; -- 设置保存点
sql语句2;
rollback to a; -- 回滚到保存点
ps: delete和truncate在事务中的使用
delete支持回滚而truncate不支持回滚
标签:约束,--,表名,Msql,语法,名称,SQL,查询,select 来源: https://blog.csdn.net/weixin_45702700/article/details/114379810