MySql 的 SQL 语句怎么写?

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; -- (更快)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十⑧

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值