解锁SQL基础应用新境界:从入门到精通的扩展实践指南(SQL扩展)

  •  作者简介:我是团团儿,是一名专注于云计算领域的专业创作者,感谢大家的关注
  •  座右铭:   云端筑梦,数据为翼,探索无限可能,引领云计算新纪元
  •  个人主页:团儿.-CSDN博客

目录

前言:

一.group  by

1.group by name  n

2.关于group by的sql_mode

3.group_concat

4.concat

5.关于多表连接语法规则 ****

6.别名

7.distinct

8.select 执行顺序

二.扩展类内容-元数据获取 ****

1.元数据介绍及获取介绍

2.information_schema的基本应用 ***

-- 1. 显示业务库和表的信息

-- 2. 以以下模式 显示所有的库和表的信息

-- 3. 查询所有innodb引擎的表

-- 4. 统计world下的city表占用空间大小 ****

-- 5. 统计world库数据量总大小 ****

-- 6. 统计每个库的数据量大小,并按数据量从大到小排序 ****

3.配合concat()函数拼接语句或命令

-- 1. 模仿以下语句,进行数据库的分库分表备份。

-- 2. 模仿以下语句,进行批量生成对world库下所有表进行操作


前言:

在信息爆炸的时代,数据已成为驱动业务决策、优化运营流程、以及创新服务模式的核心动力。而SQL(Structured Query Language),作为与数据库交互的基石语言,其重要性不言而喻。无论是数据分析师、数据科学家、软件开发者,还是任何需要处理数据的专业人士,掌握SQL都是通往数据世界的必备钥匙。

本章《解锁SQL基础应用新境界:从入门到精通的扩展实践指南》旨在为读者提供一个从SQL基础扎实起步,逐步迈向高级应用的全面指南。我们深知,仅仅掌握SQL的基本语法和查询操作是远远不够的,在实际工作中,面对复杂多变的数据需求,如何高效、准确地运用SQL进行数据提取、转换、加载(ETL),以及进行数据分析与可视化,才是衡量一个数据从业者能力的关键。

因此,本章覆盖了SQL在数据处理、性能优化、高级查询技巧的扩展应用。我们希望通过一系列精心设计的案例和实践练习,帮助读者不仅“知其然”,更“知其所以然”,从而在解决实际问题的过程中,不断提升自己的SQL应用能力和数据思维。


一.group  by

1.group by name  n

2.关于group by的sql_mode

only_full_group_by

说明:

在5.7版本中MySQL sql_mode参数中自带,5.6没有

在带有group by 字句的select中,select 后的条件列(非主键列),要么是group by后的列,要么需要在函数中包裹

实例:导入world库

通过百度网盘分享的文件:world.sql
链接: https://pan.baidu.com/s/1wf9kYbVzQnMnyk5KnFrCKQ 提取码: 9y8c

use world;

select name,population from city group by district;

#报错违反only_full_group_by

关闭only_full_group_by:

select @@sql_mode;

#查看当前sql_mode;

显示信息为:

only_full_group_by,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

仅复制only_full_group_by后面的字段,然后修改mysql配置文件。

vim /etc/my.cnf

在[mysqld]中添加一行:

sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

保存退出

systemctl restart mysqld

再次查看

select name,population from city group by district;

则不会报错,直接执行


3.group_concat

列转行聚合函数

将某个分组内的多个值合并为一个字符串

select user,group_concat(host)  from mysql.user group by user;

4.concat

做列值拼接,用于将两个或多个字符串值连接成一个新的字符串

select concat(user,"@",host)  from mysql.user;

5.distinct

DISTINCT关键字用于返回唯一不同的值。当你对查询结果应用DISTINCT时,它会从结果集中移除重复的行,只保留唯一的行

select count(distinct countrycode)  from city;

注:虽然CONCAT和DISTINCT在功能上有所不同,但它们可以在同一个查询中结合使用,以实现特定的数据处理需求。然而,需要注意的是,DISTINCT是应用于整个选择列表的,而不是单独应用于CONCAT的结果。

例:

-- 假设我们想要获取employees表中所有不同的first_name和last_name的组合,并将它们连接成一个字符串 -- 但由于DISTINCT是应用于整个选择列表的,我们不能直接对CONCAT的结果使用DISTINCT(除非使用子查询或窗口函数等高级技术) -- 下面的查询实际上不会按预期工作,因为它会尝试对整个CONCAT结果应用DISTINCT,而不是对原始列 -- SELECT DISTINCT CONCAT(first_name, ' ', last_name) AS full_name FROM employees; -- 这将返回所有不同的全名组合,但通常这不是我们想要的 --

一个更实用的方法是,如果你想要基于某些连接后的值进行去重,你可能需要使用子查询或GROUP BY(但GROUP BY通常用于聚合函数)

-- 例如,如果你想要知道有哪些不同的全名组合(尽管这通常不是去重的直接用途) SELECT full_name FROM ( SELECT CONCAT(first_name, ' ', last_name) AS full_name FROM employees ) AS subquery GROUP BY full_name; -- 这里GROUP BY实际上是多余的,因为子查询已经生成了唯一的full_name,但它展示了如何结合使用这些概念 -- 或者,如果你只是想要去重的全名列表,直接使用子查询就足够了 SELECT DISTINCT CONCAT(first_name, ' ', last_name) AS full_name FROM employees;


6.别名

表别名 from 表名 as 表别名

列别名  select 列名 as 列别名  


7.关于多表连接语法规则 ****

首先找涉及到的所有表

找到表和表之间的关联列

关联条件写在on后面 A join B  on 关联列

所有需要查询的信息放在select后

其他的过滤条件where  group by  having order by  limit 往最后放

注意:对多表连接中,驱动表选择数据行少的表。后续所有表的关联列尽量是主键或唯一键(表设计),至少建立一个索引


8.select 执行顺序

select  user ,count(name)  from  表   where  列   group by user  having 聚合函数   order by  列 limit 3  offset 1 ;

=========================================================================

二.扩展类内容-元数据获取 ****

1.元数据介绍及获取介绍

元数据是存储在"基表"中。

通过专用的DDL语句,DCL语句进行修改

通过专用视图和命令进行元数据的查询

information_schema中保存了大量元数据查询的视图

show 命令是封装好功能,提供元数据查询基础功能


2.information_schema的基本应用 ***

tables 视图的应用

use information_schema;

desc tables;

TABLE_SCHEMA        表所在的库名

TABLE_NAME     表名

ENGINE     存储引擎

TABLE_ROWS     数据行

AVG_ROW_LENGTH     平均行长度

INDEX_LENGTH        索引长度

例子:

USE information_schema;

DESC TABLES;

-- 1. 显示业务库和表的信息

-- 2. 以以下模式 显示所有的库和表的信息

-- world     city,country,countrylanguage

select table_schema,group_concat(table_name) from tables where table_schema not in ('sys','mysql','information_schema','performance_schema') group by table_schema;

-- 3. 查询所有innodb引擎的表

SELECT table_schema,table_name ,ENGINE

FROM information_schema.tables

WHERE ENGINE='innodb';

-- 4. 统计world下的city表占用空间大小 ****

-- 表的数据量=平均行长度*行数+索引长度

-- AVG_ROW_LENGTH*TABLE_ROWS+INDEX_LENGTH

SELECT table_name,(AVG_ROW_LENGTH*TABLE_ROWS+INDEX_LENGTH)/1024

FROM information_schema.TABLES

WHERE table_schema='world' AND table_name='city';

-- 5. 统计world库数据量总大小 ****

SELECT table_schema,SUM((AVG_ROW_LENGTH*TABLE_ROWS+INDEX_LENGTH))/1024

FROM information_schema.TABLES

WHERE table_schema='world';

-- 6. 统计每个库的数据量大小,并按数据量从大到小排序 ****

SELECT table_schema,SUM((AVG_ROW_LENGTH*TABLE_ROWS+INDEX_LENGTH))/1024 AS total_KB

FROM information_schema.TABLES

GROUP BY table_schema

ORDER BY total_KB DESC ;


3.配合concat()函数拼接语句或命令

例子:

-- 1. 模仿以下语句,进行数据库的分库分表备份。

备份world库下city表:

mkdir -p /bak/

mysqldump -uroot world city >/bak/world_city.sql

查看 

SELECT

CONCAT("mysqldump -uroot -p ",table_schema," ",table_name

," >/bak/",table_schema,"_",table_name,".sql")

FROM information_schema.tables;

-- 2. 模仿以下语句,进行批量生成对world库下所有表进行操作

ALTER TABLE world.city DISCARD TABLESPACE;



SELECT

CONCAT("ALTER TABLE ",table_schema,".",table_name," DISCARD TABLESPACE;")

FROM information_schema.tables

WHERE table_schema='world';


期待您的关注~ 

  • 17
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值