示例脚本

mysql_scripts.zip

创建数据库

创建

  1. CREATE DATABASE IF NOT EXISTS crashcourse default CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

查看创建的信息

  1. SHOW CREATE DATABASE crashcourse;
  1. +-------------+---------------------------------------------------------------------------------------------------------------------------------------+
  2. | Database | Create Database |
  3. +-------------+---------------------------------------------------------------------------------------------------------------------------------------+
  4. | crashcourse | CREATE DATABASE `crashcourse` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci */ /*!80016 DEFAULT ENCRYPTION='N' */ |
  5. +-------------+---------------------------------------------------------------------------------------------------------------------------------------+

选择数据库

显示所有数据库

  1. SHOW DATABASES;
  1. +--------------------+
  2. | Database |
  3. +--------------------+
  4. | crashcourse |
  5. | information_schema |
  6. | mismatch |
  7. | mysql |
  8. | performance_schema |
  9. | sample |
  10. | sys |
  11. +--------------------+

使用数据库

  1. # USE database
  2. USE crashcourse;
  1. Database changed

获取表

  1. SHOW TABLES;
  1. +-----------------------+
  2. | Tables_in_crashcourse |
  3. +-----------------------+
  4. | customers |
  5. | orderitems |
  6. | orders |
  7. | productnotes |
  8. | products |
  9. | vendors |
  10. +-----------------------+

显示列

  1. # SHOW COLUMNS FROM table;
  2. # DESCRIBE customers;
  3. SHOW COLUMNS FROM customers;
  4. DESCRIBE customers;
  1. +--------------+-----------+------+-----+---------+----------------+
  2. | Field | Type | Null | Key | Default | Extra |
  3. +--------------+-----------+------+-----+---------+----------------+
  4. | cust_id | int(11) | NO | PRI | NULL | auto_increment |
  5. | cust_name | char(50) | NO | | NULL | |
  6. | cust_address | char(50) | YES | | NULL | |
  7. | cust_city | char(50) | YES | | NULL | |
  8. | cust_state | char(5) | YES | | NULL | |
  9. | cust_zip | char(10) | YES | | NULL | |
  10. | cust_country | char(50) | YES | | NULL | |
  11. | cust_contact | char(50) | YES | | NULL | |
  12. | cust_email | char(255) | YES | | NULL | |
  13. +--------------+-----------+------+-----+---------+----------------+

检索数据

检索单个列

  1. SELECT prod_name FROM products;
  1. +----------------+
  2. | prod_name |
  3. +----------------+
  4. | .5 ton anvil |
  5. | 1 ton anvil |
  6. | 2 ton anvil |
  7. | Detonator |
  8. | Bird seed |
  9. | Carrots |
  10. | Fuses |
  11. | JetPack 1000 |
  12. | JetPack 2000 |
  13. | Oil can |
  14. | Safe |
  15. | Sling |
  16. | TNT (1 stick) |
  17. | TNT (5 sticks) |
  18. +----------------+

检索多个列

  1. SELECT prod_id, prod_name, prod_price FROM products;
  1. +---------+----------------+------------+
  2. | prod_id | prod_name | prod_price |
  3. +---------+----------------+------------+
  4. | ANV01 | .5 ton anvil | 5.99 |
  5. | ANV02 | 1 ton anvil | 9.99 |
  6. | ANV03 | 2 ton anvil | 14.99 |
  7. | DTNTR | Detonator | 13.00 |
  8. | FB | Bird seed | 10.00 |
  9. | FC | Carrots | 2.50 |
  10. | FU1 | Fuses | 3.42 |
  11. | JP1000 | JetPack 1000 | 35.00 |
  12. | JP2000 | JetPack 2000 | 55.00 |
  13. | OL1 | Oil can | 8.99 |
  14. | SAFE | Safe | 50.00 |
  15. | SLING | Sling | 4.49 |
  16. | TNT1 | TNT (1 stick) | 2.50 |
  17. | TNT2 | TNT (5 sticks) | 10.00 |
  18. +---------+----------------+------------+

检索所有列

SELECT * FROM products;

  1. +---------+---------+----------------+------------+----------------------------------------------------------------+
  2. | prod_id | vend_id | prod_name | prod_price | prod_desc |
  3. +---------+---------+----------------+------------+----------------------------------------------------------------+
  4. | ANV01 | 1001 | .5 ton anvil | 5.99 | .5 ton anvil, black, complete with handy hook |
  5. | ANV02 | 1001 | 1 ton anvil | 9.99 | 1 ton anvil, black, complete with handy hook and carrying case |
  6. | ANV03 | 1001 | 2 ton anvil | 14.99 | 2 ton anvil, black, complete with handy hook and carrying case |
  7. | DTNTR | 1003 | Detonator | 13.00 | Detonator (plunger powered), fuses not included |
  8. | FB | 1003 | Bird seed | 10.00 | Large bag (suitable for road runners) |
  9. | FC | 1003 | Carrots | 2.50 | Carrots (rabbit hunting season only) |
  10. | FU1 | 1002 | Fuses | 3.42 | 1 dozen, extra long |
  11. | JP1000 | 1005 | JetPack 1000 | 35.00 | JetPack 1000, intended for single use |
  12. | JP2000 | 1005 | JetPack 2000 | 55.00 | JetPack 2000, multi-use |
  13. | OL1 | 1002 | Oil can | 8.99 | Oil can, red |
  14. | SAFE | 1003 | Safe | 50.00 | Safe with combination lock |
  15. | SLING | 1003 | Sling | 4.49 | Sling, one size fits all |
  16. | TNT1 | 1003 | TNT (1 stick) | 2.50 | TNT, red, single stick |
  17. | TNT2 | 1003 | TNT (5 sticks) | 10.00 | TNT, red, pack of 10 sticks |
  18. +---------+---------+----------------+------------+----------------------------------------------------------------+

检索不同行

  1. SELECT DISTINCT vend_id FROM products;
  1. +---------+
  2. | vend_id |
  3. +---------+
  4. | 1001 |
  5. | 1002 |
  6. | 1003 |
  7. | 1005 |
  8. +---------+

限制结果

  1. SELECT prod_name FROM products LIMIT 5;
  1. +--------------+
  2. | prod_name |
  3. +--------------+
  4. | .5 ton anvil |
  5. | 1 ton anvil |
  6. | 2 ton anvil |
  7. | Detonator |
  8. | Bird seed |
  9. +--------------+
  1. SELECT prod_name FROM products LIMIT 5, 5;
  2. SELECT prod_name FROM products LIMIT 5 OFFSET 5;
  1. +--------------+
  2. | prod_name |
  3. +--------------+
  4. | Carrots |
  5. | Fuses |
  6. | JetPack 1000 |
  7. | JetPack 2000 |
  8. | Oil can |
  9. +--------------+

使用限定的表名

  1. SELECT products.prod_name FROM crashcourse.products;
  1. +----------------+
  2. | prod_name |
  3. +----------------+
  4. | .5 ton anvil |
  5. | 1 ton anvil |
  6. | 2 ton anvil |
  7. | Detonator |
  8. | Bird seed |
  9. | Carrots |
  10. | Fuses |
  11. | JetPack 1000 |
  12. | JetPack 2000 |
  13. | Oil can |
  14. | Safe |
  15. | Sling |
  16. | TNT (1 stick) |
  17. | TNT (5 sticks) |
  18. +----------------+

排序检索数据

排序

  1. SELECT prod_name FROM products ORDER BY prod_name;
  1. +----------------+
  2. | prod_name |
  3. +----------------+
  4. | .5 ton anvil |
  5. | 1 ton anvil |
  6. | 2 ton anvil |
  7. | Bird seed |
  8. | Carrots |
  9. | Detonator |
  10. | Fuses |
  11. | JetPack 1000 |
  12. | JetPack 2000 |
  13. | Oil can |
  14. | Safe |
  15. | Sling |
  16. | TNT (1 stick) |
  17. | TNT (5 sticks) |
  18. +----------------+

多个列排序

  1. SELECT prod_id, prod_price, prod_name FROM products ORDER BY prod_price, prod_name;
  1. +---------+------------+----------------+
  2. | prod_id | prod_price | prod_name |
  3. +---------+------------+----------------+
  4. | FC | 2.50 | Carrots |
  5. | TNT1 | 2.50 | TNT (1 stick) |
  6. | FU1 | 3.42 | Fuses |
  7. | SLING | 4.49 | Sling |
  8. | ANV01 | 5.99 | .5 ton anvil |
  9. | OL1 | 8.99 | Oil can |
  10. | ANV02 | 9.99 | 1 ton anvil |
  11. | FB | 10.00 | Bird seed |
  12. | TNT2 | 10.00 | TNT (5 sticks) |
  13. | DTNTR | 13.00 | Detonator |
  14. | ANV03 | 14.99 | 2 ton anvil |
  15. | JP1000 | 35.00 | JetPack 1000 |
  16. | SAFE | 50.00 | Safe |
  17. | JP2000 | 55.00 | JetPack 2000 |
  18. +---------+------------+----------------+

指定排序方向

  1. SELECT prod_id, prod_price, prod_name FROM products ORDER BY prod_price DESC;
  1. +---------+------------+----------------+
  2. | prod_id | prod_price | prod_name |
  3. +---------+------------+----------------+
  4. | JP2000 | 55.00 | JetPack 2000 |
  5. | SAFE | 50.00 | Safe |
  6. | JP1000 | 35.00 | JetPack 1000 |
  7. | ANV03 | 14.99 | 2 ton anvil |
  8. | DTNTR | 13.00 | Detonator |
  9. | FB | 10.00 | Bird seed |
  10. | TNT2 | 10.00 | TNT (5 sticks) |
  11. | ANV02 | 9.99 | 1 ton anvil |
  12. | OL1 | 8.99 | Oil can |
  13. | ANV01 | 5.99 | .5 ton anvil |
  14. | SLING | 4.49 | Sling |
  15. | FU1 | 3.42 | Fuses |
  16. | FC | 2.50 | Carrots |
  17. | TNT1 | 2.50 | TNT (1 stick) |
  18. +---------+------------+----------------+

过滤数据

过滤

  1. SELECT prod_name, prod_price FROM products WHERE prod_price = 2.50;
  1. +---------------+------------+
  2. | prod_name | prod_price |
  3. +---------------+------------+
  4. | Carrots | 2.50 |
  5. | TNT (1 stick) | 2.50 |
  6. +---------------+------------+

其它

  1. SELECT prod_name, prod_price FROM products WHERE prod_name = 'fuces';
  2. SELECT prod_name, prod_price FROM products WHERE prod_price < 10;
  3. SELECT prod_name, prod_price FROM products WHERE prod_price <= 10;
  4. SELECT vend_id, prod_price FROM products WHERE vend_id <> 1003;
  5. SELECT prod_name, prod_price FROM products WHERE prod_price BETWEEN 5 AND 10;
  6. SELECT cust_id FROM customers WHERE cust_email IS NULL;

注意:
匹配过滤或匹配不过滤不返回具有 NULL 的行

组合

  1. SELECT prod_id, prod_price, prod_name FROM products WHERE vend_id = 1003 AND prod_price <= 100;
  2. SELECT prod_id, prod_price, prod_name FROM products WHERE vend_id = 1003 OR vend_id = 1002;
  3. SELECT prod_id, prod_price, prod_name FROM products WHERE (vend_id = 1003 OR vend_id = 1002) AND prod_price >= 10;
  4. SELECT prod_id, prod_price, prod_name FROM products WHERE vend_id IN (1002, 1003);
  5. SELECT prod_id, prod_price, prod_name FROM products WHERE vend_id NOT IN (1002, 1003) ORDER BY prod_name;

通配符

% 匹配 0~多个字符

  1. SELECT prod_id, prod_name FROM products WHERE prod_name LIKE 'jet%';
  2. SELECT prod_id, prod_name FROM products WHERE prod_name LIKE '%anvil%';
  3. SELECT prod_id, prod_name FROM products WHERE prod_name LIKE 's%e';

_ 匹配单个字符

  1. SELECT prod_id, prod_name FROM products WHERE prod_name LIKE '_ ton anvil';

注意事项:
不过度使用;
尽量不放在搜索开始处

正则

  1. SELECT prod_id, prod_name FROM products WHERE prod_name REGEXP '1000' ORDER BY prod_name;
  2. # . 匹配单个字符
  3. SELECT prod_id, prod_name FROM products WHERE prod_name REGEXP '.000' ORDER BY prod_name;
  4. # binary 区分大小写
  5. SELECT prod_id, prod_name FROM products WHERE prod_name REGEXP BINARY 'JetPack .000' ORDER BY prod_name;
  6. # | or
  7. SELECT prod_id, prod_name FROM products WHERE prod_name REGEXP '1000|2000' ORDER BY prod_name;
  8. # [] 匹配几个字符之一,^ 否定
  9. SELECT prod_id, prod_name FROM products WHERE prod_name REGEXP '[123] Ton' ORDER BY prod_name;
  10. SELECT prod_id, prod_name FROM products WHERE prod_name REGEXP '[1-5] Ton' ORDER BY prod_name;
  11. # 转义
  12. SELECT prod_id, prod_name FROM products WHERE prod_name REGEXP '\\.' ORDER BY prod_name;

字符类
[:alnum:] 任意字母和数字,同 [a-zA-Z0-9]
[:alpha:] 任意字符,同 [a-zA_Z]
[:blank:] 空格和制表,同 [\t]
[:cntrl:] ASCII 控制字符(ASCII 0~31, 127)
[:digit:] 任意数字,同 [0-9]
[:print:] 任意可打印字符
[:graph:] 同 [:print:] 但不包括空格
[:lower:] 任意小写字母,同 [a-z]
[:upper:] 任意大写字母,同 [A-Z]
[:punct:] 既不在 [:alnum:] 又不在 [:cntrl:] 中的任意字符
[:space:] 包括空格在内的任意空白符,同 [\f\n\r\t\b]
[:xdigit:] 任意十六进制数字,同 [a-fA-F0-9]

匹配多个实例
元字符

* 0个或多个匹配
+ 1个或多个匹配,等于 {1,}
0或1个匹配,等于{0,1}
{n} 指定数目的匹配
{n,} 不少于指定数目的匹配
{n,m} 匹配数目的范围,m 不超过255
^ 文本的开始
& 文本的结尾
[[:<:]] 词的开始
[[:>:]] 词的结尾
  1. SELECT prod_id, prod_name FROM products WHERE prod_name REGEXP '\\([0-9] sticks\\)' ORDER BY prod_name;
  2. SELECT prod_id, prod_name FROM products WHERE prod_name REGEXP '[:digit:]{4}' ORDER BY prod_name;

正则测试

  1. SELECT 'hello' REGEXP '[0-9]';

计算字段

Concat 拼接

  1. SELECT Concat(vend_name, '(', vend_country, ')') FROM vendors ORDER BY vend_name;
  1. +-------------------------------------------+
  2. | Concat(vend_name, '(', vend_country, ')') |
  3. +-------------------------------------------+
  4. | ACME(USA) |
  5. | Anvils R Us(USA) |
  6. | Furball Inc.(USA) |
  7. | Jet Set(England) |
  8. | Jouets Et Ours(France) |
  9. | LT Supplies(USA) |
  10. +-------------------------------------------+

Trim 裁剪

  1. SELECT Concat(RTrim(vend_name), '(', RTrim(vend_country), ')') FROM vendors ORDER BY vend_name;

AS 别名

  1. SELECT Concat(RTrim(vend_name), '(', RTrim(vend_country), ')') AS vend_title FROM vendors ORDER BY vend_name;

算数计算

  1. SELECT prod_id, quantity, item_price, quantity*item_price AS expanded_price FROM orderitems WHERE order_num = 20005;

函数

Left() 返回串左边的字符
Length() 返回串的长度
Locate() 找出串的第一个子串
Lower() 将串转为小写
LTrim() 去掉左侧的空格
Right() 返回串右边的字符
RTrim() 去掉右侧的空格
Soundex() 返回串中的 soundex 值
SubString() 返回子串的字符
Upper 将串转为大写

日期

AddDate() 增加一个日期(天、周)
AddTime() 增加一个时间(时、分)
CurDate() 返回当前日期
CurTime() 返回当前时间
Date() 返回日期时间中日期部分
DateDiff() 计算两个日期之差
Date_Add() 高度灵活的日期运算函数
Date_Format() 返回一个格式化的日期或时间串
Day() 返回一个日期的天数部分
DayOfWeek() 返回日期的星期
Hour() 返回日期的小时部分
Minute() 返回日期的分钟
Mouth() 返回日期的月份
Now() 返回当前日期和时间
Second() 返回日期的秒部分
Time() 返回日期的时间部分
Year() 返回日期的年份
  1. SELECT cust_id, order_num FROM orders WHERE Date(order_date) = '2005-09-01';
  2. SELECT cust_id, order_num FROM orders WHERE Year(order_date) = 2005 AND Month(order_date) = 9;

数值处理

Abs() 绝对值
Cos() 余弦
Exp() 指数
Mod() 除操作的余数
Pi() 圆周率
Rand() 随机数
Sin() 正弦
Sqrt() 平方根
Tan() 正切

聚集函数

AVG() 平均值
COUNT() 列的行数
MAX() 最大值
MIN() 最小值
SUM() 求和
  1. SELECT AVG(prod_price) AS avg_price FROM products;
  2. SELECT AVG(prod_price) AS avg_price FROM products WHERE vend_id = 1003;
  3. SELECT COUNT(*) as num_cust FROM customers;
  4. SELECT COUNT(cust_email) as num_cust FROM customers;
  5. SELECT MAX(prod_price) as max_price FROM customers;
  6. SELECT MIN(prod_price) as min_price FROM customers;
  7. SELECT SUM(quantity) AS items_ordered FROM orderitems WHERE order_num = 20005;
  8. SELECT SUM(quantity*item_price) AS total_price FROM orderitems WHERE order_num = 20005;
  9. SELECT AVG(DISTINCT prod_price) AS avg_price FROM products;
  10. SELECT COUNT(*) AS num_items, MAX(prod_price) AS max_price, MIN(prod_price) AS min_price, AVG(prod_price) AS avg_price FROM products;

分组

创建

  1. SELECT vend_id, COUNT(*) AS num_prods FROM products GROUP BY vend_id;
  2. # 分组汇总
  3. SELECT vend_id, COUNT(*) AS num_prods FROM products GROUP BY vend_id WITH ROLLUP;
  1. +---------+-----------+
  2. | vend_id | num_prods |
  3. +---------+-----------+
  4. | 1001 | 3 |
  5. | 1002 | 2 |
  6. | 1003 | 7 |
  7. | 1005 | 2 |
  8. +---------+-----------+

过滤

  1. SELECT vend_id, COUNT(*) AS num_prods FROM products GROUP BY vend_id HAVING COUNT(*) >= 2;
  2. SELECT vend_id, COUNT(*) AS num_prods FROM products WHERE prod_price >= 10 GROUP BY vend_id HAVING COUNT(*) >= 2;

分组排序

  1. SELECT order_num, SUM(quantity*item_price) AS ordertotal FROM orderitems GROUP BY order_num HAVING ordertotal >= 50 ORDER BY ordertotal;

字句顺序

  • SELECT
  • FROM
  • WHERE
  • GROUP BY
  • HAVING
  • ORDER BY
  • LIMIT

子查询

过滤

  1. SELECT cust_name, cust_contact
  2. FROM customers
  3. WHERE cust_id IN (SELECT cust_id
  4. FROM orders
  5. WHERE order_num IN (SELECT order_num
  6. FROM orderitems
  7. WHERE prod_id = 'TNT2'));

计算字段

  1. SELECT cust_name, cust_state, (SELECT COUNT(*) FROM orders WHERE orders.cust_id = customers.cust_id) AS orders
  2. FROM customers ORDER BY cust_name;
  1. +----------------+------------+--------+
  2. | cust_name | cust_state | orders |
  3. +----------------+------------+--------+
  4. | Coyote Inc. | MI | 2 |
  5. | E Fudd | IL | 1 |
  6. | Mouse House | OH | 0 |
  7. | Wascals | IN | 1 |
  8. | Yosemite Place | AZ | 1 |
  9. +----------------+------------+--------+

联结

内联结

  1. SELECT vend_name, prod_name, prod_price FROM vendors, products WHERE vendors.vend_id = products.vend_id ORDER BY vend_name, prod_name;
  2. SELECT vend_name, prod_name, prod_price FROM vendors INNER JOIN products ON vendors.vend_id = products.vend_id ORDER BY vend_name, prod_name;

多表联结

  1. SELECT prod_name, vend_name, prod_price, quantity
  2. FROM orderitems, products, vendors
  3. WHERE products.vend_id = vendors.vend_id
  4. AND orderitems.prod_id = products.prod_id
  5. AND order_num = 20005;
  1. +----------------+-------------+------------+----------+
  2. | prod_name | vend_name | prod_price | quantity |
  3. +----------------+-------------+------------+----------+
  4. | .5 ton anvil | Anvils R Us | 5.99 | 10 |
  5. | 1 ton anvil | Anvils R Us | 9.99 | 3 |
  6. | TNT (5 sticks) | ACME | 10.00 | 5 |
  7. | Bird seed | ACME | 10.00 | 1 |
  8. +----------------+-------------+------------+----------+
  1. SELECT cust_name, cust_contact
  2. FROM customers, orders, orderitems
  3. WHERE customers.cust_id = orders.cust_id
  4. AND orderitems.order_num = orders.order_num
  5. AND prod_id = 'TNT2';

别名

  1. SELECT cust_name, cust_contact
  2. FROM customers AS c, orders AS o, orderitems AS oi
  3. WHERE c.cust_id = o.cust_id
  4. AND oi.order_num = o.order_num
  5. AND prod_id = 'TNT2';

自联结

  1. SELECT p1.prod_id, p1.prod_name FROM products AS p1, products AS p2 WHERE p1.vend_id = p2.vend_id AND p2.prod_name = 'DTNTR';
  1. SELECT c.*, o.order_num, o.order_date, oi.prod_id, oi.quantity, oi.item_price
  2. FROM customers AS c, orders AS o, orderitems AS oi
  3. WHERE c.cust_id = o.cust_id
  4. AND oi.order_num = o.order_num
  5. AND prod_id = 'TNT2';

外部联结

  1. SELECT c.cust_id, o.order_num FROM customers AS C INNER JOIN orders AS o ON c.cust_id = o.cust_id;
  1. +---------+-----------+
  2. | cust_id | order_num |
  3. +---------+-----------+
  4. | 10001 | 20005 |
  5. | 10001 | 20009 |
  6. | 10003 | 20006 |
  7. | 10004 | 20007 |
  8. | 10005 | 20008 |
  9. +---------+-----------+

左外部联结

  1. SELECT c.cust_id, o.order_num FROM customers AS C LEFT OUTER JOIN orders AS o ON c.cust_id = o.cust.id;
  1. +---------+-----------+
  2. | cust_id | order_num |
  3. +---------+-----------+
  4. | 10001 | 20005 |
  5. | 10001 | 20009 |
  6. | 10002 | NULL |
  7. | 10003 | 20006 |
  8. | 10004 | 20007 |
  9. | 10005 | 20008 |
  10. +---------+-----------+

右外部联结

  1. SELECT c.cust_id, o.order_num FROM customers AS C RIGHT OUTER JOIN orders AS o ON c.cust_id = o.cust.id;
  1. +---------+-----------+
  2. | cust_id | order_num |
  3. +---------+-----------+
  4. | 10001 | 20005 |
  5. | 10001 | 20009 |
  6. | 10003 | 20006 |
  7. | 10004 | 20007 |
  8. | 10005 | 20008 |
  9. +---------+-----------+

聚集

  1. SELECT c.cust_id, c.cust_name, COUNT(o.order_num) AS num_ord
  2. FROM customers AS C INNER JOIN orders AS o ON c.cust_id = o.cust_id GROUP BY c.cust_id;
  1. +---------+----------------+---------+
  2. | cust_id | cust_name | num_ord |
  3. +---------+----------------+---------+
  4. | 10001 | Coyote Inc. | 2 |
  5. | 10003 | Wascals | 1 |
  6. | 10004 | Yosemite Place | 1 |
  7. | 10005 | E Fudd | 1 |
  8. +---------+----------------+---------+

组合

  1. SELECT vend_id, prod_id, prod_price FROM products WHERE prod_price <= 5
  2. UNION
  3. SELECT vend_id, prod_id, prod_price FROM products WHERE vend_id IN (1002, 1003);
  4. # 不去除重复行
  5. SELECT vend_id, prod_id, prod_price FROM products WHERE prod_price <= 5
  6. UNION ALL
  7. SELECT vend_id, prod_id, prod_price FROM products WHERE vend_id IN (1002, 1003);
  8. # 排序
  9. SELECT vend_id, prod_id, prod_price FROM products WHERE prod_price <= 5
  10. UNION
  11. SELECT vend_id, prod_id, prod_price FROM products WHERE vend_id IN (1002, 1003)
  12. ORDER BY vend_id, prod_price;

全文搜索

文本搜索

  1. SELECT note_text FROM productnotes WHERE MATCH(note_text) AGAINST ('rabbit');

布尔

  1. SELECT note_text FROM productnotes WHERE MATCH(note_text) AGAINST ('heavy -rope*' IN BOOLEAN MODE);
+ 必须包含
- 必须排除
< 包含,增加等级
> 包含,减少等级
() 子表达式
~ 取消排序值
* 词尾的通配符
“” 定义一个短语
  1. SELECT note_text FROM productnotes WHERE MATCH(note_text) AGAINST ('+rabbit +bait' IN BOOLEAN MODE);
  2. SELECT note_text FROM productnotes WHERE MATCH(note_text) AGAINST ('rabbit bait' IN BOOLEAN MODE);
  3. SELECT note_text FROM productnotes WHERE MATCH(note_text) AGAINST ('"rabbit bait"' IN BOOLEAN MODE);
  4. SELECT note_text FROM productnotes WHERE MATCH(note_text) AGAINST ('>rabbit <bait' IN BOOLEAN MODE);
  5. SELECT note_text FROM productnotes WHERE MATCH(note_text) AGAINST ('+safe +(<combination)' IN BOOLEAN MODE);

插入数据

  1. INSERT INTO customers
  2. VALUES(NULL, 'Pep E. Lapew', '100 Main Street', 'Los Angeles', 'CA', '90046', 'USA', NULL, NULL);
  3. # 指定列
  4. INSERT INTO customers(cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country, cust_contact, cust_email)
  5. VALUES('Pep E. Lapew', '100 Main Street', 'Los Angeles', 'CA', '90046', 'USA', NULL, NULL);
  6. # 低优先级
  7. INSERT LOW_PRIORITY INTO customers(cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country, cust_contact, cust_email)
  8. VALUES('Pep E. Lapew', '100 Main Street', 'Los Angeles', 'CA', '90046', 'USA', NULL, NULL);
  9. # 插入多行
  10. INSERT INTO customers(cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country)
  11. VALUES('Pep E. Lapew', '100 Main Street', 'Los Angeles', 'CA', '90046', 'USA'),
  12. ('M Martian', '42 Galaxy Way', 'New York', 'NY', '11213', 'USA');
  13. # 插入检索出的数据
  14. INSERT INTO customers(cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country)
  15. SELECT cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country FROM customers WHERE cust_id = 10001;

更新数据

  1. UPDATE customers SET cust_name = 'The Funds', cust_email = 'elmer@fundds.com' WHERE cust_id = 10005;
  2. # 发生错误继续更新
  3. UPDATE IGNORE customers SET cust_name = 'The Funds', cust_email = 'elmer@fundds.com'
  4. # 删除列的值
  5. UPDATE customers SET cust_email = NULL WHERE cust_id = 10005;

删除数据

  1. DELETE FROM customers WHERE cust_id = 10006;
  2. # 删除所有行
  3. TRUNCATE Table

创建表

  1. CREATE TABLE customers
  2. (
  3. cust_id int NOT NULL AUTO_INCREMENT,
  4. cust_name char(50) NOT NULL ,
  5. cust_address char(50) NULL ,
  6. cust_city char(50) NULL ,
  7. cust_state char(5) NULL ,
  8. cust_zip char(10) NULL ,
  9. cust_country char(50) NULL ,
  10. cust_contact char(50) NULL ,
  11. cust_email char(255) NULL ,
  12. PRIMARY KEY (cust_id)
  13. ) ENGINE=InnoDB;
  14. CREATE TABLE orderitems
  15. (
  16. order_num int NOT NULL ,
  17. order_item int NOT NULL ,
  18. prod_id char(10) NOT NULL ,
  19. quantity int NOT NULL DEFAULT 1,
  20. item_price decimal(8,2) NOT NULL ,
  21. PRIMARY KEY (order_num, order_item)
  22. ) ENGINE=InnoDB;

引擎类型:
InnoDB: 支持事务、不支持全文搜索
MEMORY: 功能等同 MyISAM,数据存储在内存中
MyISAM: 不支持事务,支持全文搜索

更新表

  1. ALTER TABLE vendors ADD vend_phone CHAR(20);
  2. # 删除
  3. ALTER TABLE vendors DROP COLUMN vend_phone;
  4. # 定义外键
  5. ALTER TABLE orderitems ADD CONSTRAINT fk_orderitems_orders FOREIGN KEY (order_num) REFERENCES orders (order_num);
  6. ALTER TABLE orderitems ADD CONSTRAINT fk_orderitems_products FOREIGN KEY (prod_id) REFERENCES products (prod_id);
  7. ALTER TABLE orders ADD CONSTRAINT fk_orders_customers FOREIGN KEY (cust_id) REFERENCES customers (cust_id);
  8. ALTER TABLE products ADD CONSTRAINT fk_products_vendors FOREIGN KEY (vend_id) REFERENCES vendors (vend_id);

删除表

  1. DROP TABLE customers2;

重命名表

  1. RENAME TABLE customers2 TO customers;

视图

  1. CREATE VIEW productcustomers AS
  2. SELECT cust_name, cust_contact, prod_id
  3. FROM customers, orders, orderitems
  4. WHERE customers.cust_id = orders.cust_id
  5. AND orderitems.order_num = orders.order_num;

事务

rollback

  1. SELECT * FROM orderitems;
  2. START TRANSACTION;
  3. DELETE FROM orderitems;
  4. SELECT * FROM orderitems;
  5. ROLLBACK;
  6. SELECT * FROM orderitems;

commit

  1. START TRANSACTION;
  2. DELETE FROM orderitems WHERE order_num = 20010;
  3. DELETE FROM orders WHERE order_num = 20010;
  4. COMMIT

保留点

  1. SAVEPOINT delete1
  2. ROLLBACK TO delete1

更改默认提交

  1. SET autocommit=0;

安全管理

  1. # 创建账号
  2. CREATE USER u1 IDENTIFIED BY '123';
  3. # 重命名
  4. RENAME USER u1 TO u2;
  5. # 删除
  6. DROP USER u2;

权限

  1. CREATE USER u1 IDENTIFIED BY '123';
  2. SHOW GRANTS FOR u1;
  1. +--------------------------------+
  2. | Grants for u1@% |
  3. +--------------------------------+
  4. | GRANT USAGE ON *.* TO `u1`@`%` |
  5. +--------------------------------+
  1. GRANT SELECT ON crashcourse.* TO u1;
  2. # 撤销
  3. REVOKE SELECT ON crashcourse.* FROM u1;
  1. +---------------------------------------------+
  2. | Grants for u1@% |
  3. +---------------------------------------------+
  4. | GRANT USAGE ON *.* TO `u1`@`%` |
  5. | GRANT SELECT ON `crashcourse`.* TO `u1`@`%` |
  6. +---------------------------------------------+

更改口令

  1. ALTER USER u1 IDENTIFIED BY '666';