MySql 的 SQL 语句怎么写?

  • Post author:
  • Post category:mysql




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; -- (更快)



版权声明:本文为weixin_46766584原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。