美文网首页
MySQL必知必会读书笔记

MySQL必知必会读书笔记

作者: 猴子精h | 来源:发表于2018-08-25 11:11 被阅读22次

MySQL 必知必会用例

where

  1. where 必须放在 order by 之前。
  2. 在建表时,可以指定其中的列是否可以不包含值。在一个列不包含值时,称其为 Null , 它与 0, 空字符串不同。通过 where is NULL 可以查询出 Null 值的列。

通配符

  1. % 通配符搜索是区分大小写,匹配除 NULL 之外的0个,1个或多个字符。
  2. _ 只匹配单个字符。

使用正则进行搜索

where 字句中使用 REGEXP 替换 LIKE。 可以使用 REGEXP BINARY 来区分大小写。

日期

MySQL 支持的日期类型

日期时间类型 占用空间 日期格式 最小值 最大值 零值表示
DATETIME 8 bytes YYYY-MM-DD HH:MM:SS 1000-01-01 00:00:00 9999-12-31 23:59:59 0000-00-00 00:00:00
TIMESTAMP 4 bytes 时间戳 19700101080001 2038 年的某个时刻 00000000000000
DATE 4 bytes YYYY-MM-DD 1000-01-01 9999-12-31 0000-00-00
TIME 3 bytes HH:MM:SS -838:59:59 838:59:59 00:00:00
YEAR 1 bytes YYYY 1901 2155 0000
  1. MySQL 使用的日期格式 yyyy-mm-dd,不管是插入或更新表值还是用 WHERE 子句进行过滤都必须使用这个格式。
  2. 如果要的是日期,请使用Date(),如果一个字段类型是 DATETIME,在 WHERE 过滤时 WHERE Date(order_date) = '2010-01-01'
  3. 如果是过滤一个时间范围。
    1. 使用 BETWEENWHERE Date(order_date) BETWEEN '2015-09-01' AND '2015-09-30'
    2. WHERE Year(order_date) = 2015 AND Month(order_data) = 9

分组

SELECT 字句顺序表

子句 说明 是否必须使用
SELECT 要返回的列或者表达式
FROM 从中检索数据的表 仅在从表选择数据时使用
WHERE 行级过滤
GROUP BY 分组说明 仅在按组计算聚合时使用
HAVING 组级别过滤
ORDER BY 输出排序
LIMIT 要检索的行数

GROUP BY 子句的一些规范:

  1. GROUP BY 必须在 WHERE 之后 ORDER BY 之前。
  2. 除聚合函数外,SELECT 语句中的每个列都必须在 GROUP BY 子句中给出。
  3. 如果分组中列具有 NULL,则 NULL 将作为一个分组返回。

使用 HAVING 对分组结果过滤,原来对行结果过滤的语法均可用。

SELECT cust_id, COUNT(*) AS orders
FROM orders
GROUP_BY cust_id
HAVING COUNT(*) >= 2;

子查询

子查询即嵌套在其他查询中的查询。子句查询总是从内向外处理。

-- 查询出商品是 TNT2 的订单号

SELECT order_num 
FROM orderitems
WHERE prod_id = 'TNT2';

-- 根据订单号查询出客户ID
SELECT cust_id 
FROM orders
WHERE order_num IN (20005, 20007);

-- 使用子查询完成上面两个步骤, 子句查询总是从内向外处理
SELECT cust_id
FROM orders
WHERE order_num IN (SELECT order_num
            FROM orderitems
            WHERE prod_id='TNT2');

使用子查询的另一个方法是创建计算字段。

SELECT  cust_name,
    cust_state,
    (SELECT COUNT(*)
    FROM orders
    WHERE orders.cust_id = customers.cust_id) AS orders
FROM customers
ORDER BY cust_name;

orders 是一个计算字段,它由圆括号中的子查询建立。该子查询对检索出的每个客户执行一次。

联结表

SQL 最强大的功能之一就是能在数据检索查询的执行中联结(join)表。有效地使用联结之前,必须先了解关系表以及关系数据库设计的一些基础知识。

关系表的设计就是要保证把信息分解成多个表,一类数据一个表。各表通过某些常用的值(即关系设计中的关系(relational)互相关联)。

外键(foreign key)为某个表中的一列,它包含另一个表的主键值,定义了两个表之间的关系。

创建联结

规定要联结的所有表以及它们如何关联即可。请看下面例子:

SELECT vend_name, prod_name, prod_price
FROM vendors, products
WHERE vendors.vend_id = products.vend_id
ORDER BY vend_name, prod_name;

内部联结

目前为止所用的联结称为等值联结(equijoin),它基于两个表之间的相等测试。这种联结也称为内部联结。对于这种联结可以使用稍微不同的语法来明确指定联结类型。下面的语句将返回与前面例子一样的结果:

ANSI SQL 规范首选 INNER JOIN 语法。

SELECT vend_name, prod_name, prod_price
FROM vendors INNER JOIN products
ON vendors.vend_id = products.vend_id;

联结多个表

MySQL 在运行时关联指定的每个表以处理联结。这种处理可能是非常耗资源的,因此应该仔细,不要联结不必要的表。

SELECT prod_name, vend_name, prod_price, quantity
FROM orderitems, products, vendors
WHERE products.vend_id = vendors.vend_id
    AND orderitems.prod_id = products.prod_id
    AND order_num = 20005;

组合查询 UNION

MySQL 允许执行多个查询(多条 SELECT 语句),并将结果作为单个结果集返回。这些组合查询统称为并或复合查询。多条 SELECT 语句必须返回类似结构的数据。

SELECT vend_id, prod_id, prod_price
FROM products
WHERE prod_price <= 5;

SELECT vend_id, prod_id, prod_price
FROM products
WHERE vend_id IN (1001, 1002);

-- 将上面的两个查询使用 UNION 合并成一个查询返回
SELECT vend_id, prod_id, prod_price
FROM products
WHERE prod_price <= 5

UNION

SELECT vend_id, prod_id, prod_price
FROM products
WHERE vend_id IN (1001, 1002);

插入数据

插入多行

-- 插入多行
INSERT INTO customers(cust_name,
    cust_address,
    cust_city,
    cust_state,
    cust_zip,
    cust_country)
VALUES(
    'Pep E. LaPew',
    '100 Main Street',
    'Los Angeles',
    'CA',
    '90046',
    'USA'
),(
    'Pep E. LaPewz',
    '100 Main Street',
    'Los Angeles',
    'CA',
    '90046',
    'USA'
);

插入搜索出的数据

-- insert select
INSERT INTO customers(cust_id,
    cust_contact,
    cust_email,
    cust_name,
    cust_address,
    cust_city,
    cust_state,
    cust_zip,
    cust_country)
SELECT cust_id,
    cust_contact,
    cust_email,
    cust_name,
    cust_address,
    cust_city,
    cust_state,
    cust_zip,
    cust_country
FROM custnew;

删除

删除是删除内容,而不是表

DELETE FROM customers
WHERE cust_id = 10006;

更快的删除 如果想从表中删除所有的行,不要使用 DELETE,可以使用 TRUNCATE TABLE 语句,它的速度更快(TRUNCATE 实际删除原来的表并新建一张表,而不是逐行删除)

AUTO_INCREMENT

如果在使用 AUTO_INCREMENT 列时获取到这个值呢?可以使用 last_insert_id() 函数获取这个值,此语句返回最后一个 AUTO_INCREMENT 的值。

存储过程

可以把存储过程看成一个函数

查看存储过程的详情。

-- 查看存储过程的详情
SHOW PROCEDURE STATUS;

一般存储过程并不显示结果,而是把结果返回给你指定的变量。

-- 存储过程, DELIMITER 指定结束符
DELIMITER //

CREATE PROCEDURE productpricing()
BEGIN
    SELECT AVG(DISTINCT prod_price) AS priceaverage
    FROM products;
END //

DELIMITER ;

-- 调用存储过程
CALL productpricing();

-- 删除存储过程
DROP PROCEDURE IF EXISTS productpricing;

带参数的存储过程

DELIMITER //

CREATE PROCEDURE ordertotal(
   -- 关键字 IN 代表输入的参数
   IN onumber INT,
   -- 关键字 OUT 代表输出的参数
   OUT ototal DECIMAL(8,2)
)
BEGIN
   SELECT SUM(item_price*quantity)
   FROM orderitems
   WHERE order_num = onumber
   -- INTO 表示保存到相应的变量
   INTO ototal;
END //

DELIMITER ;

-- 所有 MySQL 的变量必须是@开头
CALL ordertotal(20005, @total);

SELECT @total;

事务处理

用来维护数据库的完整性,它保证成批的 MySQL 操作要么完全执行,要么完全不执行。如果执行的过程中发生错误,则进行回退以恢复到某个已知的且安全的状态。

使用事物和事物处理时,有几个术语需要知道:

  1. 事物(transaction)指一组 SQL 语句。
  2. 回退(rollback)指撤销指定 SQL 语句的过程。
  3. 提交(commit)指将未存储的 SQL 语句的结果写入数据库表。
  4. 保留点(savepoint)指事务处理中设置的临时占位符,你可以对它发布回退(与回退整个事务处理不同)。

事务可以用来管理 INSERT,UPDATE,DELETE (DML语句)。你不能回退 CREATE,DROP (DDL语句),SELECT。

使用 START TRANSACTION 表示事物开始。

-- 事物
SELECT * FROM customers;
START TRANSACTION;
DELETE FROM customers;
SELECT * FROM customers;
ROLLBACK;
SELECT * FROM customers;

COMMIT 一般来说执行了 SQL 就会立即执行,这是因为包含了隐含提交(implicit commit),即提交(写或保存)操作是自动进行的。但是在事物中,提交不会隐含进行,必须明确指定。当 COMMITROLLBACK 执行后,事物会自动关闭。

START TRANSACTION;
DELETE FROM orderitems WHERE order_num = 20010;
DELETE FROM orders WHERE order_num = 20010;
COMMIT;

使用保留点 SAVEPOINT 来可以指定回滚的位置

START TRANSACTION;
DELETE FROM customers WHERE cust_id = 10006;
-- 回退至此,执行到 DELETE 语句为止
SAVEPOINT delete1;
DELETE FROM customers WHERE cust_id = 10007;
ROLLBACK TO delete1;

相关文章

  • MySql 创建和操纵表

    创建表 更新表 参考书籍: MySQL必知必会

  • mysql必知必会

    2018年7月13日笔记 1.数据库的介绍 1.1 什么是数据库 数据库是按照数据结构来组织、存储和管理数据的仓库...

  • Mysql必知必会

    1.表中的任何列都可以作为主键, 只要它满足以下条件:任意两行都不具有相同的主键值;每一行都必须具有一个主键值( ...

  • MySQL必知必会

    分页 方式1:select * from table order by id limit m, n;该语句的意思为...

  • 《Mysql必知必会》

    厚道的人运气都不会太差,我们永远相信会有美好的事情发生

  • 必知必会 - Mysql

    存储引擎InnoDB InnoDB 底层存储结构为B+树, B树的每个节点对应innodb的一个page,page...

  • Mysql必知必会!

    数据库 1. 数据库概述 1.1 数据库概述 什么是数据库 数据库就是存储数据的仓库,其本质是一个文件系统,数据按...

  • MYSQL必知必会

    第一章:了解SQL 数据库概念、表、列和数据类型、行、主键 第二章:MYSQL简介 1、mysql是一种DBMS(...

  • mysql必知必会

    title: mysql必知必会date: 2019-11-21tags: 笔记categories: sql ...

  • MySQL 必知必会

    使用MySQL ​ use 和 show 的基本使用 返回可用数据库的一个列表show database...

网友评论

      本文标题:MySQL必知必会读书笔记

      本文链接:https://www.haomeiwen.com/subject/arnwiftx.html