MySql 知识大汇总

news2024/12/28 9:08:39

目录

一、常用的数据类型

二、数据库索引

什么是数据库索引

索引的作用

索引是否越多越好

索引的分类

三、sql语句

插入

更新

删除

查询

        普通查询

        子查询

        连表查询

四、常用的一些函数

group by        分组

order by         排序

HAVING 子句        根据条件过滤组

格式化日期或时间——date_format()

limit

count()

IN & BETWEEN

AVG()

DISTINCT        去重

SQL 注入(Injection)


一、常用的数据类型

 int

        存储的范围:-2**32~2**32-1

bigint

        数字范围:-2**63  -   2**63-1

float

        float(m,d),其中m表示有效位,d表示小数位

        有效位就是把当前的小数:12345.12 转变成科学计数法:1.234512*10**5

        m的最大值为7

double

        double(m,d)其中m表示有效位,d表示小数位

        m的最大值为15

decimal

        涉及到金额的时候,使用decimal

        decimal(m,d),其中m表示有效位,d表示小数位

        m的最大值为65

        好处:不会产生精度问题,因为decimal存储的本质是因为它存在的是字符串,所以不会有精度损失的问题

char

        表示固定长度的字符串,长度为255个字节。中文字符占据3-4个字节

varchar

        表示不定长度字符串,长度为 0-65525 个字节

text

        长文本类型,最大长度为64KB

longtext

        极大文本类型,最大长度占据4GB

datetime

        如果当前时区发生更改,datetime类型不会发生更改,与存入的日期保持一致

timestamp

        如果时区发生更改,timestamp类型会耕者失去更改

二、数据库索引

  1. 什么是数据库索引

            数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询,更新数据库中表的数据。除了数据之外,数据库系统还维护为满足特定查找算法的数据结构,这些数据结构以某种方式引用数据,这种数据结构就是索引。简言之,索引就类似于书本,字典的目录。如果将本文看做一个数据库,那么顶部的目录就相当于索引

  2. 索引的作用

    1. 主要目的就是查询过程中的系统性

    2. 通过创建唯一索引,可以保证数据库中索引对应字段的唯一性

    3. 在使用分组和排序子句进行数据检索时,可以减少查询中分组和排序的时间

  3. 索引是否越多越好

    首先:索引并不是创建的越多越好

    1. 创建索引和维护索引要耗费时间,而且时间随着数据量的增加而增

    2. 索引需要占物理空间,如果创建的是聚簇索引,占据的空间会更大

    3. 在对表中数据做增删改的操作时,会消耗跟多的时间,因为索引也需要维护

  4. 索引的分类

    1、主键索引:数据库设置为主键后,会自动创建索引

#随表一起建索引:
CREATE TABLE customer (id INT(10) UNSIGNED ,customer_no VARCHAR(200)
  PRIMARY KEY(id) 
);

#使用AUTO_INCREMENT关键字的列必须有索引(只要有索引就行)。
CREATE TABLE customer2 (id INT(10) UNSIGNED AUTO_INCREMENT, customer_no VARCHAR(200),
  PRIMARY KEY(id) 
);

#单独建主键索引:
ALTER TABLE customer add PRIMARY KEY customer(customer_no);  

#删除建主键索引:
ALTER TABLE customer drop PRIMARY KEY ;  

#修改建主键索引:
#必须先删除掉(drop)原索引,再新建(add)索引

2、普通索引(单列索引):一个索引只包含单个列,一个数据表可以有多个单列索引

#随表一起建索引:
CREATE TABLE customer (id INT(10) UNSIGNED  AUTO_INCREMENT ,customer_no VARCHAR(200),customer_name VARCHAR(200),
  PRIMARY KEY(id),    # 主键索引
  KEY (customer_name)  # 单列索引
);

#随表一起建立的索引 索引名同 列名(customer_name)

#单独建单值索引:
CREATE INDEX idx_customer_name ON customer(customer_name);  # 创建名称为 “idx_customer_name” 的普通索引

#删除索引: 删除名称为“idx_customer_name” 的普通索引
DROP INDEX idx_customer_name ;

3、唯一索引:索引的值必须唯一,但是允许有空值

“UNIQUE” 字段:约束唯一标识数据库表中的每条记录。

#随表一起建索引:
CREATE TABLE customer (id INT(10) UNSIGNED  AUTO_INCREMENT ,customer_no VARCHAR(200),customer_name VARCHAR(200),
  PRIMARY KEY(id),
  KEY (customer_name),
  UNIQUE (customer_no) # 唯一性约束
);

#建立 唯一索引时必须保证所有的值是唯一的(除了null),若有重复数据,会报错。   

#单独建唯一索引:
CREATE UNIQUE INDEX idx_customer_no ON customer(customer_no); 

#删除索引:
DROP INDEX idx_customer_no on customer ;

4、复合索引:一个索引包含多个列;

        在数据库操作期间,相比于多个单列索引,复合索引所需要的开销更小。

使用场景:如果一个表中的数据在查询时有多个字段总是同时出现则这些字段就可以作为复合索引,形成索引覆盖可以提高查询的效率!

-- 随表一起建索引:
CREATE TABLE customer (id INT(10) UNSIGNED  AUTO_INCREMENT ,customer_no VARCHAR(200),customer_name VARCHAR(200),
  PRIMARY KEY(id),    # 主键索引
  KEY (customer_name),    # 单列索引
  UNIQUE (customer_name),    # 单列索引唯一值约束
  KEY (customer_no,customer_name)    # 复合索引
);

#单独建索引:
CREATE INDEX idx_no_name ON customer(customer_no,customer_name); 

#删除索引:
DROP INDEX idx_no_name  on customer ;

5、聚簇索引与非聚簇索引

6、稠密索引与稀疏索引

7、聚集索引于非聚集索引

太多了,从来没有在实际工作中碰到过,我也不知道有什么用,等到哪天如果真的涉及到这些索引的时候,在做具体补充吧

三、sql语句

插入

-- 普通插入
insert into table values('xx','xx','xx')

-- 查询插入
insert into student(name, age, class) select `name`, `age`, `class` from student

更新

-- 和where条件搭配使用
update table set column1_name = value1 where 条件


-- 更新多个列
update table set column1_name = value1, column2_name = value2,...WHERE condition;

删除

-- 删除表
drop 表名


-- 清空表里的内容:删除所有数据,保留表结构,不能撤销还原,速度快
truncate table 表名


-- 删除表,表数据和表结构一起删除,速度快
drop form 表名


-- 删除表里的部分内容:逐行删除,不适合大量数据删除,速度慢
delete from 表名 where 列名="value "

查询

        普通查询

-- 简单查询
Select * from 表名
Select * from 表名 where 条件

        子查询

-- 子查询
-- 子sql查询出来的结果是主sql的条件
Select * from 表名 where(select * from 表名 where 条件)

        连表查询

-- 左连接(left join)
-- 左连接以左表为主,会展示左表所有的数据,右表只展示符合条件的数据
Select  t1.字段1,t2.字段2  From table1 t1
Left join table2  t2 on  t1.id  =  t2.id


-- 右连接(right join)
-- 右连接以右表为主,会展示右表所有数据,左表数据只展示符合条件的数据
Select  t1.字段1,t2.字段2  From table1 t1
right join table2  t2 on  t1.id  =  t2.id


-- 内连接(inner join)
-- 主要是获取两个表中字段匹配关系的表。查询关联字段共同拥有的数据,用两个表相同的字段和内容相关联起来。
select * from table1 as 别名1 
inner join table2 as 别名2 
on 别名1.字段名1=别名2.字段名1;

select * from user as u 
inner join student as s on u.id=s.id;。

-- 全连接(FULL JOIN )
-- 返回连接的表中的所有数据,不管是否匹配

-- 交叉连接(CROSS JOIN)
如果在连接两个表时未指定连接条件,则数据库系统会将第一个表的每一行与第二个表的每一行合并。这种连接称为交叉连接或笛卡尔乘积

四、常用的一些函数

group by        分组

GROUP BY子句与SELECT语句和聚合函数结合使用,以按通用列值将行分组在一起

SELECT t1.dept_name, count(t2.emp_id) AS total_employees
FROM departments AS t1 
LEFT JOIN employees AS t2
ON t1.dept_id = t2.dept_id
GROUP BY t1.dept_name;

order by         排序

通常,当您使用SELECT语句从表中获取数据时,结果集中的行没有任何特定的顺序。如果要按特定顺序排列结果集,则可以在语句末尾指定ORDER BY子句,该子句告诉程序如何对查询返回的数据进行排序。默认排序顺序为升序。

SELECT column_list FROM table_name ORDER BY column_name ASC|DESC;

HAVING 子句        根据条件过滤组

HAVING子句通常与 GROUP BY 子句一起使用,以指定组或集合的过滤条件。HAVING 子句只能与 SELECT 语句一起使用

 例如:现在,不只是查找员工及其部门的名称,还要查找没有员工的部门的名称。

SELECT t1.dept_name, count(t2.emp_id) AS total_employees
FROM departments AS t1 
LEFT JOIN employees AS t2
ON t1.dept_id = t2.dept_id
GROUP BY t1.dept_name
HAVING total_employees = 0;

格式化日期或时间——date_format()

SELECT name, DATE_FORMAT(birth_date, '%M %e, %Y') FROM users;

limit

1、当limit使用一个参数时

        例如:limit 10 

        则表示将表中的前10条数据查询出来,--检索前10行数据

2、当limit使用两个参数时

        例如:limit 2,5

        第一个参数表示从第几行数据开始查,第二个参数表示查几条数据,"limit 2,5";表示从第3行数据开始,取5条数据

***当指定了两个参数时,第一个参数指定要返回的第一行的偏移量,即起点,而第二个参数指定要返回的最大行数。初始行的偏移量是0(不是1)。

count()

COUNT() 函数返回匹配指定条件的行数。

1、COUNT(column_name) 
        函数返回指定列的值的数目(NULL 不计入):

SELECT COUNT(column_name) FROM table_name;

2、SQL COUNT(DISTINCT column_name) 语法

        COUNT(DISTINCT column_name) 函数返回指定列的不同值的数目:

SELECT COUNT(DISTINCT column_name) FROM table_name;

count总结:

        count(*):统计行数,不会忽略null

        count(列名):单独一列符合条件的行数,会忽略空值

        count(1):统计行数,会忽略空值

count 的执行效率

IN & BETWEEN

1、IN运算符是逻辑运算符,用于检查一组值中是否存在特定值。 其基本语法可以通过以下方式给出:

SELECT column_list FROM table_name
WHERE column_name IN (value1, value1,...);

2、between

如果列中的值落在特定范围内,有时您想选择一行。处理数字数据时,这种类型的条件很常见。

要基于这种条件执行查询,您可以利用BETWEEN运算符。它是一个逻辑运算符,可让您指定要测试的范围,如下所示:

SELECT column1_name, column2_name, columnN_name 
FROM table_name 
WHERE column_name BETWEEN min_value AND max_value;

AVG()

AVG() 函数返回数值列的平均值。

SELECT AVG(column_name) FROM table_name

DISTINCT        去重

从数据库表中获取数据时,结果集可能包含重复的行或值。 如果要删除这些重复的值,可以在SELECT关键字之后直接指定关键字DISTINCT,如下所示:

SELECT DISTINCT column_list FROM table_name;

SQL 注入(Injection)

什么是sql注入

SQL注入是一种攻击,攻击者可以通过浏览器向应用程序服务器输入的数据(例如Web表单输入)注入或执行恶意SQL代码。

SQL 注入(Injection) - 基础教程在线

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

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

相关文章

5、传输层UDP28

传输层:负责俩端之间的数据传输(TCP&UDP) UDP协议:协议格式(协议实现)、协议特性、编程影响 一、协议格式(协议实现) 面试:传输层的数据结构是什么? 就是…

1.计算机系统概述

1.1 计算机发展历程 1.1.1计算机硬件的发展 1.逻辑元件的四代变化: 电子管->晶体管->中小规模集成电路->超大规模集成电路 第四代计算机时代产生了微处理器,是微型计算机发展的标志。 2. 计算机元件的更新换代 如半导体存储器、微处理器都在不断…

IDEA配置maven国内源

这里写目录标题 前言注意第一步 前言 为什么要配置maven国内源, 因为如果不配置国内源,一个是依赖加载速度过慢, 另一个是可能会导致创建spring / Springboot创建失败,或者是在maven项目中引入jar包失败,从而导致项目运行失败 注意 配置要配置俩次 第一步 选择settings …

【复习8-9天内容】【我们一起60天准备考研算法面试(大全)-第十三天 13/60】

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客,如有问题交流,欢迎评论区留言,一定尽快回复!(大家可以去看我的专栏,是所有文章的目录)   文章字体风格: 红色文字表示&#…

数字检测Y8S

【免费】数字检测Y8S,只需要OPENCV-深度学习文档类资源-CSDN文库 采用YOLOV8训练,得到PT模型,然后直接转ONNX,使用OPENCV的DNN,不需要其他依赖,支持C/PYTHON

【CodeWhisperer】 亚马逊AI辅助代码生成工具

Amazon CodeWhisperer 定价 Amazon CodeWhisperer 直接在集成式开发环境 (IDE) 中为开发人员提供实时代码建议。个人开发人员可以免费使用 CodeWhisperer。组织为使用 CodeWhisperer 按“每位用户每月”支付固定的订阅费,无需预付费用或长期承诺。 CodeWhisperer 提…

Docker安装tomcat

docker hub上面查找tomcat镜像 docker search tomcat 从docker hub上拉取tomcat镜像到本地 docker pull tomcat docker images查看是否有拉取到的tomcat docker images 使用tomcat镜像创建容器实例(也叫运行镜像) docker run -d -p 8080:8080 tomcat 说明 -p 小写,…

GPipe:微批量流水线并行

论文标题:GPipe: Easy Scaling with Micro-Batch Pipeline Parallelism论文链接:https://arxiv.org/abs/1811.06965论文来源:Google 一、概述 如下图所示,近过去十年中,由于开发了促进神经网络有效容量扩大的方法&…

【Unity3D】伽马校正

1 伽马相关概念 1.1 人眼对亮度变化的感知 人眼对亮度变化的感知不是线性的,如下图,人眼对亮区的亮度变化不太敏感,对暗区的亮度变化较敏感。另外,我们可以想象一下,在一个黑暗的房间里,由 1 根蜡烛到 2 根…

【改进粒子群优化算法】基于惯性权重和学习因子动态调整的粒子群算法【期刊论文复现】(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

面试题之MySQL事物的特性

在关系性数据库管理系统配置,一个逻辑工作要成为事物,必须要满足4个特性,即所谓的ACID:原子性(Atomicity),一致性(Consistency)、隔离性(lsolation)和持久性(Durability)。 原子性: 原子性:事物作为一个整体被执行,包含在其中对…

Redis - 为什么我要来安利你学习 Redis ?

目录 前言 一、Redis 的特性(优点) 1. Redis 是在内存中存储数据的 2.可编程性 3.可扩展性 4.持久化 5.支持集群 6.高可用 二、Redis 为什么快? 三、 Redis 使用场景 优势场景 1.将 Redis 当作数据库 2.作为缓存和存储 session …

【数据分享】1929-2022年全球站点的逐日平均压力数据(Shp\Excel\12000个站点)

气象数据是在各项研究中都经常使用的数据,气象指标包括气温、风速、降水、能见度等指标,说到气象数据,最详细的气象数据是具体到气象监测站点的数据! 对于具体到监测站点的气象数据,之前我们分享过1929-2022年全球气象…

【LeetCode每日一题合集】2023.7.10-2023.7.16(dfs 换根DP)

文章目录 16. 最接近的三数之和排序 双指针 1911. 最大子序列交替和解法——动态规划 2544. 交替数字和(简单模拟)931. 下降路径最小和(线性DP)979. 在二叉树中分配硬币⭐⭐⭐⭐⭐(dfs)算法分析补充&#…

PWM呼吸灯+流水灯设计

完成任务: 在流水灯基础上加入pwm呼吸灯设计,关于pwm呼吸灯设计可以看博主上一篇博客PWM呼吸灯设计 ,开发板上灯每两秒进行一次切换,每一个的亮灭间隔为一秒。 代码参考: module pwm_led_change(input wire …

软件测试人员和程序开发人员是死对头吗?

这两天闲来无事刷知乎,看到有些朋友问到关于测试与开发的关系,在这里想和大家稍微来聊一聊这个事儿。 有的人说呢,测试和开发是死对头;也有人说测试和开发是处在对立面的;还有人说测试与开发两者都不能互相理解。当然&…

再战算法-奋进

再战算法-奋进 算法入门痛苦经历总结收获 算法入门 在大学期间我直至觉得【算法】是很重要的一项,最开始接触的是c语言,算是第一门接触的,给了我很大的惊喜🥰,大二下的时候开始接触到Java语言,通过Java的入…

【C++进阶】C++11基础

文章目录 一、C11简介二、统一的列表初始化1. {}初始化2、std::initializer_list 三、 声明1.auto2. decltype3.nullptr 三、范围for 一、C11简介 在2003年C标准委员会曾经提交了一份技术勘误表(简称TC1),使得C03这个名字已经取代了C98称为C…

Python3实现画小提琴图(包含分组)

说在前面 Python如何画一个小提琴图呢?先看下必备的数据集合(自己构建,样式参考) 默认必有X列、Y列(数值),画分组需要包含分组的列group等数据参数准备 可以参考下面的数据样例: 除此之外,对于画图使用的参数,提前准备的知识如下: sns.violinplot所必备的参数…

数据结构-堆排序代码实现(详解)

内容:堆排序的代码实现及注解,思路详解 代码实现: 交换函数: void Swap(int* p1, int* p2) {int tmp *p1;*p1 *p2;*p2 tmp; } 堆排序函数: 1 向下调整建堆函数:这里建立大堆,小堆思路也…