MySQL必知必会学习笔记

准备工作

安装参考

书中附录 2 提到的 SQL 脚本文件

下载地址

使用步骤

  • 创建一个新数据源:create database 数据库名
  • 保证选择新数据源:use 数据库名
  • 执行 create.sql 脚本。如果使用 mysql 命令行实用程序,可给出 source create.sql;(指定 create.sql 件的完全路径)
  • 重复前面的步骤,用 source populate.sql 填充各个新表。

第三章 使用 MySQL

了解数据库和表

1
2
3
4
5
6
7
8
9
show databases; 显示可用数据库
use 数据库名; 使用某个数据库
show tables; 显示某数据库内的表
show columns from 表名; 显示表的列
describe 表名; 是上述语句的快捷方式
show status; 显示服务器状态
show grants; 显示用户的权限
show errors; 显示服务器错误信息
show warnings; 显示警告信息

第四章 检索数据

1 书写习惯

  • 一般来说,SQL 关键字使用大写
  • 所有列和表名使用小写

2 检索列

  • 从products表中选择3列
1
2
SELECT prod_id, prod_name, prod_price
FROM products;
  • 检索所有列
1
2
SELECT *
FROM products;

3 检索不同行

  • 只返回不同的 vend_id
1
2
SELECT DISTINCT vend_id
FROM products;

注意:不能部分使用 DISTINCT。 如果有 SELECT DISTINCT vend_id,prod_price FROM products; 那么只有指定的两个列的值都不相同时,才会被检索

4 限制结果

  • LIMIT 行数N 表示返回不多于N行
  • LIMIT N, M 表示从第 N 行开始的 M 行(替代方法 LIMIT N OFFSET M)
1
2
3
SELECT prod_name
FROM products
Limit 5;

5 使用完全限定的表名

  • 与之前使用的语句结果都是一样的
    1
    2
    SELECT products.prod_name
    FROM products;
    1
    2
    SELECT products.prod_name
    FROM crashcourse.products;

第五章 排序检索数据

5.1 排序数据

ORDER BY 列名 默认升序

5.2 按多列排序

1
2
3
SELECT prod_id, prod_price, prod_name
FROM products
ORDER BY prod_price, prod_name;


以上语句虽然 ORDER BY 后有两个列,但是会优先按前者排序,只有前者相同时,才会轮到后者排序

5.3 指定排序方向

  • 一个列的排序方向
    • ORDER BY 列名 DESC 降序
  • 多个列的排序方向
    • ORDER BY 列名 DESC, 列名 DESC (DESC 只能作用于前面的那个列名)
1
2
3
SELECT prod_id, prod_price, prod_name
FROM products
ORDER BY prod_price DESC, prod_name DESC;
  • ORDER BY 和 LIMIT 的结合可以找到最大/小值

第六、七章 WHERE 过滤数据

6.1 WHERE 子句

可以通过 WHERE 指定的条件进行过滤,但应注意:如果同时使用 ORDER BY 和 WHERE 应该让 ORDER BY 位于 WHERE 之后

6.2 WHERE 子句操作符

  • 当限定字符串时,应用单引号包起来
  • 范围限定:WHERE 列名 BETWEEN 值1 AND 值2
  • 空值检查:WHERE 列名 is NULL
  • 组合条件:用 ANDOR 进行组合,AND 优先级高于 OR
  • IN 操作符:WHERE 列名 IN (值1,值2,...) 括号内的条件都可以匹配
  • NOT 操作符:否定后面跟的条件(NOT IN)

第八章 用通配符过滤

8.1 LIKE 操作符

为在搜索子句(注意:搜索是区分大小写的)中使用通配符,必须使用 LIKE 操作符

  • %

% 表示任意字符出现任意次数

1
2
3
SELECT prod_id, prod_name
FROM products
WHERE prod_name LIKE 'jet%';
  • _

_ 匹配单个字符

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

第九章 正则表达式

1 . | [] \\

  • 基本使用:检索列中含有 100 的行
1
2
3
4
SELECT prod_name
FROM products
WHERE prod_name REGEXP '100'
ORDER BY Prod_name;

  • . 匹配一个任意字符
  • | 匹配表达式中的一个
    1
    2
    3
    4
    SELECT prod_name
    FROM products
    WHERE prod_name REGEXP '1000|2000'
    ORDER BY prod_name;

  • [123] 匹配单一特定的字符
  • 转义符:\\

2 匹配字符类

3 匹配多个实例

4 定位符

第十章 创建计算字段

10.1 Concat() 拼接字段

1
2
3
SELECT Concat(vend_name, '(', vend_country, ')')
FROM vendors
ORDER BY vend_name;

AS 别名

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

10.2 执行计算结果

1
2
3
4
5
6
SELECT prod_id,
quantity,
item_price,
quantity*item_price AS expanded_price
FROM orderitems
WHERE order_num = 20005;

expanded_price 列为一个计算字段

第十一章 函数

11.1 常用文本处理函数


  • Sounden() 可以比较字符串发音,找到发音类似的结果
1
2
3
SELECT cust_name, cust_contact
FROM customers
WHERE Soundex(cust_contact) = Soundex('Y. Lie');

11.2 日期、时间处理函数

11.2.1 提取时间

  • Date() 可以将日期部分提取出来,2005-09-01 11:30:05 经过 Date() 函数可获取日期部分2005-09-01
1
2
3
SELECT cust_id, order_num
FROM orders
WHERE Date(order_date) = '2005-09-01';

当然用正则表达式可以获得相同的结果

1
2
3
SELECT cust_id, order_num
FROM orders
WHERE order_date REGEXP '2005-09-01';

11.2.2 限定时间范围

  • BETWEEN AND 可以限定时间范围
1
2
3
SELECT cust_id, order_num
FROM orders
WHERE Date(order_date) BETWEEN '2005-09-01' AND '2005-09-30';
  • 通过 Year() Month() 等函数限定具体的年月等
1
2
3
SELECT cust_id, order_num
FROM orders
WHERE Year(order_date) = 2005 AND Month(order_date) = 9;

11.3 数值处理函数

第十二章 汇总数据

12.1 聚集函数

12.2 组合聚集函数

1
2
3
4
5
SELECT COUNT(*) AS num_items,
MIN(prod_price) AS price_min,
MAX(prod_price) AS price_max,
AVG(prod_price) AS price_avg
FROM products;

第十三章 分组数据

13.1 创建分组

  • 查询每个供应商都有多少个产品
1
2
3
SELECT vend_id, COUNT(*) AS num_prods
FROM products
GROUP BY vend_id;


注意:GROUP BY 必须在 WHERE 之后 ORDER BY 之前

13.2 过滤分组

1
2
3
4
SELECT vend_id, COUNT(*) AS num_prods
FROM products
GROUP BY vend_id
HAVING COUNT(*) >= 2;

13.3 SELECT 子句及其顺序


第十五章 连结表 第十六章 高级连结

1
2
3
4
5
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 prder_num = 20005;

第二十章 更新和删除数据

  • UPDATE 要更新的表 SET 列名 = 新值 WHERE 条件
1
2
3
4
UPDATE customers
SET cust_email = 'elmer@fudd.com'
cust_name = 'The Fudds'
WHERE cust_id = 10005;
  • DELETE FROM 表 WHERE 条件
    • DELETE 不需要列名或通配符,它只删除整行而不是整列
1
2
DELETE FROM customers
WHERE cust_id=10006;

第二十一章 创建和操纵表

  • 创建
1
2
3
4
5
CREATE TABLE 表明 (
cust_id int,
cust_name char(5),
PRIMARY KEY (cust_id)
) ENGINE=InnoDB;S
  • 删除
1
DROP TABLE 表名

根据 leetcode SQL 架构创建表的方法

如 196

1
2
3
4
Truncate table Person
insert into Person (Id, Email) values ('1', 'john@example.com')
insert into Person (Id, Email) values ('2', 'bob@example.com')
insert into Person (Id, Email) values ('3', 'john@example.com')
  • 创建一个数据库
1
CREATE database leetcode;
  • use leetcode
  • 创建表
1
CREATE TABLE Person(Id int,Email char(50),PRIMARY KEY(Id))ENGINE=InnoDB;
  • 依次 insert into 即可(删除语句中间的 (Id, Email)
1
insert into Person values ('1', 'john@example.com')

SELECT_from_WORLD_Tutorial

问题:https://sqlzoo.net/wiki/SQLZOO:SELECT_from_WORLD_Tutorial/zh
答案:



----------- 本文结束 -----------




0%