• SQL – 12.索引 + 13.join


    索引

      • 全表扫描:对数据进行检索(select)效率最差的是全表扫描,就是一条条的找。
      • 如果没有目录,查汉语字典就要一页页的翻,而有了目录只要查询目录即可。为了提高检索的速度,可以为经常进行检索的列添加索引,相当于创建目录
      • 创建索引的方式,在表设计器中点击右键,选择“索引/键”→添加→在列中选择索引包含的列。
      • 使用索引能提高查询效率,但是索引也是占据空间的,而且添加、更新、删除数据的时候也需要同步更新索引,因此会降低Insert、Update、Delete的速度。只在经常检索的字段上(Where)创建索引。
      • (*)即使创建了索引,仍然有可能全表扫描,比如like、函数、类型转换等。

    索引:索引对经常select的字段查询提升速度(特别是数据量大的时候),但会降低Insert、Update、Delete的速度。即使创建了索引,仍然有可能全表扫描,比如like、函数、类型转换等。

    image

    JOIN

    有客户表(T_Customers)和订单表(T_Orders)两个表,客户表字段为:Id、Name、Age,订单表字段为:Id、BillNo、CustomerId,订单表通过CustomerId关联客户表。测试数据见备注。

    先建两张表,T_Customers和T_Orders

    CREATE TABLE [T_Customers](
        [Id] [int] NOT NULL,
        [Name] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL,
        [Age] [int] NULL
    );
    
    INSERT [T_Customers] ([Id], [Name], [Age]) VALUES (1, N'tom', 10);
    INSERT [T_Customers] ([Id], [Name], [Age]) VALUES (2, N'jerry', 15);
    INSERT [T_Customers] ([Id], [Name], [Age]) VALUES (3, N'john', 22);
    INSERT [T_Customers] ([Id], [Name], [Age]) VALUES (4, N'lily', 18);
    INSERT [T_Customers] ([Id], [Name], [Age]) VALUES (5, N'lucy', 18);
    
    CREATE TABLE [T_Orders](
        [Id] [int] NOT NULL,
        [BillNo] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL,
        [CustomerId] [int] NULL);
    
    INSERT [T_Orders] ([Id], [BillNo], [CustomerId]) VALUES (1, N'001', 1);
    INSERT [T_Orders] ([Id], [BillNo], [CustomerId]) VALUES (2, N'002', 1);
    INSERT [T_Orders] ([Id], [BillNo], [CustomerId]) VALUES (3, N'003', 3);
    INSERT [T_Orders] ([Id], [BillNo], [CustomerId]) VALUES (4, N'004', 2);
    INSERT [T_Orders] ([Id], [BillNo], [CustomerId]) VALUES (5, N'005', 2);
    INSERT [T_Orders] ([Id], [BillNo], [CustomerId]) VALUES (6, N'006', 5);
    INSERT [T_Orders] ([Id], [BillNo], [CustomerId]) VALUES (7, N'007', 4);
    INSERT [T_Orders] ([Id], [BillNo], [CustomerId]) VALUES (8, N'008', 5);

    SELECT o.BillNo,c.Name,c.Age from T_Orders as o
    JOIN T_Customers as c on o.CustomerId=c.Id

     image

    问题:要求显示所有年龄大于15岁的顾客购买的订单号、客户姓名、客户年龄。

    SELECT o.BillNo,c.Name,c.Age from T_Orders as o
    JOIN T_Customers as c on o.CustomerId=c.Id
    where c.Age>15

     image

    要求显示年龄大于平均年龄的顾客购买的订单

    select o.BillNo,c.Name,c.Age
    from T_Orders as o
    join T_Customers as c on o.CustomerId=c.Id
    where c.Age>(select AVG(Age) from T_Customers)

    image

  • 相关阅读:
    剑指 Offer 25. 合并两个排序的链表
    53. 最大子序和 动态规划
    121. 买卖股票的最佳时机
    20. 有效的括号
    centos7 常用操作
    树莓派
    golang 学习笔记
    并发 线程 进程
    连接内网问题
    Lamp 高并发优化
  • 原文地址:https://www.cnblogs.com/tangge/p/2648698.html
Copyright © 2020-2023  润新知