数据库
首页 > 数据库> > Msql基础:SQL语言语法

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.列名称;

外连接: 用于查询一个表中有,另外一个表中没有的数据

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语句
查询按结果集的行列数不同可分为:

子查询可能出现的位置:

  1. select后:标量子查询
  2. from后:表子查询
  3. where/having后:标量子查询、列子查询、行子查询
  4. exists后:表子查询

(七) 分页查询

语法:

limit offset,size;

含义:

(八) union联合查询

查询语句1 union 查询语句2;

注意:

  1. 查询的列数需要一致,否则会报错
  2. 当列名不一致时,将使用第一条语句的列名
  3. 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区别:

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不受时区影响
在这里插入图片描述

(四) 常见约束

六大约束类型

  1. 非空约束: not null
  2. 默认约束: default
  3. 主键: primary key
  4. 唯一约束: unique (可以为空)
  5. 检查约束: check (注: 但是Mysql没有效果)
  6. 外键: foreign 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],
     ... ,
     列名 列的类型[类型 约束]);

注意:

四、TCL(Transaction controller)事务控制语言

事务: 一组sql语句要么全部成功要么全部失败

事务的创建:
隐式事务:比如insert、update、delete语句
显示事务:必须先设置自动提交功能为禁用
显示事务步骤如下:

# 步骤一: 开启事物
set autocommit=0;
start transaction;

# 步骤二: 编写sql语句
sql语句1;
sql语句2;
...

# 步骤三: 结束事物
commit; -- 提交事物
rollback; -- 回滚事物

事务的隔离级别:

SQL 标准定义了四种隔离级别,MySQL 全都支持(默认为REPEATABLE READ)。这四种隔离级别分别是:

相关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