MySql 的 SQL 语句怎么写?
   
- 
 结构化查询语言
 
 (Structured Query Language,简称 SQL)是一种
 
 数据库查询和设计语言
 
 。
- 
 每条 SQL 结尾建议添加 ';' 分号
 
 ,用来表示 这条 SQL 结束了(不加的时候,不能同时执行多条同级别的 SQL)
- 
编写 SQL 时, 
 
 建议每条子 SQL 语句单独一行
 
 ,方便理解
- 
通常使用空格和缩进增强语句的可读性,同样空格在分行书写时需要检查空格是否正确添加。 
- 
个人建议: 
 
 关键大写
 
 。
- 
注释: 
 
 多行注释(/* */)、单行注释(#)、单行注释(--[空格])
 
 。
    
    
    分类
   
    
    
    数据定义语言 DDL(Data Definition Language)
   
- 
 修改数据中表的结构
 
 。
- 
用来 
 
 创建、删除、修改
 
 数据库中的各种
 
 对象
 
 ,创建、删除、修改
 
 表的结构
 
 ,比如
 
 表、视图、索引、同义词、聚簇
 
 等。
- 
代表关键字: - 
 create(创建)
 
- 
 alter(更改)
 
- 
 drop(删除)
 
 
- 
- 
常见命令语句: 
# 创建一个新的数据库(new_database)
CREATE DATABASE new_database;
# 将 指定的数据库编码设置为 UTF-8
ALTER DATABASE new_database CHARACTER SET utf8;
# 删除指定的数据库
DROP DATABASE new_database;
# 创建表(表名:user_info)
# 该表有 id、user_name、password 三个字段
# id 是主键字段
CREATE TABLE user_info
(
    id        char(36) PRIMARY KEY,
    user_name varchar(30) NOT NULL,
    password  varchar(30) NOT NULL
);
# 在表 user_info 中添加新列 annual(double 类型)
ALTER TABLE user_info
    ADD COLUMN annual double;
# 删除表 user_info
DROP TABLE user_info;
    
    
    数据查询语言 DQL(Data Query Language)
   
- 
按照指定的组合、条件表达式或排序 
 
 检索已存在的数据库中数据
 
 ,
 
 不改变数据库中数据
 
 。
- 
以 
 
 SELECT 关键字
 
 起,是
 
 由 SELECT 子句,FROM 子句,WHERE 子句、ORDER BY 字句、GROUP BY 字句
 
 组成的查询块。
- 
代表关键字: - 
 select
 
- 
 where
 
 
- 
- 
常用子语句有: - 
 select 子句
 
- 
 from 子句
 
- 
 where 子句
 
- 
 order by 子句
 
- 
 group by 子句
 
 
- 
- 
常见命令语句: 
# 表 user_info 只有 id、user_name、password 三个字段
# 查询 user_info 表中的所有数据
SELECT id, user_name, password
FROM user_info;
# * 号表示获取全部字段,但不建议使用
SELECT *
FROM user_info;
# 条件查询(id 大于 5)
SELECT id, user_name, password
FROM user_info
WHERE id > 5;
    
    
    数据操纵语言 DML(Data Manipulation Language)
   
- 
 修改数据中表的数据
 
 。
- 
向表中 
 
 添加、删除、修改
 
 表中数据的操作语言。
- 
代表关键字: - 
 insert(添加)
 
- 
 update(更改)
 
- 
 delete(删除)
 
 
- 
- 
常用子语句有: - 
 insert 子句
 
- 
 update 子句
 
- 
 delete 子句
 
 
- 
- 
常见的命令语句: 
# 表 user_info 只有 id、user_name、password 三个字段
# 插入一条数据
INSERT INTO user_info(id, user_name, password)
VALUES ('01', '0001', '003567');
# 插入多条数据
INSERT INTO user_info(id, user_name, password)
VALUES ('01', '0001', '003567'),
       ('02', '0002', '900369');
# 删除 表user_info 的某条数据
DELETE
FROM user_info
WHERE id = '01';
# 删除表 user_info 中所有数据
DELETE
FROM user_info;
# 修改 表 user_info 中某条数据
UPDATE user_info
SET user_name = '012',
    password  = null
WHERE id = '02';
    
    
    数据控制语言 DCL(Data Control Language)
   
- 
用来 
 
 授予或收回
 
 访问数据库的某种特权、
 
 对数据库进行监视
 
 等操作。
- 
代表关键字: - 
 grant(赋予用户某种控制权限)
 
- 
 revoke(取消用户某种控制权限)
 
 
- 
    
    
    事务控制语言 TCL(Transaction Control Language)
   
- 
用来控制事务的 
 
 提交和回滚
 
 。
- 
代表关键字: - 
 commit(提交事务)
 
- 
 commit work(提交事务)
 
- 
 rollback(回滚事务)
 
- 
 rollback work(回滚事务)
 
- 
 savepoint [保存点名称](创建事务保存点)
 
- 
 release savepoint [保存点名称](删除事务保存点)
 
 
- 
- 
常见的命令语句: 
# 开启一个事务
BEGIN;
START TRANSACTION;
# 提交事务
-- COMMIT 也可以使用 COMMIT WORK,不过二者是等价的。COMMIT 会提交事务,并使已对数据库进行的所有修改成为永久性的;
COMMIT;
COMMIT WORK;
# 事务保存点的 创建与删除
-- SAVEPOINT identifier,SAVEPOINT 允许在事务中创建一个保存点,一个事务中可以有多个 SAVEPOINT;
SAVEPOINT rollPoint;
-- RELEASE SAVEPOINT identifier 删除一个事务的保存点,当没有指定的保存点时,执行该语句会抛出一个异常;
RELEASE SAVEPOINT rollPoint;
# 回滚事务
-- ROLLBACK 也可以使用 ROLLBACK WORK,不过二者是等价的。回滚会结束用户的事务,并撤销正在进行的所有未提交的修改;
ROLLBACK;
ROLLBACK WORK;
-- ROLLBACK TO identifier 把事务回滚到标记点;
ROLLBACK TO rollPoint;
    
    
    常见函数
   
- 
     
 字符串比较
 
 
 =、<=>
 
 前者不支持比较 null,后者支持。
    
    
    聚合函数
   
- 
注意:只有 
 
 count(x) 函数默认不忽略 null 的行,其他函数默认忽略 null 的行
 
 ;
 
 添加 distinct 关键字可以将指定列的识别改为 ALL
 
 。
- 
 AVG(x)
 
 计算
 
 平均值
 
- 
 COUNT(x)
 
 统计
 
 数量
 
 (统计指定列中非 NULL 的行的数目)
- 
 MAX(x)
 
 找出
 
 最大值
 
- 
 MIN(x)
 
 找出
 
 最小值
 
- 
 SUM(x)
 
 计算
 
 总和
 
    
    
    字符串处理函数
   
- 
 CONCAT(str1, str2, ...)
 
 
 拼接
 
 字符串
- 
 RTRIM(str)、TRIM(str)、LTRIM(str)
 
 
 去除字符串的空格
 
 (分别是:去除字符串左边的空格、去除字符串右边的空格、去除字符串两边的空格)
- 
 UPPER(str)、UCASE(str)
 
 将字符串的字符全部
 
 转成大写的字符
 
- 
 LOWER(str)、LCASE(str)
 
 将字符串的字符全部
 
 转成小写的字符
 
- 
 STRCMP(str1, str2)
 
 
 比较字符串的大小
 
 (具体怎样比较的不是很清楚)
- 
 LENGTH(str)
 
 获取字符串的
 
 字节数
 
- 
 CHAR_LENGTH(str)
 
 获取字符串的
 
 字符数
 
- 
 LEFT(str, length)
 
 从
 
 左边开始截取 length 个字符
 
 ,(length 大于等于 str 的字符数时,截取整个 str;length 小于等于 0 时,不截取,为 空)
- 
 RIGHT(str, length)
 
 从
 
 右边开始截取 length 个字符
 
 ,(length 大于等于 str 的字符数时,截取整个 str;length 小于等于 0 时,不截取,为 空)
- 
 SUBSTRING(str, length)、SUBSTR(str, length)
 
 截取字符(length = 0 或 length 的绝对值大于 str 的字符数时,为空),(length 大于 0 时,从左边、第
 
 length 个字符开始截取到字符串末尾;length 小于 0 时,从右边往左边截取 length 的绝对值个字符)
- 
 SUBSTRING(str, start, length)
 
 
 从 start 个字符开始,截取 length 个字符
 
 (start = 0 或 start 的绝对值大于 str 的字符数时,为空;length 的大于 str
 
 的字符数时,取剩下的字符),(start 大于 0 时,从左边、第 start 个字符开始截取 length 字符;start 小于 0 时,从右边往左边截取 start 的绝对值个字符)
    
    
    处理数值的数学函数
   
    — 运算:MOD(10, 3) 等价于 10%3,那么 SQL 中可以写公式吗?可以的,
    
     SQL 支持计算四则运算的公式
    
    。
   
- 
 ABS(x)
 
 计算
 
 绝对值
 
- 
 CEIL(x)
 
 
 向上取整
 
 (取整得到的数值大于等于 x,如:ceil(4.0) = 4,ceil(4.1) = 5,ceil(-4.9) = -4,ceil(-4) = -4)
- 
 FLOOR(x)
 
 
 向下取整
 
 (取整得到的数值小于等于 x,如:ceil(4.0) = 4,ceil(4.9) = 4,ceil(-4.1) = -5,ceil(-4) = -4)
- 
 MOD(x, y)
 
 获取
 
 模值
 
 (就是求余,求 x/ABS(y) 的余值)
- 
 RAND()
 
 获取
 
 随机数
 
 (结果范围在 0~1 之间,如需要扩大范围,乘以相应的的值即可,结果是一个小数位很长的小数,一般需要相应取整)
- 
 ROUND(x, y)、ROUND(x)
 
 
 四舍五入
 
 (y 表示要保留的小数的位数,当 y 大于小数 x 的小数位数时,保留小数 x 的所有小数位数)- 
当 y=0 时,保留零位小数,ROUND(x) 即 ROUND(x, 0),如:ROUND(3.54)=4 
- 
当 y=1 时,保留一位小数,以此类推,如:ROUND(3.54, 1)=3.5 
- 
当 y=-1 时,保留零位小数,个位也需要四舍五入,如:ROUND(32.54, -1)=30 
- 
当 y=-2 时,保留零位小数,个位和十位也需要四舍五入,以此类推,如:ROUND(352.54)=400 
 
- 
- 
 TRUNCATE(x, y)
 
 
 截取
 
 部分数值(y 表示要截取的小数的位数,当 y 大于小数 x 的小数位数时,截取小数 x 的所有位数)- 
当 y=0 时,截取整数位,如:TRUNCATE(3.54, 0)=3 
- 
当 y=1 时,保留一位小数,以此类推,如:TRUNCATE(3.54, 1)=3.5 
- 
当 y=-1 时,保留零位小数,个位取零,截取十位及以上,如:TRUNCATE(32.54, -1)=30 
- 
当 y=-2 时,保留零位小数,个位和十位取零,截取百位及以上,以此类推,如:TRUNCATE(352.54)=300 
 
- 
    
    
    时间处理函数
   
- 
 CURDATE()、CURRENT_DATE()
 
 获取
 
 当前日期(实时)
 
- 
 CURTIME()、CURRENT_TIME()
 
 获取
 
 当前时间(实时),没有毫秒
 
- 
 NOW()、CURRENT_TIMESTAMP()
 
 获取
 
 当前日期和时间(实时),没有毫秒
 
- 
 DATE(date)
 
 从输入的日期(日期时间)中获取
 
 日期
 
- 
 TIME(date)
 
 从输入的日期(日期时间)中获取
 
 时间
 
- 
 YEAR(date)
 
 从输入的日期(日期时间)中
 
 获取当前年份
 
- 
 MONTH(date)、MONTHNAME(date)
 
 从输入的日期(日期时间)中
 
 获取当前月份
 
 ,前者返回阿拉伯数字、后者返回月份的英文名称
- 
 DAY(date)
 
 从输入的日期(日期时间)中
 
 获取本月当前天数
 
- 
 HOUR(date)
 
 从输入的日期(日期时间)中
 
 获取当前小时数
 
- 
 MINUTE(date)
 
 从输入的日期(日期时间)中
 
 获取当前分钟数
 
- 
 SECOND(date)
 
 从输入的日期(日期时间)中
 
 获取当前秒数
 
- 
 WEEK(date)、DAYNAME(date)
 
 从输入的日期(日期时间)中获取当月天数
 
 属于星期几
 
 ,前者前者返回阿拉伯数字(0~6,表示 周一~周天),后者返回周几的英文名称
    
    
    DQL 和 DML 语句的关键字
   
    
    
    DQL(数据操纵语言)
   
    
    
    
     关键字的执行顺序
    
    问题
   
关键字的执行顺序
- 
 from 字句,第一顺序
 
- 
 where 字句,第二顺序
 
- 
 group by 字句,第三顺序
 
- 
 having 字句,第四顺序
 
- 
 select 字句,第五顺序
 
- 
 order by 字句,第六顺序
 
    
    
    SELECT 关键字
   
- 
 select 字句
 
 :
 
 select 关键字 加上 需要查询的字段
 
- 
select,选择,用在查询 SQL 中 
- 
select 关键字后跟 表字段,是 from 引入的表中的属性(字段),查询多个属性时,用 ‘,’ 分割 
- 
当然,查询表的所有字段时,可以用通配符 ‘*’ 来代替所有属性(效率慢,实际开发尽量不要使用) 
# 表 user_info 只有 id、user_name、password 三个字段
# 查询 user_info 表中的所有数据
SELECT id, user_name, password
FROM user_info;
SELECT *
FROM user_info;
    
    
    FROM 关键字
   
- 
 from 字句
 
 :
 
 from 关键字 加上 需要导入的表(表联结同样在此处添加)
 
- 
from,标记,用来 接入数据表。 
- 
同样,接入多个表用 ‘,’ 分割,此时 表联结规则写到 WHERE 子句中。 
- 
若,用联结关键词接入多个表,此时 表联结规则写到 ON 后面中。 
    
    
    内联结(inner join)、等值联结
   
- 
连接方式: 
 
 [表1] INNER JOIN [表2] ON [表1].[字段a] = [表2].[字段b]
 
- 
最常使用。 
SELECT *
FROM author
         INNER JOIN article ON article_author_id = author_id;
    
    
    自然联结(natural join)
   
- 
事实上,我们迄今为止建立的每个内联结都是自然联结,很可能永远都不会用到不是自然联结的内联结。 
- 
自然联结是 
 
 内联结的一个分支
 
 。
- 
自然联结 
 
 排除多次出现,使每一列只返回一次(自行实现)
 
 。
- 
没有对应的关键字, 
 
 使用自联结或内联结的方式皆可
 
 。
    
    
    自联结(self join)
   
- 
指的是:两次导入同一张表。 
- 
常用的连接方式: 
 
 [表1], [表2] WHERE [表1].[字段a] = [表2].[字段b]
 
- 
自联结通常 
 
 作为外部语句
 
 ,用来
 
 替代从相同表中检索数据的使用子查询语句
 
 。
- 
虽然最终的结果是相同的,但 
 
 许多 DBMS 处理联结远比处理子查询快得多
 
 。
SELECT *
FROM author AS a1,
     author AS a2
WHERE a1.author_id > a2.author_id;
    
    
    左外联结(left outer join)、(left join)
   
- 
以联结关键词 
 
 左边
 
 的表为基准,根据联结规制逐一与右表行进行对应。
- 
输出的行数是 
 
 左表的行数
 
 。
- 
若 右表表中某行数据 
 
 没有与左表对应上,那么就不输出
 
 。
SELECT *
FROM author
         LEFT JOIN article ON author_id = article_author_id;
    
    
    右外联结(right outer join)、(right join)
   
- 
以联结关键词 
 
 右边
 
 的表为基准,根据联结规制逐一与左表行进行对应。
- 
输出的行数是 
 
 右表的行数
 
 。
- 
若 左表表中某行数据 
 
 没有与右表对应上,那么就不输出
 
 。
SELECT *
FROM author
         RIGHT JOIN article ON author_id = article_author_id;
    
    
    WHERE 关键字
   
- 
where 字句无法与 聚合函数 一起使用。 
- 
 where 字句
 
 :where 关键字 加上对应的判定 key-value 对。
- 
行级过滤。 
    
    
    AND 和 OR
   
- 
AND:两个条件进行统一计算, 
 
 在满足第一个条件下,满足第二个条件
 
 。
- 
OR: 
 
 满足第一个条件 或者 满足第二个条件
 
 (满足第一个条件后,不会在执行下去)
- 
圆括号(()):任何时候,只要 同时具有 多个 AND OR 两种操作符,都需要 
 
 添加圆括号明确的将操作符分组,消除歧义
 
 。
    
    
    大于、等于、不等于 操作符
   
- 
等于: 
 
 =
 
- 
不等于: 
 
 <>、!=
 
- 
小于: 
 
 <
 
- 
大于: 
 
 >
 
- 
小于等于: 
 
 <=
 
- 
大于等于: 
 
 >=
 
    
    
    关键字 操作符
   
- 
     
 BETWEEN AND
 
 操作符,闭区间,是
 
 大于等于 和 小于等于
 
 的合并。
SELECT id, `name`, sex
FROM information
WHERE id BETWEEN 2 AND 5;
SELECT id, `name`, sex
FROM information
WHERE id >= 2
  AND id <= 5;
- 
     
 IN
 
 操作符 和
 
 OR
 
 操作符,用来
 
 指定条件范围
 
 ,OR 使用的是 全局搜索,时间久;而 IN 使用的是 匹配 搜索,时间短。
SELECT id, `name`, sex
FROM information
WHERE id IN (2, 6);
SELECT id, `name`, sex
FROM information
WHERE id = 2
   OR id = 6;
- 
     
 NOT
 
 操作符:
 
 否定其后所跟的条件
 
 ,相当于
 
 取反
 
 。
SELECT id, `name`, sex
FROM information
WHERE id != 1;
SELECT id, `name`, sex
FROM information
WHERE NOT id = 1;
- 
     
 LIKE
 
 操作符,模糊匹配。(耗时长,非必要不使用)
# 百分号(%) 通配符:% 表示任何字符(或字符串)出现任何次数(0~n)
# 下滑线(_) 通配符:_ 表示任何字符出现一次
-- 例如:查询 姓:胡 的用户;查询姓名中有:兴 的用户
SELECT id, `name`, sex
FROM information
WHERE `name` LIKE '胡%';
SELECT id, `name`, sex
FROM information
WHERE `name` LIKE '%兴%';
-- 例如:查询 姓名第二位为:好 的用户;查询姓名中只有一位的 用户
SELECT id, `name`, sex
FROM information
WHERE `name` LIKE '_好%';
SELECT id, `name`, sex
FROM information
WHERE `name` LIKE '_';
    
    
    HAVING 关键字
   
- 
 having 字句
 
 :having 关键字 加上对应的判定 key-value 对。
- 
having 字句可以与 聚合函数 一起使用。 
- 
组级过滤。 
- 
故,使用到聚合函数时,用 having 来替换 where。 
- 
where 是 
 
 先过滤再分组
 
 ,having 是
 
 先分组再过滤
 
 。故,where 的效率高。
- 
在使用上,基本没有不同。 
    
    
    DML(数据操纵语言)
   
    
    
    INSERT 关键字
   
- 
添加数据到 
 
 表
 
 中。
- 
 推荐 在 insert 后加 into 关键字
 
 。
-- 插入的写法:INSERT INTO for1(column1, column2, ...) VALUES(value1, value2, ...)
-- 如果 所有列都插入,可以省略 column
INSERT INTO author
VALUES (3, "000", "111");
-- 插入多条数据
INSERT INTO author
VALUES (3, "000", "111"),
       (4, "000", "111");
    
    
    UPDATE 关键字
   
- 
更新 
 
 表中数据行
 
 。
- 
在关键字 SET 后 
 
 添加了 对应列的 key=value 后,该列才更改
 
 。
- 
更新的值是 
 
 以 column=value, column1=value1, ...,的形式来书写
 
 的。
- 
value 可以是 null(该字段允许为空)。 
- 
如果没有 条件,那么会更新所有行。 
-- UPDATE 语句总是以要更新的表名开始。
UPDATE table_name
SET `name`= '兴'
WHERE id = 5;
    
    
    DELETE 关键字
   
- 
     删除
 
 表中数据行
 
 。
-- 删除整行:
DELETE
FROM table_name
WHERE id = 7;
-- 删除整张表的数据:
DELETE
FROM table_name;
TRUNCATE TABLE table_name; -- (更快)
 
