DQL(Data Query Language):数据查询语言 关键词:SELECT
DML(Data Manipulate Language):数据操作语言关键词:INSERT 、UPDATE、DELETE
DDL(Data Define Languge):数据定义语言关键词:CREAT、DROP、ALTER
TCL(Transaction Control Language):事务控制语言 关键词:COMMIT、ROLLBACK
函数分为单行函数和分组函数,单行函数多用作处理数据,组函数用来做统计使用
trim() 去除首尾的空格
trim('a' from 'str') 去除str首尾的'a'
ltrim 去左边空格
rtrim 去右边空格
replace 替换
lpad 左填充
lpad('a',10,'*') 效果:*********a
lpad('abcd',2,'*') 效果:ab 超过会从右边截断
rpad 右填充
instr 返回子串在父串的起始索引,索引从1开始
length 获取字节个数
Round(a,2) 保留2位小数后面的四舍五入
在Java中 负数是五舍六入
rand 随机数,随机产生0(包括0)到1(不包括1)直接的随机数
floor 向下取整 返回小于等于该参数的最大整数
ceil 向上取整 返回大于等于该参数的最小整数
mod 取余,正负号取决于分子 mod(a,b)=a-a/b*b
truncate截断
truncate(1.66,1) 结果:1.6 第二个参数表示的是小数点后几位,直接截取
if(boolean,'值1','值2') 和Java中的三元运算符一样的用法
case语句 处理多分支
case语句分为两种情况
#处理等值判断
case [要判断的字段或者表达式]
when [常量] then [要显示的值或者语句]
when [常量] then [要显示的值或者语句]
else [……]
……
end
#处理条件判断
case
when 条件 then [要显示的值或者语句]
when 条件2 then [要显示的值或者语句]
else [要显示的值或者语句]
end
特点:
SELECT
[列名|常量|表达式|函数]
FROM
[表名] ;
根据条件过滤原始表的数据,查询到想要的数据
SELECT
[列名|常量|表达式|函数]
FROM
[表名]
WHERE
[筛选条件] ;
条件运算符:>、<、>=、<=、=、!=、<>、<=>
<=>:安全等于 当NULL<=>NULL 时会返回TRUE
逻辑运算符: and,or,not,这三个分别等价于Java中的(&&,||,!)MySQL也支持这种写法
SELECT
[列名|常量|表达式|函数]
FROM
[表名]
WHERE
[列名|常量|表达式|函数] LIKE '%a%'
[列名|常量|表达式|函数] IN ('','','')
[列名|常量|表达式|函数] BETWEEN A AND B
[列名|常量|表达式|函数] IS NULL
[列名|常量|表达式|函数] IS NOT NULL
LIKE中用到的%叫做通配符
%:任意多个字符
_:任意单个字符
SELECT
[列名|常量|表达式|函数]
FROM
[表名]
WHERE
[筛选条件]
ORDER BY
[列名|常量|表达式|函数] [ASC|DESC]
默认是升序(ASC)
首先我们先说上面提到的分组函数,发现都是对一组或者说是大量的数据做统计操作,而分组函数默认是把查询的整张表作为一个组,所以最后的结果只有一行,而分组查询就是把查询的表通过条件割裂成不同的组,这样就可以得到不同组的统计结果。查询结果也就是多行了。也就可以理解为什么常说,分组函数后面出现的字段,必须也出现在分组查询的分组条件中,只有这样才可以保证查询结果的行数是一致的。
SELECT
[查询的字段|分组函数]
FROM
[表名]
WHERE
[筛选条件]
GROUP BY
[以哪个字段作为分组,多个字段分组,字段间以逗号分隔]
HAVING
[筛选条件]
其中WHERE关键字是对分组前的表进行筛选操作,分组后相当于是生成了一张新的表,而HAVING关键字则是对分组后的结果集进行删选,两者用法一样,只是针对的表不同。
连接查询分为SQL92语法和SQL99语法,这里只介绍SQL99
连接查询分为
外连接,外连接的场景其实是等值连接的一种特殊需求,我们把等值连接的两张表分为主表和附表,首先等值连接只会显示主表和附表中满足连接条件的数据,而外连接则是在等值连接的基础上,要求显示出主表的所有数据,包括不满足连接条件的。而左外连接和右外连接只是一个相对的概念。左外连接 LEFT JOIN的左边是主表,RIGHT JOIN的右边是主表
交叉连接的结果就是笛卡尔积
自连接只是一个概念上的说法,它的唯一特别之处就是连接的两张表是同一张表
SELECT
[列名|常量|表达式|函数]
FROM
表1
[INNER|LEFT|RIGHT|CROSS] JOIN
表2
ON
连接条件
注意如果SELECT中要查询的字段两个表中都有,则需要指定是哪一个表中的这个字段,语法是表名.列名。这时候我们可能需要别名,可以给表名,字段名起别名。
SELECT
[列名] AS [别名]
FROM
[表名] AS [别名]
一条查询语句中又嵌套了另一条完整的SELECT语句,其中被嵌套的SELECT语句,称为子查询或内查询,在外面的查询语句,称为主查询或外查询。其实简单点来说,就是将一个查询结果又作为另一个查询的数据来源或者查询条件,而根据子查询的查询结果(几行几列)又将子查询分为了下面几种
SELECT
*
FROM
employees
WHERE
( employes_id,salary)=(
SELECT
MIN(employee_id),MAX(salary)
FROM
employees
)
表子查询(多行多列)
表子查询顾名思义,将查询结果作为一个新的表,作为主查询的数据来源
相关子查询
子查询放在exists关键字后面就是相关子查询,exists的返回值是boolean,exists后面通常跟了一个关联检索,用来返回满足关联条件或不满足(no exists)的数据,有数据就返回true,否则false,但这个false和true实际是用来控制主查询的该条数据是否作为查询结果,exists可以完成的功能in都可以完成,但是涉及效率问题,这个后面单独讲。
分页,大家都懂
SELECT
[列名|常量|表达式|函数]
FROM
表名
LIMIT
[起始的条目索引,条目数];
条目数的意思是一页有多少条数据。
注意:
将多条查询语句合并成一个查询结果
查询语句1
UNION
查询语句2
应用场景:结果来自多个表,并且这些表之间没有直接的连接关系,但查询的信息是一致的时候。
检索要求:查询的列数一样,类型和顺序一致
UNION默认去重,UNION ALL 可以包含重复项
INSERT INTO
[表名]
(列名,列名……)
VALUES
(值,值……),
(值,值……),
……,
(值,值……);
INSERT INTO
[表名]
SET
列名=值,
列名=值,
……
列名=值;
values支持同时插入多行数据,并且支持子查询,set插入只能插入一条数据。
values的列名可以不写,默认就是全部列名,并且是按照表的顺序的,值和列名必须一一对应
UPDATE
[表名]
SET
列名=值,
列名=值,
……
列名=值
WHERE
更新条件
更新的时候如果不加更新条件会更新表中的所有数据
UPDATE
表名1
[INNER|LEFT|RIGHT|CROSS] JOIN
表名2
ON
连接条件
SET
表名.字段=值,
表名.字段=值
WHERE
筛选条件
单表的删除
DELETE
FROM
表名
WHERE
筛选条件
不加筛选条件会删除表中所有的数据
级联删除,和级联更新一个原理
DELETE
表1,表2
FROM
表名1
[INNER|LEFT|RIGHT|CROSS] JOIN
表名2
ON
连接条件
WHERE
筛选条件
truncate table
表名
两种方式的区别
CREATE DATABASE
库名
DROP DATABASE
库名
修改库名会带来很多的麻烦,首先,INNODB不支持修改库名
MyISAM可以这样写,但是官方并不推荐,可能会丢失数据
RENAME DATABASE
olddbname
TO
newdbname
一般会建立一个新库,然后把旧库的数据重新导入,然后删除原来的旧库。再就是直接修改数据库对应的文件名。有一些数据库视图操作软件支持这个功能,再就是在Linux环境下使用脚本可以安全高效的完成这个操作,不做多的介绍。
[修改Mysql数据库名的方法]
[修改Mysql数据库名的方法]:https://blog.csdn.net/CSDN419135619/article/details/52774715
CREATE TABLE
[要创建的表名]
(
[列名][列的类型][长度][约束],
[列名][列的类型][长度][约束],
……
)
#仅复制结构
CREATE TABLE
[要创建的表名]
LIKE
[要复制的表名] #这是原表
#复制结构和数据
CREATE TABLE
[要创建的表名]
SELECT * FROM
[要复制的表名] #这是原表
DROP TABLE
[要删除的表名];
#修改列名
ALTER TABLE
[表名]
CHANGE COLUMN
[旧列名] [新列名] [类型];
#修改字段类型和列级约束
ALTER TABLE
[表名]
MODIFY COLUMN
[列名][类型][约束] ;
#修改表名
ALTER TABLE
[旧表名]
RENAME TO
[新表名];
#添加字段
ALTER TABLE
[表名]
ADD COLUMN
[字段名][类型] first;#这里的first表示列会添加在第一行
#删除字段
ALTER TABLE
[表名]
DROP COLUMN
[要删除的字段名];
杂项:
主键和唯一的区别
注意事项:
约束分为列级约束和表级约束,其中列级约束中不可以添加外键,表级约束中不可以添加非空和默认
列级约束在创建表的时候,在定义字段的时候直接添加,跟在字段类型的后面
表级约束
表级约束是创建表的最后面添加
CREATE TABLE
[表名](
[列名][类型][列级约束],
[列名][类型][列级约束],
CONSTRAINT [KEYNAME] [约束类型](列名)
#添加外键 其中keyName是可以不写的
CONSTRAINT [foreign_key] foreign(列名) reference 表名(列名)
)
标识列又称为自增长列,可以不用手动的插入值,系统提供默认的序列值
CREATE TABLE
[表名](
id INT PRIMARY KEY AUTO_INCREMENT
);
特点:
#每次增长3
SET auto_increment_increment=3;
含义
通过一组逻辑操作单元(一组DML语句),将数据从一种状态切换到另外一种状态,只有InnonDB支持MySQL事务,事务只支持DML,不支持DDL
事务的特点(ACID)
相关步骤
#取消自动提交事务的功能
set autocommit=0;
#开启事务
start transaction
#编写事务的一组逻辑操作单元(多条SQL语句)
INSERT/DELETE/UPDATE
#提交事务或者回滚事务
commit;
rollback;
断点可以指定事务的提交和回滚的位置
set autocommit=0;
start transaction;
SQL1;
SQL2;
savepoint p1
SQL3;
#这时候SQL1,SQL2会被提交,只有SQL3会被回滚
rollback to p1
当多个事务同时操作同一个数据库的相同数据时,会发生事务的并发问题
通过设置事务的隔离级别来避免上面的问题
set [session|global] transaction isolation level
[隔离级别名];
VIEW,是一种有结构(有行有列)但是没结果(结构中不真实存放数据)的虚拟表,虚拟表的结构来源不是自己定义,而是从对应的基表中产生(视图的数据来源)。上面有一点抽象,我来举个例子,我们在查询一张表通过各种筛选条件和分组最后得出了结果集,我们通过视图软件看这个结果集就是一张虚拟表,而我们把这张表保存起来就是视图。视图本身是没有任何数据的,他依赖于基表的数据,视图本质上保存的是检索逻辑,保存的是SQL。
CREATE VIEW
[视图名]
AS
查询语句 #这就是视图的逻辑
#方法1
CREATE OR REPLACE VIEW
[视图名]
AS
[视图逻辑]
#方法2
ALTER VIEW
[视图名]
AS
[视图逻辑]
#可以一次删除多个
DROP VIEW
[视图名],[视图名],[视图名]
视图可以给他理解成一张表,对于DQL视图和表示一样的,不过对DML视图是有条件的,视图的逻辑中包含下面的关键字不可以做DML
视图的本质就是把复杂SQL的持久化,然后方便反复使用。如果一个视图上面一个都没用到……我觉得也没必要创建视图了,所以大部分的视图可以当做是不可以修改的。
#检索视图的数据
SELECT * FROM [视图名]
#插入视图的数据
INSERT INTO [视图名](列名,列名) VALUES(值,值)
#修改视图的数据
UPDATE [视图名] SET [字段名] =[值]
#删除视图的数据
DELETE FROM [视图名]