可分为以下几种:
DQL(Data query language)
DML(Data manage language)
DDL(Data define language)
TCL(Transaction controller 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 或 安全等于 <=>
select * from 表名 like 条件;
select * from 表名 where 列名 between 值 and 值;
select * from 表名 where 列名 is null;
select * from 表名 where 列名 <=> null;
order by
select * from 表名 order by 列名;
字符函数: 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
select * from 表名 where 条件 group by 列名 having 条件;
可分为:内连接、外连接、交叉连接
多表查询有SQL92标准和SQL98标准,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.列名称;
内连接: 等值连接、非等值连接、自连接
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名称;
定义: 出现在其他语句中的select语句
查询按结果集的行列数不同可分为:
子查询可能出现的位置:
语法:
select * from 表名 limit offset,size;
含义:
查询语句1 union 查询语句2;
注意:
分为:插入: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语法
用于库和表的管理:
创建
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; -- 复制表某些字段并且不复制数据
数值型
字符型
字符串类型有:CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET
注意: char固定长度,varchar可变长度
日期型
注意: datatime受时区影响,timestamp不受时区影响
六大约束类型
约束可分为
注: 六大约束都可在列级约束使用,但外键无效果(外键是约束两个表之间的关系)
显而易见,非空和默认不可在表级约束中使用
主键和唯一的大对比:
是否保证唯一性 | 是否允许为空 | 是否可以有多个 | 是否允许组合 | |
---|---|---|---|---|
主键 | 是 | 否 | 否,至多一个 | 是,但不推荐 |
唯一 | 是 | 是 | 是 | 是,但不推荐 |
外键使用的注意点:
查看表结构语句:
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],
... ,
列名 列的类型[类型 约束]);
注意:
事务: 一组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不支持回滚