《SQL必知必会》笔记

  1. MySQL使用LIMIT现在最多返回多少行

  2. 尽量少用*,以免数据库后期更新会对之前的代码造成影响

  3. ORDER BY 排序

    #排序方向关键词[ASC升序|DESC降序][作用域是其前一个字段]
    SELECT prod_id, prod_price, prod_name
    FROM Products
    ORDER BY prod_price DESC, prod_name;
    #可以按列位置排序[其中2->prod_price,3->prod_name;可以与实际列名混用]
    #由于其指定信息不够明确,平时不建议使用
    SELECT prod_id, prod_price, prod_name
    FROM Products
    ORDER BY 2, 3;
    
  4. 数据应该在哪里过滤?

    • 服务端?SQL语言处理
    • 客户端?开发语言处理,服务器需要发送多余数据,导致带宽资源的浪费,安全性
  5. WHERE子句操作符

    操作符 说明
    BETWEEN X AND Y 在指定的两个值之间[X,Y]
    IS NULL 为NULL
    <> 不等于
  6. AND | OR

    AND的优先级大于OR

    SELECT products.prod_name, products.prod_price
    FROM products
    WHERE vend_id = 'DLL01' OR vend_id = 'BRS01'
    AND prod_price >= 10;
    

    Tips: 如果出现同时又AND|OR条件的情况,建议使用()确定其优先级,可以消除歧义并提高可读性

  7. IN操作符的优点

    • 在有许多合法选项时,IN操作符更加直观
    • 可以与AND和OR操作符组合使用
    • IN操作符一般比一组OR操作符更快
    • 可以包含其他SELECT语句,动态的建立WHERE子句
  8. 通配符过滤

    1. 使用LIKE操作符进行通配符过滤[MySQL会忽略其大小写]

    2. 通配符列表

      含义
      %可被替代为多个字符
      __可被替代为单个字符

      Tip:

      • '%'无法匹配NULL
      • 不要过度使用通配符,如果其他操作可以达到同样的效果,使用其他方法
      • 确实要使用通配符时,尽量不要把他们用在搜索模式的开始处,将其置于开始处,搜索起来最慢
  9. 拼接字段[MySQL不支持'+'或'||']

    1. MySQL使用CONCAT函数实现拼接字段
    2. TRIM函数实现去掉空格[RTRIM右边的空格, LTRIM左边的空格, TRIM两端的空格]
  10. 聚集函数

  11. 过滤分组HAVING

WHERE在分组前进行过滤;HAVING在分组后进行过滤

```sql
SELECT cust_id, COUNT(*) AS orders
FROM orders
GROUP BY cust_id
HAVING COUNT(*)>=2;
```
  1. UNION并集 UNION ALL不去除重复行

  2. INSERT

    指明需要插入的字段名,以免数据库发生变动,产生不必要的后果

    #使用方法2替换方法1的写法
    #方法1
    INSERT INTO customers
    VALUES ('10000006',
            'Toy Land',
            '123 ANy Street',
            'New York',
            'NY',
            '11111',
            'USA',
            NULL,
            NULL);
    #方法2
    INSERT INTO customers(cust_id, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country, cust_contact,
                          cust_email)
    VALUES ('10000006',
            'Toy Land',
            '123 ANy Street',
            'New York',
            'NY',
            '11111',
            'USA',
            NULL,
            NULL);
    
  3. 从一个表复制到另一个表

    create table custcopy as
    SELECT *
    FROM customers;
    
  4. 删除表中的所有行使用TRUNCATE TABLE 替换 DELETE

  5. 更新表[ALTER TABLE]

    #添加字段
    ALTER TABLE vendors
    ADD vend_phone CHAR(20);
    
    #删除字段
    ALTER TABLE vendors
    DROP COLUMN vend_phone;
    
  6. 复杂表的手动删除过程

    1. 用新的列布局创建一个新表
    2. 使用INSERT SELECT语句从旧表复制数据到新表
    3. 校验包含所需数据的新表
    4. 重命名/删除旧表
    5. 重命名新表
    6. 重新创建触发器、存储过程、索引和外键
  7. RENAME

    RENAME TABLE customers TO cuscopy;
    RENAME TABLE cuscopy TO customers;
    
  8. 视图

    1. 优点

      • 重用SQL语句
      • 简化复杂的SQL操作
      • 使用表的一部分而不是整个表
      • 保护数据
      • 更改数据格式和表示[视图可以返回与底层表格式不同的数据]
    2. 缺点

      • 视图不包含数据,每次使用视图的时候都需要处理查询执行时需要的所有检索。若使用了多个联结和过滤创建了复杂的视图或者嵌套了视图,性能可能会下降的很厉害
    3. 规则

      • 视图必须唯一命名
      • 视图数目没有限制
      • 创建视图需要权限
      • 视图可以嵌套
      • 视图无法索引,也不能有关联的触发器或默认值
    4. 创建方法

      CREATE VIEW ProductCustomers AS
      SELECT cust_name, cust_contact, prod_id
      FROM customers,
           orders,
           orderitems
      WHERE customers.cust_id = orders.cust_id
        AND orderitems.order_num = orders.order_num;
      
    5. 功能

      • 封装SELECT语句
      • 简化数据处理
      • 保护基础数据
  9. 存储过程

    1. 优点[简单、安全、高性能]
      • 简化复杂的操作
      • 语句的复用
      • 方便变动的管理
      • 存储过程通常以编译过的形式存储,提高性能
      • 可以编写功能更强更灵活的代码
    2. 缺点
      • 存储过程难以移植
      • 复杂,需要经验
    3. 执行存储过程
  10. 事务处理

    1. 作用:确保原子操作

    2. 术语:

      • 事务:一组SQL语句
      • 回退:撤销指定SQL语句的过程
      • 提交:将未存储的SQL语句过程写入数据库表
      • 保留点:事务处理中设定的临时占位符,可以对其发布回退
    3. 可以回退的语句:INSERT、UPDATE、DELETE

    4. 语句

      START TRANSACTION
      ...
      
  11. 游标

  12. 约束

    1. 唯一约束
    2. 检查约束[CHECK]
  13. 索引

    1. 优点:

      • 改善了检索操作的性能
    2. 缺点:

      • 降低了数据插入、修改和删除的性能
      • 占用大量的存储空间
    3. 语法:

      CREATE INDEX prod_name_ind
      ON products(prod_name);
      
  14. 触发器--特殊的存储过程

    1. 特点:在特定的数据库活动发生后自动执行
    2. 数据访问权限:
      • INSERT操作中的所有新数据
      • UPDATE操作中的所有新数据和旧数据
      • DELETE操作中删除的数据
    3. 用途:
      • 保证数据一致
      • 基于某个表的变动在其他表上执行活动
      • 进行额外的验证并根据需要回退数据
      • 计算计算列的值或更新时间戳
    4. 提醒:约束比触发器快,尽量使用约束

猜你喜欢

转载自www.cnblogs.com/YuanJieHe/p/12593206.html