了解数据库和表

连接

1
mysql -u root -p

选择数据库

1
USE crashcourse;

了解数据库和表

1
2
3
4
5
6
7
8
# 显示所有数据库
SHOW DATABASES;
# 显示一个数据库中的所有表
SHOW TABLES;
# 显示表中数据的列
SHOW COLUMNS FROM customers;
DESCRIBE customers;
DESC cutomers;

其他一些语句

1
2
3
4
5
6
7
8
9
10
11
# 用于显示服务器状态信息
SHOW STATUS;
# 显示创建特定数据库表MySQL语句
SHOW CREATE DATABASE crashcourse;
# 显示创建特定表MySQL语句
SHOW CREATE TABLE customers;
# 用来显示授予用户的安全权限
SHOW GRANTS;
# 显示服务器错误或警告信息
SHOW ERRORS;
SHOW WARNINGS;

检索数据

检索单个列

1
2
# 从表products中检索一个名为prod_name的列
SELECT prod_name FROM products;

检索多个列

1
2
# 从表products中检索名为prod_id, prod_name, prod_price的列
SELECT prod_id, prod_name, prod_price FROM products;

检索所有列

1
2
# 使用通配符 * 返回表中所有列
SELECT * FROM products;

最好不要使用通配符,检索不需要的列会江都检索和应用程序的性能。

检索不同的行

1
2
# 使用DISTINCT关键字,会返回不同的行
SELECT DISTINCT vend_id FROM products;

​ DISTINCT必须放在列名的前面

​ 不能部分使用DISTINCT,这个关键字应用于所有列而不仅仅是前置它的列,所以除非指定的列都相同,否则所有行都将被检索出来。

限制结果

1
2
3
4
5
# 返回前5行数据
SELECT prod_name FROM products LIMIT 5;
# 从第5行开始返回接下来5行的数据
SELECT prod_name FROM products LIMIT 5, 5;
SELECT prod_name FROM products LIMIT 5 OFFSET 5;

检索出来的行是从0开始,所以LIMIT 5 表示从第0行开始接下来的五行

使用完全限定的表名

1
SELECT products.prod_name FROM products;

排序检索数据

排序数据

1
2
3
# 使用ORDER BY子句取一个或多个列名字(使用未检索的列也是合法的),对输出进行排序
# 以prod_name列的字母顺序排序数据
SELECT prod_name FROM products ORDER BY prod_name;

按多个列排序

1
2
# 先以左边的列进行排序,若是相同再比较右边的列
SELECT prod_id, prod_price, prod_name FROM products ORDER BY prod_price, prod_name;

ORDER BY 子句应该保证在FROM子句之后,LIMIT子句要在ORDER BY 子句之后。

指定排序顺序

1
2
3
4
5
6
# 以价格降序进行排序
SELECT prod_id, prod_price, prod_name FROM products ORDER BY prod_price DESC;
# 以价格升序序进行排序
SELECT prod_id, prod_price, prod_name FROM products ORDER BY prod_price ASC;
# 先以价格降序,再以产品名排序
SELECT prod_id, prod_price, prod_name FROM products ORDER BY prod_price DESC, prod_name;

如果想在多个列上进行降序排序,必须每一个列都要指定DESC关键字

ASC关键字其实没多大用,因为默认就是升序排序的,不指定DESC就一般是ASC排序

过滤数据

使用WHERE子句

1
2
# 使用where子句指定搜索条件
SELECT prod_name, prod_price FROM products WHERE prod_price = 2.5;

WHERE子句的位置应该在ORDER BY子句之前。

WHERE子句操作符

操作符 说明
= 等于
<> 不等于
!= 不等于
< 小于
<= 小于等于
> 大于
>= 大于等于
BETWEEN 在指定两个值之间

检查单个值

1
2
3
# 执行匹配时默认不区分大小写
SELECT prod_name, prod_price FROM products WHERE prod_name = 'fuses';
SELECT prod_name, prod_price FROM products WHERE prod_price < 10;

不匹配检查

1
2
3
# 不是由供应商1003制造的产品
SELECT vend_id, prod_name FROM products WHERE vend_id <> 1003;
SELECT vend_id, prod_name FROM products WHERE vend_id != 1003;

单引号用来限定字符串。如果将值与串类型的列进行比较,则需要限定引号。用来与数值列进行比较的值不用引号。

范围值检查

1
2
# 检索价格在5美元和10美元之间的产品
SELECT prod_name, prod_price FROM products WHERE prod_price BETWEEN 5 AND 10;

空值检查

1
2
3
4
# 查询价格是空值的产品,空值检查
SELECT prod_name FROM products WHERE prod_price IS NULL;
# 非空值检查
SELECT prod_name FROM products WHERE prod_price IS NOT NULL;

NULL 无值,她与字段包括0,空字符串或仅仅包括空格不同。

数据过滤

组合WHERE子句

用来联结或改变WHERE子句的子句的关键字,被称为逻辑操作符或是操作符。

AND操作符

1
2
# AND操作符给WHERE子句附加条件
SELECT prod_id, prod_price, prod_name FROM products WHERE vend_id = 1003 AND prod_price <= 10;

AND 用在WHERE子句的关键字,用来指示检索满足所有给定条件的行。

OR操作符

1
2
# OR操作符指示MySQL检索匹配任意条件的行
SELECT prod_name, prod_price FROM products WHERE vend_id = 1002 OR vend_id = 1003;

OR WHERE子句中使用的关键字,用来表示检索匹配任一给定条件的行。

计算次序

WHERE可包括AND和OR的组合子句条件,但注意的是,MYSQL会优先处理AND的条件然后在处理OR条件。

1
2
3
4
5
6
# 先处理AND在处理OR,所以表示的是vend_id等于1003并且价格大于等于10的产品或者是vend_id等于1002价格没限制的产品
SELECT prod_name, prod_price FROM products
WHERE vend_id = 1002 OR vend_id = 1003 AND prod_price >= 10;
# 正确顺序的话需要添加括号进行区分
SELECT prod_name, prod_price FROM products
WHERE (vend_id = 1002 OR vend_id = 1003) AND prod_price >= 10;

任何时候使用具有AND和OR操作符的WHERE子句,都应该使用圆括号明确地分组操作符。

IN操作符

IN操作符用来指定条件返回,范围中地每个条件都可以进行匹配。

1
2
3
4
5
6
# IN取合法值
SELECT prod_name, prod_price FROM products WHERE vend_id IN (1002,1003)
ORDER BY prod_name;p
# 等价于
SELECT prod_name, prod_price FROM products WHERE vend_id = 1002 OR vend_id = 1003
ORDER BY prod_name;

NOT操作符

NOT WHERE子句中用来否定后跟条件地关键字。

1
2
3
4
SELECT prod_name, prod_price
FROM products
WHERE vend_id NOT IN (1002,1003)
ORDER BY prod_name;

用通配符进行过滤

LIKE操作符

百分号通配符

1
2
3
# %通配符表示任何字符出现任意次数
SELECT prod_id,prod_name
FROM products WHERE prod_name LIKE 'jet%';

WHERE prod_name LIKE ‘%’也是不能匹配NULL值得,需要注意。

下划线通配符

1
2
3
4
# _下划线只匹配一个字符,不能多也不能少
SELECT prod_id, prod_name
FROM products
WHERE prod_name LIKE '_ton anvil';