-- MySQL 必知必会第3章
SHOW DATABASES;
SHOW tables;
-- SHOW COLUMNS要求给出一个表名(这个例子中的FROMcustomers),
-- 它对每个字段返回一行,行中包含字段名、数据类型、是否允许NULL、键信息、默认值以及其他信息
-- DESCRIBE 为快捷语句
DESC customers;
-- 进一步了解SHOW请在mysql命令行实用程序中,执行命令HELP SHOW;显示允许的SHOW语句。
-- 第4章 检索数据
-- 检索一列,如无必要,不应使用select *,效率较低
SELECT prod_name FROM products;
-- SELECT DISTINCT vend_id告诉MySQL只返回不同(唯一)的vend_id行,
-- DISTINCT 必须直接放在列名的前面。
-- 不能部分使用DISTINCT DISTINCT关键字应用于所有列而不仅是前置它的列。
-- 如果给出SELECT DISTINCT vend_id, prod_price,
-- 除非指定的两个列都不同,否则所有行都将被检索出来。
SELECT DISTINCT vend_id FROM vendors;
-- SELECT语句返回所有匹配的行,它们可能是指定表中的每个行。
-- 为了返回第一行或前几行,可使用LIMIT子句。
SELECT DISTINCT vend_id FROM vendors LIMIT 2;
--当 limit和offset组合使用的时候,limit后面只能有一个参数,表示要取的的数量
-- offset表示要跳过的数量。
SELECT DISTINCT vend_id FROM vendors LIMIT 2 OFFSET 1;
-- 第5章 排序检索数据
SELECT prod_name FROM products ORDER BY prod_name;
-- 多个列排序时,排序完全按所规定的顺序进行。
-- 换句话说,对于上述例子中的输出,
-- 仅在多个行具有相同的prod_price值时才对产品按prod_name进行排序。
-- 如果prod_price列中所有的值都是唯一的,则不会按prod_name排序。
SELECT prod_id, prod_name, prod_price
FROM products
ORDER BY prod_price, prod_name;
-- 指定排序方向
-- DESC关键字只应用到直接位于其前面的列名。如下,
-- 只对prod_price列指定DESC,对prod_name列不指定。
-- 因此,prod_price列以降序排序,
-- 而prod_name列(在每个价格内)仍然按标准的升序排序。
SELECT prod_id, prod_name, prod_price
FROM products
ORDER BY prod_price DESC, prod_name;
-- 第6章 过滤数据
-- 使用where子句过滤数据
-- where支持的基本操作符包括=, !=, >, <, BETWEEN...AND(包括边界)
SELECT prod_id, prod_name, prod_price
FROM products
WHERE prod_price > 30
ORDER BY prod_price DESC, prod_name;
-- 空值NULL
-- 在通过过滤选择出不具有特定值的行时,
-- 你可能希望返回具有NULL值的行。但是,不行。因为未知具有特殊的含义,
-- 数据库不知道它们是否匹配,所以在匹配过滤或不匹配过滤时不返回它们。
SELECT cust_id, cust_name, cust_email
FROM customers
WHERE cust_email IS NULL;
-- WHERE cust_email is NOT NULL;
-- 第7章 WHERE组合语句
-- MySQL允许给出多个WHERE子句。这些子句可以两种方式使用:
-- 以AND子句的方式或OR子句的方式使用。
SELECT vend_id, prod_id, prod_name, prod_price
FROM products
WHERE prod_price > 30 or vend_id = 1001
ORDER BY prod_price DESC, prod_name;
-- IN操作符用来指定条件范围,范围中的每个条件都可以进行匹配。
-- IN取合法值的由逗号分隔的清单,全都括在圆括号中
-- 可以配合not使用
SELECT vend_id, prod_id, prod_name, prod_price
FROM products
WHERE vend_id NOT IN (1001, 1003)
ORDER BY prod_price DESC, prod_name;
-- 第8章 使用通配符进行过滤
-- 通配符本身实际是SQL的WHERE子句中有特殊含义的字符,SQL支持几种通配符。
-- 为在搜索子句中使用通配符,必须使用LIKE操作符。
-- 最常使用的通配符是百分号(%)。在搜索串中,%表示任何字符出现任意次数。
-- 重要的是要注意到,除了一个或多个字符外,%还能匹配0个字符。
-- %代表搜索模式中给定位置的0个、1个或多个字符。
-- 虽然似乎%通配符可以匹配任何东西,但有一个例外,即NULL。
-- 即使是WHERE prod_name LIKE'%’也不能匹配用值NULL作为产品名的行
-- 根据MySQL的配置方式,搜索可以是区分大小写的。
-- 如果区分大小写,'jet%’与JetPack 1000将不匹配。
SELECT vend_id, prod_id, prod_name, prod_price
FROM products
WHERE prod_name LIKE 'jet%'
ORDER BY prod_price DESC, prod_name;
-- 另一个有用的通配符是下划线(_)。
-- 下划线的用途与%一样,但下划线只匹配单个字符而不是多个字符。
SELECT vend_id, prod_id, prod_name, prod_price
FROM products
WHERE prod_name LIKE '_ ton anvil'
ORDER BY prod_price DESC, prod_name;
-- 第9章 使用正则表达式过滤数据
-- LIKE匹配整个列。如果被匹配的文本在列值中出现,
-- LIKE将不会找到它,相应的行也不被返回(除非使用通配符)。
-- 而REGEXP在列值内进行匹配,
-- 如果被匹配的文本在列值中出现,REGEXP将会找到它,相应的行将被返回。
-- 这是一个非常重要的差别。
-- 使用^和$,REGEXP就可以用来匹配整个列值(从而起与LIKE相同的作用)
-- 基本字符匹配,含有该字符的列都会返回
SELECT vend_id, prod_id, prod_name, prod_price
FROM products
WHERE prod_name REGEXP 'ton anvil'
ORDER BY prod_price DESC, prod_name;
-- OR匹配(注意|左右两侧的空格)
SELECT vend_id, prod_id, prod_name, prod_price
FROM products
WHERE prod_name REGEXP 'ton anvil|1000|2000'
ORDER BY prod_price DESC, prod_name;
-- 匹配几个字符之一
-- 可通过指定一组用[和]括起来的字符来完成
-- 字符集合也可以被否定,即,它们将匹配除指定字符外的任何东西。
-- 为否定一个字符集,在集合的开始处放置一个^即可。
-- 因此,尽管[123]匹配字符1、2或3,但[^123]却匹配除这些字符外的任何东西。
SELECT vend_id, prod_id, prod_name, prod_price
FROM products
WHERE prod_name REGEXP 'ton anvil|[^13]000'
ORDER BY prod_price DESC, prod_name;
-- 匹配范围
-- [0123456789]为简化这种类型的集合,可使用-来定义一个范围。
SELECT vend_id, prod_id, prod_name, prod_price
FROM products
WHERE prod_name REGEXP 'ton anvil|[1-3]000'
ORDER BY prod_price DESC, prod_name;
-- 匹配特殊字符
-- 为了匹配特殊字符,必须用\\为前导。\\-表示查找-, \\.表示查找.。
SELECT vend_id, prod_id, prod_name, prod_price
FROM products
WHERE prod_name REGEXP '\.'
ORDER BY prod_price DESC, prod_name;
-- 匹配多个实例
-- +,?,*,{n}等正则表达式用法,不再一一列举
-- 定位符$,^
-- 简单的正则表达式测试
-- 可以在不使用数据库表的情况下用SELECT来测试正则表达式。
-- REGEXP检查总是返回0(没有匹配)或1(匹配)。
-- 可以用带文字串的REGEXP来测试表达式,并试验它们。
SELECT 'hello' REGEXP '[a-f]';
-- 第10章 创建计算字段
-- 存储在表中的数据可能不是应用程序所需要的。
-- 我们需要直接从数据库中检索出转换、计算或格式化过的数据;
-- 而不是检索出数据,然后再在客户机应用程序或报告程序中重新格式化。
-- 这就是计算字段发挥作用的所在了。与前面各章介绍过的列不同,
-- 计算字段并不实际存在于数据库表中。
-- 计算字段是运行时在SELECT语句内创建的。
-- 使用拼接字段, 可以使用AS重命名
SELECT CONCAT(vend_name, '(', vend_country, ')') AS vend_title
FROM vendors
ORDER BY vend_name;
-- 执行算术计算
SELECT prod_id, quantity, item_price,
quantity * item_price as total
FROM orderitems;
--如何测试计算
-- SELECT提供了测试和试验函数与计算的一个很好的办法。
-- 虽然SELECT通常用来从表中检索数据,
-- 但可以省略FROM子句以便简单地访问和处理表达式。
-- 例如,SELECT 3*2;将返回6, SELECT Trim('abc');将返回abc,
-- 而SELECT Now()利用Now()函数返回当前日期和时间。
-- 通过这些例�