4、索引和查询

一、索引

本文参考黑马视频

1、索引的作用与原理

  • 作用:加速数据检索,避免全表扫描。
  • 原理:通过数据结构(如B+树、哈希表)快速定位数据位置,类似书籍的目录。

注意:主键,unique 都会默认的添加索引

2、索引类型

  • 主键索引(PRIMARY KEY):
    • 唯一且非空,不允许重复。
  • 唯一索引(UNIQUE KEY):
    • 字段值必须唯一,但允许有空值。
  • 普通索引(INDEX):
    • 无唯一性约束,仅加速查询。
  • 全文索引(FULLTEXT INDEX):
    • 可以针对值中的某一个单词,但效率不敢恭维。
  • 组合索引:
    • 实质上是将多个字段建到一个索引里,列值的组合必须唯一。
-- 创建索引
ALTER TABLE 表名 ADD INDEX 索引名称 (字段名1, 字段名2, ..., 字段名n);
-- 创建全文索引(几乎不用)
ALTER TABLE 表名 ADD FULLTEXT 索引名称 (字段名1, 字段名2, ..., 字段名n);
-- 查看索引
SHOW INDEX FROM 表名;
-- 删除索引
ALTER TABLE 表名 DROP INDEX 索引名称;
--

3、什么时候使用索引

  • 表中数据庞大。
  • 经常需要检索,经常出现在where子句中的字段。
  • 经常DML操作的字段不建议索引

二、查询

1、表关系

  • 一对多(多对一):
    • 关系:一个部门对应多个员工,一个员工对应一个部门。
    • 实现在多的一方建立外键,指向一的一方的主键

4、索引和查询_第1张图片

  • 一对一:
    • 关系:将一张表的基础字段放在一张表中,其他详情字段放在另一张表中,以提升操作效率。
    • 实现:在任意一方加入外键,关联另外一方的主键,并且设置外键为唯一的(UNIQUE)

4、索引和查询_第2张图片

2、笛卡尔积

  • 产生原因:在MySQL中,当表连接没有指定连接条件时就会产生笛卡尔积。
  • 表现:表A有m行,表B有n行,它们的笛卡尔积将产生m×n行结果

例如(执行以下代码):

SELECT * FROM1,2;

3、多表查询连接分类

3.1、内连接

  • 含义:AB表的交集数据。

4、索引和查询_第3张图片

SELECT 字段 FROM1,表2 WHERE 条件;
SELECT 字段 FROM1 INNER JOIN2 ON 连接条件;

3.2、外连接

  • 左外连接:查询左表所有数据,以及2张表交集部分数据。
SELECT 字段名1, 字段名2, ..., 字段名n FROM 主表 LEFT [OUTER] JOIN 从表 [ON 连接条件];
  • 右外连接:查询右表所有数据,以及2张表交集部分数据。
SELECT 字段名1, 字段名2, ..., 字段名n FROM 从表 RIGHT [OUTER] JOIN 主表 [ON 连接条件];

4、索引和查询_第4张图片

3.3、自连接

  • 含义:当前表与自身的连接查询,自连接必须使用表的别名
SELECT 字段列表 FROM 表A 别名A JOIN 表A 别名B ON 条件;

3.4、联合查询

  • 将多个SELECT语句的结果合并成一个结果集的SQL操作,是处理复杂数据需求的重要工具。
SELECT 字段 FROM 表A 
UNION [ALL 或者 DISTINCT] 
SELECT FROM 表B; 

UNION ALL 是不去重

UNION 是去重

  • 例如
-- 示例数据
CREATE TABLE north_sales (product VARCHAR(50), amount INT);
INSERT INTO north_sales VALUES ('A', 100), ('B', 200), ('C', 300);

CREATE TABLE south_sales (item VARCHAR(50), qty INT);
INSERT INTO south_sales VALUES ('A', 150), ('C', 250), ('D', 350);

-- UNION(去重)
SELECT product, amount FROM north_sales
UNION
SELECT item, qty FROM south_sales;
/*
结果:
product | amount
--------+-------
A       | 100
A       | 150
B       | 200
C       | 250
C       | 300
D       | 350
*/

-- UNION ALL(不去重)
SELECT product, amount FROM north_sales
UNION ALL
SELECT item, qty FROM south_sales;
/*
结果:
product | amount
--------+-------
A       | 100
B       | 200
C       | 300
A       | 150
C       | 250
D       | 350
*/

3.5、子查询

  • 就是嵌套查询。子查询是嵌套在另一个SQL查询中的SELECT语句。
SELECT 列名...
FROM 表名
WHERE 列名 运算符 (SELECT 列名 FROM 表名 [WHERE 条件]);
  • 标量子查询—返回结果为单个值

  • 列子查询—结果为一列

  • 行子查询—结果为一行

  • 表子查询—多行多列

3.5、子查询

  • 就是嵌套查询。子查询是嵌套在另一个SQL查询中的SELECT语句。
SELECT 列名...
FROM 表名
WHERE 列名 运算符 (SELECT 列名 FROM 表名 [WHERE 条件]);
  • 标量子查询—返回结果为单个值

  • 列子查询—结果为一列

  • 行子查询—结果为一行

  • 表子查询—多行多列

你可能感兴趣的:(MySQL,数据库)