MySQL- sql语句基础

这篇具有很好参考价值的文章主要介绍了MySQL- sql语句基础。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.select后对表进行修改(delete)

报错:You can’t specify target table ‘Person’ for update in FROM clause
原因:mysql不能在同一语句中先select出同一表中的某些值,然后对这个表做修改
错误写法

delete from Person 
where id not in(
  select min(id) id
  from Person 
  group by email 
)

解决方法:添加临时表

正确写法

delete from Person 
where id not in(
  select * from (
  select min(id) id
  from Person 
  group by email 
  ) t1
)

2.函数GROUP_CONCAT()

我们可以使用函数 GROUP_CONCAT() 将多行中的多个值组合成一个字符串。下面显示了 GROUP_CONCAT() 函数的语法:

GROUP_CONCAT(
    DISTINCT 字段 ----去重
    ORDER BY 字段 ----ASC/DESC
    SEPARATOR sep ---分隔符: SEPARATOR ','
);

用例

select 
  sell_date ,
  count(distinct product) num_sold ,
  group_concat(
    distinct product 
    separator ','
  ) products
from 
  Activities 
group by 
  sell_date 

MySQL- sql语句基础,mysql,sql,数据库,java

3.使用正则表达式

思路
一般来说,如果你被要求匹配一个字符串,应该最先想到写一个正则表达式模式进行匹配。

正则表达式提供各种功能,以下是一些相关功能:

正则表达式书写格式
^:表示一个字符串或行的开头
[a-z]:表示一个字符范围,匹配从 a 到 z 的任何字符。
[0-9]:表示一个字符范围,匹配从 0 到 9 的任何字符。
[a-zA-Z]:这个变量匹配从 a 到 z 或 A 到 Z 的任何字符。请注意,你可以在方括号内指定的字符范围的数量没有限制,您可以添加想要匹配的其他字符或范围。
[^a-z]:这个变量匹配不在 a 到 z 范围内的任何字符。请注意,字符 ^ 用来否定字符范围,它在方括号内的含义与它的方括号外表示开始的含义不同。
[a-z]*:表示一个字符范围,匹配从 a 到 z 的任何字符 0 次或多次。
[a-z]+:表示一个字符范围,匹配从 a 到 z 的任何字符 1 次或多次。
.:匹配任意一个字符。
\.:表示句点字符。请注意,反斜杠用于转义句点字符,因为句点字符在正则表达式中具有特殊含义。还要注意,在许多语言中,你需要转义反斜杠本身,因此需要使用\.。
$:表示一个字符串或行的结尾。

例子

SELECT user_id, name, mail
FROM Users
-- 请注意,我们还转义了`@`字符,因为它在某些正则表达式中具有特殊意义
WHERE mail REGEXP '^[a-zA-Z][a-zA-Z0-9_.-]*\\@leetcode\\.com$';

4.DATE_FORMAT()

将日期值格式化为特定格式,请使用DATE_FORMAT函数。 DATE_FORMAT函数的语法如下:

DATE_FORMAT(date,format);  ---date 字段,format 需要格式
DATE_FORMAT(trans_date,'%Y-%m')  ---%Y-%m 2023-08
format date
%D 英文后缀如:0th, 1st, 2nd等的一个月之中的第几天
%d 如果是1个数字(小于10),那么一个月之中的第几天表示为加前导加0, 如:00, 01,02, …31
%H 24小时格式的小时,前导加0,例如:00,01…23
%h 小时,12小时格式,带前导零,例如:01,02 … 12
%Y 表示年份,四位数,例如2000,2001
%y 表示年份,两位数,例如00,01
%m 具有前导零的月份名称,例如:00,01,02,… 12
%M 月份全名称,例如:January, February,…December
format date
%Y-%m-%d 2017/04/30
%Y-%m 2017/04

5.count() 加条件

  1. COUNT( state=‘approved’ OR NULL ) >需要在后面 + or null

  2. COUNT( IF (state = ‘approved’, 1, NULL ) )

需要注意的是,count只有在字段数据为NULL时才不计入数量,如果IF (state = ‘approved’, 1, NULL ) 改为IF (state = ‘approved’, 1, 0 ) ,那么非 approved的数据也会被计入其中导致错误。

6.关于GROUP BY 中使用聚合函数去跟普通数据做比较而导致查询结果错误的点

-------------- min(order_date) = customer_pref_delivery_date --------------
题目:
MySQL- sql语句基础,mysql,sql,数据库,java

delivery_id 是表的主键。
该表保存着顾客的食物配送信息,顾客在某个日期下了订单,并指定了一个期望的配送日期(和下单日期相同或者在那之后)。
如果顾客期望的配送日期和下单日期相同,则该订单称为 「即时订单」,否则称为「计划订单」。
「首次订单」是顾客最早创建的订单。我们保证一个顾客只会有一个「首次订单」。

要求:写一条 SQL 查询语句获取即时订单在所有用户的首次订单中的比例。保留两位小数。
MySQL- sql语句基础,mysql,sql,数据库,java

 select customer_pref_delivery_date
  from Delivery 
  group by customer_id
  having min(order_date) = customer_pref_delivery_date

这个sql执行结果是错误的,因为部分数据会被忽略掉,比如那些有多条数据的(一个customer_id可以有多条消费记录), having min(order_date) = customer_pref_delivery_date 拿到最小的order_date后去跟这个组内的customer_pref_delivery_date去比较,但我们不能保证它拿的是不是min(order_date) 对应的那个customer_pref_delivery_date,所以这里的 “ = ”,即比较,是有问题的(这种情况下应该是取组内第一条数据的customer_pref_delivery_date去跟min(order_date) 做比较,因为98的可以取到,其他3组取不到)

MySQL- sql语句基础,mysql,sql,数据库,java

以上是符合条件的,但是会被筛选掉,导致错误
如果非要这么写,那么需要搞清楚要比较的是什么customer_pref_delivery_date,比如这里要的是最小的customer_pref_delivery_date(初步判断,不建议这么写)

  select customer_pref_delivery_date
  from Delivery 
  group by customer_id
  having min(order_date) = min(customer_pref_delivery_date)

正确的完整写法

select round(count(order_date=customer_pref_delivery_date or null) *100 / count(*) ,2) immediate_percentage 
from Delivery 
where (customer_id,order_date) 
in (
  select customer_id,min(order_date) order_date
  from Delivery 
  group by customer_id 
)

思路是先查询拿到所有消费者的「首次订单」,再拿原表去筛选并计算order_date=customer_pref_delivery_date的记录数,最后求比率

6.窗口函数(可用于部门绩效排名,学校成绩排名等)

<窗口函数> over (partition by <用于分组的列名>
order by <用于排序的列名>
rows/range子句<用于定义窗口大小> )

--------------------------- 案例 -----------------------------
公司的主管们感兴趣的是公司每个部门中谁赚的钱最多。一个部门的 高收入者 是指一个员工的工资在该部门的 不同 工资中 排名前三 。
MySQL- sql语句基础,mysql,sql,数据库,java

select t3.Department ,t3.Employee ,t3.salary
from (
  select t2.name Department ,t1.name Employee , 
  dense_rank() over(partition by t1.departmentId order by t1.salary desc) dr, 
  t1.salary 
  from Employee t1 
  left join Department t2 
  on t1.departmentId = t2.id 
) t3 
where t3.dr <=3

MySQL- sql语句基础,mysql,sql,数据库,java
-------------------------------------------------------------

窗口函数>可以放以下两种函数:

1) 专用窗口函数,即rank, dense_rank, row_number等。

  • Rank:存在并列排名,且占用原来名次,会跳数字。
  • Dense_rank: 存在并列排名,不占用原来名次,不跳数
  • Row_number:不存在并列排名
成绩 Rank Dense_rank Row_number
100 1 1 1
100 1 1 2
100 1 1 3
98 4 2 4

2) 聚合函数,如sum,avg,count,max,min等

group by 与 partition by 的区别

MySQL- sql语句基础,mysql,sql,数据库,java

滑动窗口:rows&range用法

  • ROWS: 表示按照规定范围,根据order by子句排序后,取的前N行及后N行的数据计算。常用:rows n preceding表示从当前行到前n行(包括当前行)
  • RANGE:表示按照规定范围,根据order by子句排序后,指定当前行对应值的范围取值,行数不固定,只要行值在范围内,对应行都包含在内。适用于对日期、时间、数值排序分组
ROWS 解释
Current Row 当前行
n preceding 前 n 行,n 为数字, 比如 2 Preceding 表示前2行
unbounded preceding 当前行到分区中的开头行
n following 后n行,n 为数字, 比如 2 following 表示后2行
unbounded following 当前行到分区中的结尾行
rows between 1 preceding and 1 following 窗口范围是当前行、前一行、后一行,共三行记录

ROWS例子

select *,sum(weight) over(order by turn asc) TotalWeight
from Queue 

注意:这里sum()是求 当前行 + 当前行前面的所有行
MySQL- sql语句基础,mysql,sql,数据库,java
因为order by 后面不加 窗口范围 则默认查看 当前行 + 当前行前面的所有行,相当于rows unbounded preceding,如图所示
MySQL- sql语句基础,mysql,sql,数据库,java

RANGE 解释
range interval 6 day preceding 最近7天的值(6天前+当天的值)
range between interval 1 day preceding and interval 1 day following 前后一天和当天的值

interval
/ˈɪntərvl/
n.间隔;(时间上的)间隙;间歇
preceding
/prɪˈsiːdɪŋ/
v.先于;在…之前发生(或出现);走在…前面
adj.在前的;前面的
following
/ˈfɑːloʊɪŋ/
adj.下列的;下述的;(时间上)接着的
n.下列;如下;下述;(统称)拥护者,追随者
v.跟随;跟着;(指时间或顺序)在…后发生,因…而发生;在…后做文章来源地址https://www.toymoban.com/news/detail-658089.html

到了这里,关于MySQL- sql语句基础的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MySQL相关的SQL语句、数据库、数据表、字段、类型

    1、 SQL 语句不区分大小写。 SQL语句 用途 描述 mysql -u root -p 连接 MySQL 在命令行窗口中输入 mysql -u root -p 命令,回车,然后输入 MySQL 密码(不要忘记了密码,找回麻烦),再回车就连接上 MySQL 了。最初都是使用 root 用户登录,工作中不能一直使用 root 用户登录。因为 root 权限太

    2024年02月13日
    浏览(69)
  • mysql,用sql语句,建立学生-课程数据库基本表

    学生表 学号 姓名 年龄 性别 院系 Student Sno Sname Sage Ssex Sdept 课程表 课程号 课程名 先行课 学分 Course Cno Cname Cpno Ccredit 选课表 学号 课程号 成绩 SC Sno Cno Grade 注意创建表的时候要注意它的字段名,类型,长度,约束条件,取值范围要合适,大小写符号要正确,中文逗号,分号

    2024年02月08日
    浏览(45)
  • MySQL数据库概念、管理以及SQL语句的基本命令操作

    数据(data) 描述事物的符号记录 包括数字,文字、图形、图像、声音、档案记录等 以“记录”形式按统一格式进行存储(记录可以看成一条记录) 表 将不同的记录组织在一起 用来存储具体数据 记录:行 字段(属性):列 以行+列的形式就组成了表(数据存储在表中) 数

    2024年02月08日
    浏览(59)
  • MySQL 数据库实用指南:测试数据准备、SQL语句规范与基本操作

    欢迎来到小K的MySQL专栏,本节将为大家准备MySQL测试数据、以及带来SQL语句规范、数据库的基本操作的详细讲解 要学习SQL查询语句,首先必须解决一个问题,数据问题。为了方便大家学习阅读我的文章,在这里提供了一个test.sql文件 ✨ 登录MySQL,输入 source xxx/test.sql 导入sql文

    2024年02月08日
    浏览(66)
  • MySQL数据库第十一课---------SQl语句的拔高-------水平提升

                                                       个人主页 ::小小页面                   gitee页面 :秦大大                 一个爱分享的小博主  欢迎小可爱们前来借鉴 ______________________________________________________    SQL提高   日期函数     

    2024年02月16日
    浏览(50)
  • MySQL数据库增删改查及聚合查询SQL语句学习汇总

    目录 数据库增删改查SQL语句 MySQL数据库指令 1.查询数据库 2.创建数据库 3.删除数据库 4.选择数据库 创建表table   查看所有表 创建表 查看指定表的结构 删除表 数据库命令进行注释 增删改查(CRUD)详细说明 增加 SQL库提供了关于时间的函数:now()  查询 查询表作列与列之间进

    2024年02月09日
    浏览(66)
  • 基于Linux操作系统中的MySQL数据库SQL语句(三十一)

    MySQL数据库SQL语句 目录 一、SQL语句类型 1、DDL 2、DML 3、DCL 4、DQL 二、数据库操作 1、查看 2、创建 2.1、默认字符集 2.2、指定字符集 3、进入  4、删除 5、更改 6、练习 三、数据表操作 (一)数据类型 1、数值类型 1.1、TINYINT 1.2、SMALLINT 1.3、INT 1.4、BIGINT 1.5、FLOAT(M,D) 2、时间

    2024年02月15日
    浏览(50)
  • MySQL:想实现sql语句进行批量删除数据库或表,而引发的熬夜探究

    因为在自测过程中,创建了很多数据库,一个个手动删除属实有点对不起程序员这个身份,那么有没有简单的sql语句操作来进行批量删除数据库呢?于是便有了本篇文章 上面图片是AI创作,未经允许,不可商用哦! 删库跑路需谨慎, 放弃一切亦不易。 了解到数据库或表的信

    2024年01月16日
    浏览(52)
  • MySQL数据库基础(九):SQL约束

    文章目录 SQL约束 一、主键约束 二、非空约束 三、唯一约束 四、默认值约束 五、外键约束(了解) 六、总结 PRIMARY KEY 约束唯一标识数据库表中的每条记录。 主键必须包含唯一的值。 主键列不能包含 NULL 值。 每个表都应该有一个主键,并且每个表只能有一个主键。 遵循原

    2024年02月19日
    浏览(46)
  • MySQL基础篇——MySQL数据库客户端连接,数据模型,SQL知识

    作者简介:一名云计算网络运维人员、每天分享网络与运维的技术与干货。   座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页​​​​​​ 目录 前言 一.客户端连接MySQL 二. 数据模型 1.关系型数据库(RDBMS) 2.数据模型 三.SQL 1.SQL通用语法 2.SQL分类 3.数据库操作 1). 查

    2024年02月06日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包