牛客网数据库sql实战基础知识

news2024/7/5 0:10:26

sql基础知识

1.concat(a,“-”,b):
将a和b列,连接成字符串,用-分割后输出成一列。(分隔符在参数中间)

2.insert into values(),():
插入多列时用逗号分割,不需要在最外层加再加括号。

3.insert ignore into actor values(‘3’,‘ED’,‘CHASE’,‘2006-02-15 12:34:33’):
在insert into 之间加入ignore,表示如果数据存在则不插入。

4.窗口函数:
下面介绍三种用于进行排序的专用窗口函数:

  • RANK()
    在计算排序时,若存在相同位次,会跳过之后的位次(如下例子中跳过了2,3)。
    例如,有3条排在第1位时,排序为:1,1,1,4······

  • DENSE_RANK()
    这就是题目中所用到的函数,在计算排序时,若存在相同位次,不会跳过之后的位次。
    例如,有3条排在第1位时,排序为:1,1,1,2······

  • ROW_NUMBER()
    这个函数赋予唯一的连续位次(不软相不相同,都会自增,相当于一个自增序号)。
    例如,有3条排在第1位时,排序为:1,2,3,4······
    其它:SUM()、AVG()、MIN()、MAX():计算窗口内指定列的总和、平均值、最小值和最大值。
    LAG()、LEAD():返回指定列在窗口中前一行或后一行的值。

窗口函数用法:
<窗口函数> OVER ( [PARTITION BY <列清单> ]
ORDER BY <排序用列清单>
rows between 开始位置 and 结束位置)
*其中[ ]中的内容可以忽略。

在使用over()窗口函数时,over()函数中的这三个函数可组合使用也可以不使用。
over()函数中如果不使用这三个函数,窗口大小是针对查询产生的所有数据,如果指定了分区,窗口大小是针对每个分区的数据。

使用例子:

SELECT dept_id,
AVG(salary) OVER(PARTITION BY dept_id) as avg_salary, 
RANK() OVER(PARTITION BY dept_id ORDER BY salary DESC) as salary_rank
FROM employees;

在这里插入图片描述
关于连续类的例子:
某宝店铺连续2天及以上购物的用户及其对应的天数

SELECT
	user_id,COUNT(*) days_count
FROM
	(SELECT
	 DISTINCT user_id,sales_date,DENSE_RANK() over(PARTITION by user_id ORDER BY sales_date) rn
FROM
	sales_tb) a
GROUP BY
	user_id,DATE_ADD(sales_date,INTERVAL - rn day)
HAVING
	days_count >=2
ORDER BY
	user_id

相关知识:
1)关于INTERVAL
例如,如果sales_date为2022-06-01,rn为2,那么DATE_ADD(sales_date,INTERVAL - rn day)将返回2022-05-30,即2022-06-01减去2天后的日期。
在这里插入图片描述

5.用with定义临时表达式

WITH
  cte_name1 AS (
    -- 第一个临时表达式的定义
  ),
  cte_name2 AS (
    -- 第二个临时表达式的定义
  ),
  ...
SELECT ...
FROM ...

注意:
1)临时表达式可以是任何有效的Hive查询语句,包括SELECT、JOIN、GROUP BY、ORDER BY等,注意必须是一个完整的select语句

2)临时表达式在查询中的顺序很重要,因为后续的表达式可以引用前面已定义的表达式。

3)临时表达式的定义仅在WITH语句范围内有效,在主查询之外无法访问。

4)临时表达式可以引用之前定义的临时表达式,但不能递归引用自身。

5) WITH语句可以与其他查询操作一起使用,如WHERE、GROUP BY、ORDER BY等。
具体例子如下:

WITH 
  filtered_data AS (
    SELECT *
    FROM sales_table
    WHERE date >= '2023-01-01' AND date <= '2023-03-31'
  ),
  monthly_sales AS (
    SELECT
      month(date) AS sales_month,
      SUM(quantity) AS total_quantity
    FROM filtered_data
    GROUP BY month(date)
  )
SELECT sales_month, total_quantity
FROM monthly_sales
ORDER BY sales_month;

6.建表
MYSQL创建数据表的三种方法:

  • 常规创建
    create table if not exists 目标表

  • 复制表格
    create 目标表 like 来源表

  • 将table1的部分拿来创建table2

create table if not exists actor_name
(
first_name varchar(45) not null,
last_name varchar(45) not null
)
select first_name,last_name
from actor

7.创建索引
1)添加主键
ALTER TABLE tbl_name ADD PRIMARY KEY (col_list);
// 该语句添加一个主键,这意味着索引值必须是唯一的,且不能为NULL。

2)添加唯一索引(可以null,但是必须唯一)
语法:alter table 表名 add (unique) index 索引名(列名)
ALTER TABLE tbl_name ADD UNIQUE index_name (col_list);
// 这条语句创建索引的值必须是唯一的。

3)添加普通索引
语法:alter table 表名 add index 索引名(列名)
ALTER TABLE tbl_name ADD INDEX index_name (col_list);
// 添加普通索引,索引值可出现多次。

4)添加全文索引
ALTER TABLE tbl_name ADD FULLTEXT index_name (col_list);
// 该语句指定了索引为 FULLTEXT ,用于全文索引。

PS: 附赠删除索引的语法:
DROP INDEX index_name ON tbl_name;
// 或者
ALTER TABLE tbl_name DROP INDEX index_name;
ALTER TABLE tbl_name DROP PRIMARY KEY;

还可以用CREATE来创建索引:
语法:create (unique) index 索引名 on 表名(列名)
CREATE UNIQUE INDEX uniq_idx_firstname ON actor (first_name);
CREATE INDEX idx_lastname ON actor (last_name);

上述索引名都是自定义的!

8.根据已有表建创建视图

create view actor_name_view (first_name_v,last_name_v) as
select first_name ,last_name from actor

9.增加列

语法:ALTER TABLE <表名> ADD COLUMN <新字段名> <数据类型> [约束条件] [FIRST|AFTER 已存在的字段名];
例子:ALTER TABLE actor ADD create_date datetime NOT NULL DEFAULT ‘2020-10-01 00:00:00’

10.创建触发器

例子:构造一个触发器audit_log,在向employees_test表中插入一条数据的时候,触发插入相关的数据到audit中。

create trigger audit_log
after insert on employees_test
for each row
begin
    insert into audit values(new.id,new.name);
end

在MySQL中,创建触发器语法如下:

CREATE TRIGGER trigger_name
trigger_time trigger_event ON tbl_name
FOR EACH ROW
trigger_stmt

其中:
trigger_name:标识触发器名称,用户自行指定;
trigger_time:标识触发时机,取值为 BEFORE 或 AFTER;
trigger_event:标识触发事件,取值为 INSERT、UPDATE 或 DELETE;
tbl_name:标识建立触发器的表名,即在哪张表上建立触发器;
trigger_stmt:触发器程序体,可以是一句SQL语句,或者用 BEGIN 和 END 包含的多条语句,每条语句结束要分号结尾。

【NEW 与 OLD 详解】
MySQL 中定义了 NEW 和 OLD,用来表示
触发器的所在表中,触发了触发器的那一行数据。
具体地:
在 INSERT 型触发器中,NEW 用来表示将要(BEFORE)或已经(AFTER)插入的新数据;
在 UPDATE 型触发器中,OLD 用来表示将要或已经被修改的原数据,NEW 用来表示将要或已经修改为的新数据;
在 DELETE 型触发器中,OLD 用来表示将要或已经被删除的原数据;
使用方法: NEW.columnName (columnName 为相应数据表某一列名)

11.删除,更新table

1)删除:delete table tablename
2)更新:

  • 普通形式:update tablename set columnName=value where columnName=value,如果要更新多列用逗号隔开,如set to_date=NULL,from_date=‘2001-01-01’
  • 可以直接在更新表的基础上使用join:
    update salaries s join emp_bonus e on s.emp_no=e.emp_no
    set salary = salary*1.1
    where to_date = “9999-01-01”;

12.limit

1)取倒数第三个数
跳过两条取一条数据:limit 2,1 = limit 1 offset 2
2)分页
每页显示n条记录,要显示第i页数据,则可以用 limit n*(i-1),n

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/718422.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

工信部新材料大数据创新联盟成立,龙讯旷腾作为首批会员单位参与大会

近日&#xff0c;“新材料大数据创新联盟”成立大会暨第一届理事会在京召开。为深入贯彻国家创新驱动发展战略&#xff0c;联盟在工业和信息化部指导下&#xff0c;由北京科技大学、中国钢研科技集团有限公司、中关村材料试验技术联盟联合材料和信息技术领域重点高校、科研院所…

浅学CSS

目录 CSS 是什么 基本语法规范 引入方式 内部样式表 行内样式表 外部样式 代码风格 样式格式 样式大小写 空格规范 选择器 选择器的功能 选择器的种类 基础选择器 标签选择器 类选择器 id 选择器 通配符选择器 基础选择器小结 复合选择器 后代选择器 子选…

<C语言> 指针(上)

1.指针是什么&#xff1f; 指针&#xff08;Pointer&#xff09;是一种特殊的变量类型&#xff0c;它存储了一个内存地址。可以将指针视为存储了另一个变量的地址的变量。通过指针&#xff0c;可以直接访问和修改内存中的数据。 指针提供了一种间接访问内存的方式&#xff0c…

SpringCloud源码探析(七)-整合Elasticsearch

1.概述 ElasticSearch是一个基于Lucene的搜索服务器&#xff0c;提供了一个分布式多用户能力的全文搜索引擎。它是基于JAVA语言开发&#xff0c;并且是基于RESTful web接口进行查询和结果返回&#xff0c;是一款非常流行的企业级搜索引擎。Elasticsearch的核心功能包括存储数据…

Redis缓存问题与缓存更新机制

目录 ​编辑 一、缓存问题 1.1 缓存穿透 1.1.1 问题来源 1.1.2 解决方案 1.1.2.1 缓存空对象 1.1.2.2 使用布隆过滤器 1.2 缓存击穿 1.2.1 问题来源 1.2.2 解决方案 1.2.2.1 设置热点数据永远不过期 1.2.2.2 新增后台定时更新缓存线程&#xff08;逻辑不过期&#xff09; 1.2.…

详解Java Synchronized锁升级原理

✅作者简介&#xff1a;热爱Java后端开发的一名学习者&#xff0c;大家可以跟我一起讨论各种问题喔。 &#x1f34e;个人主页&#xff1a;Hhzzy99 &#x1f34a;个人信条&#xff1a;坚持就是胜利&#xff01; &#x1f49e;当前专栏&#xff1a;JAVA多线程 &#x1f96d;本文内…

蓝桥杯专题-试题版含答案-【猴子吃桃问题】【小光棍数】【九九乘法表】【谁是最好的Coder】

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 &#x1f449;关于作者 专注于Android/Unity和各种游…

(Linux) 套接字socket基础

文章目录 前言基本原理 Codeserverclient 核心函数socketbindlistenacceptrecvsendconnectclose 多线程改进END 前言 本文将以纯C语言描述&#xff0c;编译器gcc。 C/C没有标准的网络库&#xff0c;因为都需要用到各个平台的接口才行。 本文讲解Linux下最基础的socket编程&a…

uniapp 常用提示弹框整理

一. 加载提示弹框 在执行数据查询、页面数据渲染等过程中弹出提示。以页面渲染为例&#xff1a; //前端数据请求时&#xff0c;显示加载提示弹框 uni.showLoading({title: 加载中... }); // 数据从后端接口返回后&#xff0c;提示弹框关闭 uni.hideLoading();效果如下&#x…

Sui Builder House京都站|创意大赛获奖名单公布

Sui Builder House京都站于6月30日&#xff08;周五&#xff09;圆满结束&#xff0c;这是一次Sui生态系统项目演示和展示各自产品的良好机会。构建者们向大家展示了游戏、NFT、DeFi和基础设施赛道的项目&#xff0c;同时现场演讲还介绍了Sui的最新进展以及有关AI和用户体验设计…

React环境安装配置

React环境安装配置 一、前提二、React安装 一、前提 安装本地React环境需要Node.js&#xff0c;如果具有Node环境跳过即可。如果没有安装则可参考该篇文章安装Node环境&#xff0c;点击查看 二、React安装 全局安装React 首先打开命令行&#xff0c;建议以管理员身份输入命…

20230704测试STC32G实验箱9.6(STC32G12K128)开发板的虚拟串口(C语言深入了解)

20230704测试STC32G实验箱9.6&#xff08;STC32G12K128&#xff09;开发板的虚拟串口&#xff08;C语言深入了解&#xff09; 06第五集&#xff1a;C语言运算符和进制数入门上.mp4 07第五集&#xff1a;C语言运算符和进制数入门下.mp4 2023/7/4 19:00 下次 在【冲哥】录视频的时…

024、数据库管理之数据同步工具TiCDC

TiCDC TiCDCTiCDC介绍架构与原理适用场景对已有TiDB进行扩容部署TiCDC管理工具TiCDC同步任务查询所有TiCDC同步任务查询TiCDC指定的同步任务管理TiCDC同步任务动态更新任务监控TiCDC 实验数据同步完整实操缩容当前TiCDC节点 TiCDC TiCDC介绍 TiCDC 是一款通过拉取 TiKV 变更日…

leetcode 42-接雨水

解法一&#xff1a;双指针&#xff08;暴力按列计算&#xff09; 首先&#xff0c;如果按照列来计算的话&#xff0c;宽度一定是1了&#xff0c;我们再把每一列的雨水的高度求出来就可以了。 可以看出每一列雨水的高度&#xff0c;取决于该列左侧最高的柱子和右侧最高的柱子中…

VMware虚拟机的基本操作:快照和克隆

VMware虚拟机的基本操作 一、虚拟机快照二、克隆 一、虚拟机快照 “快照”是虚拟机磁盘文件&#xff08;VMDK&#xff09;在某个点及时的副本。系统崩溃或系统异常&#xff0c;你可以通过使用恢复到快照来保持磁盘文件系统和系统存储。当升级应用和服务器及给它们打补丁的时候…

一桩关于Json序列化引发的惨案(Go系统)

文章目录 前言突然崩了排查问题关于go的json库什么是反射 解决大结构体序列化的性能问题干掉大结构体减少反射使用一些好用的第三方序列化包 自定义序列化 写在最后 前言 一个风和日丽的下午&#xff0c;线上系统突然开始报警&#xff08;系统温馨提示&#xff0c;您的服务接口…

部署Git服务器

哈喽&#xff0c;大家好&#xff0c;本次为大家演示如何部署git服务器. 首先要准备gitea和phpstudy_pro phpstudy一路nest即可&#xff0c;可以帮你安装mysql和阿帕奇。 登录127.0.0.1:3000注册gitea即可。 如何在上传公钥的时候出现500的错误&#xff0c;加入这句便可解决…

SpringBoot+Vue+Element-ui实现文件下载

目录 1.后端代码部分 2.前端代码部分 3.效果展示 1.后端代码部分 GetMapping("downloadFile")public void downloadFile(RequestParam("filename") String filename,HttpServletResponse response) throws Exception {// 告知浏览器这是一个字节流&…

WebSocket connection to “wss://xxx/xxx“ failed

用了https后&#xff0c;需要用nginx作websocket地址的转发才能使用wss&#xff0c;别直接用端口访问 location /ws/ {proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "Upgrade"; proxy_pass http://localhost:10001/…

JVM源码剖析之SymbolTable和StringTable

很多读者在观看JVM相关的书籍时会看到SymbolTable和StringTable&#xff0c;书中的三言二语介绍的不是很清楚&#xff0c;并且读者的水平有限&#xff0c;导致无法理解SymbolTable和StringTable。所以特意写此篇图文并茂的文章来彻底理解SymbolTable和StringTable这两张表。 版…