SQL复习专题

请结合B站-技术蛋老师 视频学习

核心语法

一、增:数据库/表格

create

create database 数据库名;#创建表(列名+类型)
mysql> create table eggs_record(-> id int,-> egg_name varchar(10),-> sold date-> );
这里 ,用来隔开列名,最后一列后无(date类型格式 年-月-日)

还可以设置默认条件 NOT NULL、NULL、AUTO_INCREMENT自动递增 
一般情况下会设置 PRIMARY KEY主键,给每一行进行约束,使得MySQL可以更准确找到对应数据,设置其中一个列名为主键,设置后列名的数据需要是唯一的,例:id是递增的,肯定是唯一的,因此会加上主键(主键一定不为NULL)

mysql> create table eggs_record(-> id int primary key auto_increment,-> egg_name varchar(10) not null,-> sold date null-> );
Query OK, 0 rows affected (0.03 sec)mysql> desc eggs_record;
+----------+-------------+------+-----+---------+----------------+
| Field    | Type        | Null | Key | Default | Extra          |
+----------+-------------+------+-----+---------+----------------+
| id       | int         | NO   | PRI | NULL    | auto_increment |
| egg_name | varchar(10) | NO   |     | NULL    |                |
| sold     | date        | YES  |     | NULL    |                |
+----------+-------------+------+-----+---------+----------------+
3 rows in set (0.03 sec)

insert into 数据库名.表格名

mysql> insert into egg.eggs_record (id,egg_name,sold)-> values (1,'鸡蛋','2024-3-25');
Query OK, 1 row affected (0.00 sec)mysql> insert into egg.eggs_record (id,egg_name,sold)-> values (2,'鸭蛋','2024-3-26');
Query OK, 1 row affected (0.00 sec)mysql> insert into egg.eggs_record (id,egg_name,sold)-> values (DEFAULT,'鸭蛋',NULL);
Query OK, 1 row affected (0.00 sec)####  DEFAULT:设置默认值,前面添加了递增的关键字
mysql> select * from eggs_record;
+----+----------+------------+
| id | egg_name | sold       |
+----+----------+------------+
|  1 | 鸡蛋     | 2024-03-25 |
|  2 | 鸭蛋     | 2024-03-26 |
|  3 | 鸭蛋     | NULL       |
+----+----------+------------+
3 rows in set (0.05 sec)

 二、改:更新表格

alter table 需要新增一列

mysql> alter table eggs_record-> add stock int null;
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0mysql> desc eggs_record;
+----------+-------------+------+-----+---------+----------------+
| Field    | Type        | Null | Key | Default | Extra          |
+----------+-------------+------+-----+---------+----------------+
| id       | int         | NO   | PRI | NULL    | auto_increment |
| egg_name | varchar(10) | NO   |     | NULL    |                |
| sold     | date        | YES  |     | NULL    |                |
| stock    | int         | YES  |     | NULL    |                |
+----------+-------------+------+-----+---------+----------------+
4 rows in set (0.03 sec)

update  set where 修改具体数据

mysql> update egg.eggs_record-> set sold = '2024-01-01'-> where id =3;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0mysql> select * from egg.eggs_record;
+----+----------+------------+-------+
| id | egg_name | sold       | stock |
+----+----------+------------+-------+
|  1 | 鸡蛋     | 2024-03-25 | NULL  |
|  2 | 鸭蛋     | 2024-03-26 | NULL  |
|  3 | 鸭蛋     | 2024-01-01 | NULL  |
+----+----------+------------+-------+

三、 删:数据/表格/库

delete from

drop

mysql> delete from egg.eggs_record-> where id = 1;
Query OK, 1 row affected (0.00 sec)mysql> select * from egg.eggs_record;
+----+----------+------------+-------+
| id | egg_name | sold       | stock |
+----+----------+------------+-------+
|  2 | 鸭蛋     | 2024-03-26 | NULL  |
|  3 | 鸭蛋     | 2024-01-01 | NULL  |
+----+----------+------------+-------+
2 rows in set (0.05 sec)

四、查:选择/去重/排序/过滤

用例:新冠感染月份表-汇总表

select * from 表格名

查看具体列数 选择列名

 distinct  不同的 位置紧跟select

 想查询涉及到那些州 (去重

order by 排序  后面+ASC(Ascending)  DESC(从高到低,大到小)

 

 

where 条件 order by 列名  过滤 

SELECT *
FROM Covid_month
WHERE Recovered >= 10000 AND Country != 'Brazil'
ORDER BY Confirmed DESC;

 

 第三个字符为b

五、查:连接 

join

内连接-并集 inner join  + on条件定位 (选择两边所有的数据,两张表合并,合并的时候以国家名作为合并的条件,出来的结果把from的表格放左边,inner join表格放右边,把左右两边的值以某个条件合并在一起)

SELECT *
FROM Covid_month
INNER JOIN Covid_total
ON Covid_month.Country = Covid_total.Country;

 union 并集

一个上一个下合并在一张表里面

左连接 left join

如果需要从表格A左连接表格B,和inner join一样,用on进行定位,左连接的时候会保留左边的表格所有选取的数据,把右边表格符合条件的合并过来

右连接 right join

 AS 定义简写,上下用到的地方都要改为简写

六、工具选择:navicat-选择新建查询-方便练习

七、聚合函数 必须搭配 group by 子句使用

1.计算每个班的人数:select class_name,count(*) from student group by class_name;
2.计算每个班级男生、女生人数:select class_name,sex,count(*) from student group by class_name,sex;
3.计算每个班平均分(重命)select class_name,avg(score) as avg_score from student group by class_name;
4.对id进行降序排序:select * from student order by id desc;

八、其他补充

alter table meishi change column meishi fresh; 改表名
ALTER TABLE student CHANGE COLUMN class_name new_class_name VARCHAR(50);  改字段名
alter table student modify column class_name varchar(60) comment '班级';   改字段属性
update orders1 set product_num=34 ,consumer_name='大理',consumption=345 where id=10; 改字段

备份表   创建相同表结构,在导入源数据

create table eggs_bak like eggs_record;
insert into eggs_bak select * from eggs_record;

九、sql优化 

  1. 避免使用 SELECT *

    我会强调避免在查询中使用 SELECT *,而是明确指定需要检索的列。这样可以减少查询返回的数据量,降低网络传输成本和数据库的负载,并且可以更好地利用索引。
  2. 使用 UNION ALL 代替 UNION

    如果查询中需要使用 UNION 操作符,我会优先选择使用 UNION ALL。因为 UNION ALL 不会进行重复的去重操作,相比于 UNION,它的执行效率更高。
  3. 控制索引的数量

    我会强调控制索引的数量,避免创建过多的索引。虽然索引可以提高查询效率,但是过多的索引会增加数据库的维护成本,影响数据的更新速度,并且可能导致性能下降。
  4. 选择合理的字段类型

    在设计数据库时,我会选择合理的字段类型和长度,以确保数据存储的效率和查询的性能。例如,对于文本型数据,我会根据实际情况选择合适的 VARCHAR 长度,避免过长的字段长度导致存储浪费。
  5. 使用连接查询代替子查询

    我会尽量使用连接查询(JOIN)来代替子查询,因为连接查询通常比子查询执行效率更高。子查询在某些情况下可能会导致数据库的性能问题,特别是在嵌套子查询的情况下。

这些优化技巧都是我在实际工作中经常应用的,通过合理地应用这些技巧,我能够提高数据库系统的性能和查询效率。

【mysql】SQL优化15种方法_mysql sql优化-CSDN博客

数据仓库【SQL优化】-CSDN博客

MySQL 中的 GROUP BY 语句及十二个例子 - 墨天轮

十、面试真题

数据是我自己编的,题目是真题

学生表四个字段 性别 姓名 年龄 班级,统计每个班级男女各有多少名?(完整sql语句)

统计一班男女各有多少名?

把一班学生的姓名按照年龄倒序排序?(desc排序不能和group by,要使用order by)

索引类型

主要有以下几种类型的索引:

  • B-Tree 索引(包括普通索引、唯一索引、组合索引等)
  • 哈希索引
  • 全文索引
  • 空间索引等

索引的作用

  • 加速数据的检索和查询速度。
  • 通过索引,数据库系统可以更快地定位到符合条件的记录,减少了数据库的查询时间,提高了查询效率。
  • 帮助数据库系统优化查询执行计划,减少磁盘 I/O 操作。

索引的工作原理

  • 不同类型的索引有不同的工作原理,但主要的原理是通过数据结构来组织数据,以便快速地检索、定位和访问数据。
  • 例如,B-Tree 索引使用平衡树的结构来组织数据,哈希索引使用哈希表等。
  • 当查询时,数据库系统会先根据索引定位到符合条件的记录,然后再根据定位到的位置获取相关的数据。

索引是越多越好吗?

  • 不是。虽然索引可以提高查询的速度,但索引也会占用额外的存储空间,并且在数据更新时需要额外的维护成本(如插入、更新、删除操作)。
  • 过多的索引可能会导致数据库性能下降,因为在更新数据时需要维护多个索引。
  • 正确的做法是根据实际情况和需求,合理地设计和选择索引,尽量避免创建过多的索引,尤其是那些不经常使用或不必要的索引。

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

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

相关文章

Android熄屏/亮屏,旋转屏幕/横竖屏切换生命周期变化与activity销毁重建

Android熄屏/亮屏,旋转屏幕/横竖屏切换生命周期变化与activity销毁重建 1、熄屏/亮屏 熄屏后,Android生命周期走: onPause onStop 接着点亮Android手机屏幕,生命周期走: onRestart onStart onResume 2、旋转屏幕&…

服务器中有g++,但是查询不到,Command ‘g++‘ not found

有gcc但是查询不到g,gcc版本为9.5.0 (base) zyICML:~$ g -V Command g not found, but can be installed with: apt install g Please ask your administrator. 突然就出现这个问题,导致detectron装不上,现在有时间了专门研究下怎么解决 这…

阿里云8核32G服务器g8y租用优惠价格243.30元/月

阿里云8核32G服务器g8y租用优惠价格243.30元/月,配置云服务器g8y(ecs.g8y.2xlarge)8核32G、按固定带宽1M-5M、可选ESSD云盘40G起,优惠价格243.30元一个月, 阿里云服务器优惠活动 aliyunfuwuqi.com/go/aliyun 阿里云服务…

【重制版】在Android手机上安装kali Linux

前言 由于kali官方的Nethunter2的安装代码因为…无法访问,手头又没有一些受支持的机器3,所以做了这个脚本,供大家使用。 工具 搭载基于Android的手机TermuxVNC Viewer 安装必备软件(如已安装请忽略) 请到 https://www.hestudio.net/post…

公安可视化分析指挥调度平台的构成要素

匠心接单中...8年前端开发和UI设计接单经验,完工项目1000,持续为友友们分享有价值、有见地的干货观点,有业务需求的老铁,欢迎关注发私信。 公安可视化分析指挥调度平台是一个集成了多种技术和功能的综合性平台,主要由…

mysql 日期时间函数

学习了字符串函数,接着学习日期时间函数, 3,日期和时间函数 日期和时间函数主要用来处理日期和时间值,一般的日期函数除了使用DATE类型的参数外,也可以使用DATETIME或者TIMESTAMP类型的参数,但会忽略这些值…

Discuz采集发布插件

Discuz(简称DZ)是一款知名的开源论坛系统,广泛应用于各类网站社区。对于许多站长来说,保持论坛内容的更新是一项挑战,特别是在内容量庞大的情况下。为了解决这个问题,有一类特殊的插件是用于在Discuz论坛中…

康耐视visionpro-CogDistancePointLineTool工具详细说明

CogDistancePointLineTool功能说明: 测量点到线的距离 备注:在“Geometry-Measurement”选项中的所有工具都是测量尺寸或角度工具,包括测量线与线 的角度、点与线的距离、圆与圆的距离等测量工具,工具使用的方法相似。 ①.打开工具栏&#…

Elment ui 动态表格与表单校验 列表数据 组件

组件做个记录&#xff0c;方便以后会用到。 效果&#xff1a; 代码 &#xff1a; <template><el-dialog title"商品详情" :visible.sync"dialogVisible" width"80%"><el-tabs v-model"activeTab"><el-tab-pane…

正弦实时数据库(SinRTDB)的使用(8)-过滤查询

前文已经将正弦实时数据库的使用进行了介绍&#xff0c;需要了解的可以先看下面的博客&#xff1a; 正弦实时数据库(SinRTDB)的安装 正弦实时数据库(SinRTDB)的使用(1)-使用数据发生器写入数据 正弦实时数据库(SinRTDB)的使用(2)-接入OPC DA的数据 正弦实时数据库(SinRTDB)…

通过node 后端实现颜色窃贼 (取出某个图片的主体rgb颜色 )

1.需求 我前端轮播图的背景色 想通过每一张轮播图片的颜色作为背景色 这样的话 需要通过一张图片 取出图片的颜色 这个工作通过前端去处理 也可以通过后端去处理 前端我试了试 color-thief 的插件 但是 这个插件是基于canvas 的模式来的 我需要在小程序中使用这个插件 而且是…

E4440A安捷伦E4440A频谱分析仪

181/2461/8938产品概述&#xff1a; Agilent PSA 系列 E4440A 高性能频谱分析仪提供强大的一键式测量、多功能功能集和领先的技术&#xff0c;可满足您的项目和需求。 Agilent E4440A 频谱分析仪的其他功能和规格包括&#xff1a; 频率范围&#xff1a;3 Hz - 26.5 GHz/-0.19…

汇总:五个开源的Three.js项目

Three.js 是一个基于 WebGL 的 JavaScript 库&#xff0c;它提供了一套易于使用的 API 用来在浏览器中创建和显示 3D 图形。通过抽象和简化 WebGL 的复杂性&#xff0c;Three.js 使开发者无需深入了解 WebGL 的详细技术就能够轻松构建和渲染3D场景、模型、动画、粒子系统等。 T…

Java数据结构-双向不带头非循环链表(模拟实现LinkedList)

目录 1. 双向不带头非循环链表的介绍2. 相关功能的实现2.1 基本框架2.2 size2.3 addFirst2.4 addLast2.5 addIndex2.6 contains2.7 remove2.8 removeAllKey2.9 clear 3. 全部代码 前面我们学习了最简单的链表&#xff1a;单链表&#xff0c;今天我们学习双向不带头非循环链表&a…

分布式图床项目

一、图床架构分析 二、后台数据处理框架 秒传: 如果上传的文件已经在服务器中存在了,就不需要二次上传了,但是服务器会对这个文件的引用计数加一,这样服务器就知道这个文件是多个人持有的。先对上传的文件进行 md5 校验来判断服务器中已经存在相同的文件了(同样的文件拿到…

OpenHarmony无人机MAVSDK开源库适配方案分享

MAVSDK 是 PX4 开源团队贡献的基于 MavLink 通信协议的用于无人机应用开发的 SDK&#xff0c;支持多种语言如 C/C、python、Java 等。通常用于无人机间、地面站与通信设备的消息传输。 MAVLink 是一种非常轻量级的消息传递协议&#xff0c;用于与无人机&#xff08;以及机载无…

[flink 实时流基础]源算子和转换算子

文章目录 1. 源算子 Source1. 从集合读2. 从文件读取3. 从 socket 读取4. 从 kafka 读取5. 从数据生成器读取数据 2. 转换算子基本转换算子&#xff08;map/ filter/ flatMap&#xff09; 1. 源算子 Source Flink可以从各种来源获取数据&#xff0c;然后构建DataStream进行转换…

Day55:WEB攻防-XSS跨站CSP策略HttpOnly属性Filter过滤器标签闭合事件触发

目录 XSS跨站-安全防御-CSP XSS跨站-安全防御-HttpOnly XSS跨站-安全防御-XSSFilter(过滤器的意思) 1、无任何过滤 2、实体化 输入框没有 3、全部实体化 利用标签事件 单引号闭合 4、全部实体化 利用标签事件 双引号闭合 5、事件关键字过滤 利用其他标签调用 双引号闭合…

代码随想录训练营第60天 | LeetCode 84.柱状图中最大的矩形、总结

LeetCode 84.柱状图中最大的矩形 文章讲解&#xff1a;代码随想录(programmercarl.com) 视频讲解&#xff1a;单调栈&#xff0c;又一次经典来袭&#xff01; LeetCode&#xff1a;84.柱状图中最大的矩形_哔哩哔哩_bilibili 思路 代码如下&#xff1a; ​​​​​​总结 感…

代码随想录|Day28|贪心03|1005.K次取反后最大化的数组和、134.加油站、135.分发糖果

1005.K次取反后最大化的数组和 思路&#xff1a; 优先取反 绝对值最大的负数如果没有负数&#xff0c;不断取反 绝对值最小的数&#xff0c;直到次数 K 耗尽 取反最小数有一个优化技巧&#xff1a; 如果 K 为偶数&#xff0c;则取反 K 次后&#xff0c;正负不变。如果 K 为奇数…