首页 > 数据库 >SQL 做题记录

SQL 做题记录

时间:2023-11-21 18:22:05浏览次数:34  
标签:table2 ... table1 记录 column SQL 权限 SELECT

SQL技能在很多岗位都有涉及,如 数据分析师、DBA、研发、大数据工程师.... 不同的岗位对知识的要求不尽相同,本文关注点目前在于 数据分析、取数、查询等日常操作上。

大学时期虽然有学习过数据库课程(其中对SQL有所涉及),但工作中使用场景不多,存在一些似是而非的概念,因此通过刷leetcode来加深对Mysql SQL查询的学习,以下是学习过程z

一、SQL的关键字顺序和执行顺序

关键字顺序:

select distinct ... from ... join ... on ... where ... group by ... having ... order by ... limit …

执行过程顺序:

from ... on ... join ... where ... group by ... having ... select distinct ... order by ... limit …

二、连接查询

1、交叉连接(笛卡尔积),cross join

相当于两个矩阵的乘积。

SELECT * FROM table1 CROSS JOIN table2  
SELECT * FROM table1 JOIN table2  
SELECT * FROM table1,table2

2、内连接,inner join


相当于excel vlookup在SQL的应用。

SELECT fieldlist
FROM table1 [INNER] join table2 ON table1.column=table2.column

3、外连接

1)左连接,left join


以左表为基准,返回左表的全部内容;对于右表,根据on匹配上的行进行返回,没有的列值为null。

SELECT column_name FROM table1 LEFT [OUTER] JOIN table2 ON table1.column=table2.column

仅在左表且不在右表的内容,使用where对null进行判断。

SELECT column_name FROM table1 LEFT [OUTER] JOIN table2 ON table1.column=table2.column where table2.column is null. 

2)右连接,right join

以右表为基准,返回右表的全部内容;对于左表,根据on匹配上的行进行返回,没有的列值为null。

SELECT column_name FROM table1 
RIGHT [OUTER] JOIN table2 ON table1.column=table2.column;

右表独有:

SELECT column_name FROM table1 
RIGHT [OUTER] JOIN table2 
ON table1.column=table2.column 
where table1.column is null;

4、全连接

mysql不支持全连接(full join,oracle支持),但可以通过左外连接+ union+右外连接实现;

MySQL UNION 操作符用于连接两个以上的 SELECT 语句的结果组合到一个结果集合中。多个 SELECT 语句会删除重复的数据。(UNION ALL,不去重)。

所以左右连接中重合的部分被自动删除了,得到一个全集。

SELECT * FROM t1
LEFT JOIN t2 ON t1.id = t2.id
UNION
SELECT * FROM t1
RIGHT JOIN t2 ON t1.id = t2.id;

5、自连接

通过使用别名,把一张表当成多张不同的表进行跨表查询

SELECT A.column, B.column 
FROM table A, table B
WHERE A.column = B.column;

三、筛选,where 、on、using 、having

1、where、on、using

where:对两表Join后的结果进行筛选
on:筛选条件是在连接前的话,先用On,对两表连接后的筛选用where
using:当相连接的两个表中有同名的列时,为了避免结果出现重复列,使用using指定列来去重

SELECT * FROM table1 
RIGHT JOIN table2 using(cno);

2、where 和 having的区别

从整体声明的角度来理解:

Where是一个约束声明,在查询数据库的结果返回之前对数据库中的查询条件进行约束,即在结果返回之前起作用,且where后面不能使用聚合函数

Having是一个过滤声明,所谓过滤是在查询数据库的结果返回之后进行过滤,即在结果返回之后起作用,并且having后面可以使用聚合函数,放在GROUP BY的后面。

所谓聚合函数,是对一组值进行计算并且返回单一值的函数:sum---求和,count---计数,max---最大值,avg---平均值等。

四、分组,Group by A,B,C

Group by A:按照A列来排序;

Group by A,B:按照A列排序后再按照B列排;

……

五、聚合函数

1、按条件求和SUM()

select DATE_FORMAT(trans_date,'%Y-%m') as month,
country,count(state) as trans_count,
sum(state='approved') as approved_count, 
sum(amount) as trans_total_amount,sum(if(state='approved',amount,0))as approved_total_amount from Transactions
group by month,country;

sum(state='approved') :计算列state枚举值为approved的行数;

sum(if(state='approved',amount,0)):当列state枚举值为approved时,求和列amount的值;

2、按条件计数count()

count(if(expression,1,null))

3、按条件求平均

avg(column):常规的求平均
avg(expression):
AVG(column<3):小于3的值占全部的平均比例
AVG(column1=value1):等于value的值占全部的平均比例
AVG(IF(productline='Classic Cars',buyprice,NULL)):求列值为Classic Cars时的金额平均值

4、group_concat() 和 concat()

concat和group_concat都是用在sql语句中做拼接使用的,但是两者使用的方式不尽相同,concat是针对以行数据做的拼接,而group_concat是针对列做的数据拼接,且group_concat自动生成逗号

六、视图和存储过程

1、视图

虚拟表,基于原表虚拟出来的一张表,可以是原表的全部或部分数据,不会对原表中的数据产生任何改变;可用于将常用的查询/部分常用数据放置在视图中,便于日常高效的查询。

2、存储过程

存储过程类似于函数,是一组sql命令的封装,在使用时通过存储过程指令来执行一组sql语句。

七、MySQL有关权限的表

MySQL服务器通过权限表来控制用户对数据库的访问,权限表存放在mysql数据库里,由mysql_install_db脚本初始化。这些权限表分别user,db,table_priv,columns_priv和host。下面分别介绍一下这些表的结构和内容:

user权限表:记录允许连接到服务器的用户帐号信息,里面的权限是全局级的。

db权限表:记录各个帐号在各个数据库上的操作权限。

table_priv权限表:记录数据表级的操作权限。

columns_priv权限表:记录数据列级的操作权限。

host权限表:配合db权限表对给定主机上数据库级操作权限作更细致的控制。这个权限表不受GRANT和REVOKE语句的影响。

附:

一条SQL语句的执行过程:
https://pdai.tech/md/db/sql-mysql/sql-mysql-execute.html
一条SQL语句的解析过程:
https://pdai.tech/md/db/sql-mysql/sql-mysql-sql-parser.html

标签:table2,...,table1,记录,column,SQL,权限,SELECT
From: https://www.cnblogs.com/ffx1/p/17847268.html

相关文章

  • AGC 020~039 记录
    不想写CF。AGC020D.MinMaxRepetition要令连续的相同字符个数的最大值最小,可以直接贪心将A和B尽可能分开,得出答案\(k=\lfloor\frac{A+B}{\min(A,B)+1}\rfloor\)。接下来要在这个基础上构造字典序最小的答案。我们显然希望A尽量靠前,直到超出限制时再用B分开,即靠前......
  • [Flink] Flink(CDC/SQL)Job在启动时,报“ConnectException: Error reading MySQL varia
    1问题描述1.1基本信息所属环境:CN-PT问题时间:2023-11-21所属程序:FlinkJob(XXXPT_dimDeviceLogEventRi)作业类型:FlinkSQLJob数据流:业务MySQL==>FlinkJob(FlinkCdcConnector(mysql)+FlinkSQL)==>BigdataKafka==>BigdataOLAP==>业务系统作业......
  • 08-基础SQL-DQL(数据查询语言)-条件查询(WHERE)
    DQL-介绍(常用)DQL英文全称是DataQueryLanguage(数据查询语言),数据查询语言用来查询数据库中表的记录查询关键字:SELECTDQL-语法DQL-条件查询语法:SELECT字段列表FROM表名WHERE条件列表;条件:LIKE查询(模糊查询)%包含零个或多个字符的任意字符串_(下划线)任何单个字符......
  • 09-基础SQL-DQL(数据查询语言)-聚合函数(count、max、min、avg、sum)
    DQL-介绍(常用)DQL英文全称是DataQueryLanguage(数据查询语言),数据查询语言用来查询数据库中表的记录查询关键字:SELECTDQL-语法......
  • sql 查询数据库的常用脚本
    查询数据库的所有表的记录数 ----查询所有表的记录数量----------------------------------------------------------------------------------selecta.nameas表名,max(b.rows)as记录条数fromsysobjectsa,sysindexesbwherea.id=b.idand......
  • 04MYSQL
    查询关键字之having过滤having与where的功能是一模一样的都是对数据进行筛选where用在分组之前的筛选having用在分组之后的筛选为了更好的区分所以将where说成筛选having说成过滤#统计每个部门年龄在30岁以上的员工的平均薪资并且保留平均薪资大于10000的部门......
  • 使用docker 搭建xtrabackup服务,实现mysql全量和增量备份
    根据前面的mysql备份调研得知,mysql的备份重头戏就是xtrabackup,mysqldump只能算开胃菜本篇就着重讨论下xtrabackup的使用,由于考虑到维持虚拟机环境的整洁,和搭建使用的通用和便利性,这里选择基于docker环境使用照惯例,学习任何一个工具最佳途径就是研读官方文档,这里贴出官方文档:http......
  • Postgresql(PG)表的操作:
      PG表的支持数据类型:数值数据类型字符串数据类型日期/时间数据类型  #创建库postgres=#createdatabasemydb;CREATEDATABASEpostgres=#\cmydbYouarenowconnectedtodatabase"mydb"asuser"postgres".mydb=#\dDidnotfindanyrelations.#创建表mydb=......
  • 07-基础SQL-DQL(数据查询语言)-基础查询
    DQL-介绍(常用)DQL英文全称是DataQueryLanguage(数据查询语言),数据查询语言用来查询数据库中表的记录查询关键字:SELECTDQL-语法DQL-基本查询查询多个字段SELECT字段1,字段2,字段3...FROM表名;SELECT*FROM表名;设置别名SELECT字段1[AS别名1],字段2[AS别......
  • mysql数据库死锁
    转载自:https://zhuanlan.zhihu.com/p/506662991?utm_id=0============== 什么是死锁说到死锁,还是先来复习下什么是死锁吧。死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于......