了解数据库和表
连接
mysql -u root -p
选择数据库
USE crashcourse;
了解数据库和表
# 显示所有数据库
SHOW DATABASES;
# 显示一个数据库中的所有表
SHOW TABLES;
# 显示表中数据的列
SHOW COLUMNS FROM customers;
DESCRIBE customers;
DESC cutomers;
其他一些语句
# 用于显示服务器状态信息
SHOW STATUS;
# 显示创建特定数据库表MySQL语句
SHOW CREATE DATABASE crashcourse;
# 显示创建特定表MySQL语句
SHOW CREATE TABLE customers;
# 用来显示授予用户的安全权限
SHOW GRANTS;
# 显示服务器错误或警告信息
SHOW ERRORS;
SHOW WARNINGS;
检索数据
检索单个列
# 从表products中检索一个名为prod_name的列
SELECT prod_name FROM products;
检索多个列
# 从表products中检索名为prod_id, prod_name, prod_price的列
SELECT prod_id, prod_name, prod_price FROM products;
检索所有列
# 使用通配符 * 返回表中所有列
SELECT * FROM products;
最好不要使用通配符,检索不需要的列会江都检索和应用程序的性能。
检索不同的行
# 使用DISTINCT关键字,会返回不同的行
SELECT DISTINCT vend_id FROM products;
DISTINCT必须放在列名的前面
不能部分使用DISTINCT,这个关键字应用于所有列而不仅仅是前置它的列,所以除非指定的列都相同,否则所有行都将被检索出来。
限制结果
# 返回前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行开始接下来的五行
使用完全限定的表名
SELECT products.prod_name FROM products;
排序检索数据
排序数据
# 使用ORDER BY子句取一个或多个列名字(使用未检索的列也是合法的),对输出进行排序
# 以prod_name列的字母顺序排序数据
SELECT prod_name FROM products ORDER BY prod_name;
按多个列排序
# 先以左边的列进行排序,若是相同再比较右边的列
SELECT prod_id, prod_price, prod_name FROM products ORDER BY prod_price, prod_name;
ORDER BY 子句应该保证在FROM子句之后,LIMIT子句要在ORDER BY 子句之后。
指定排序顺序
# 以价格降序进行排序
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子句
# 使用where子句指定搜索条件
SELECT prod_name, prod_price FROM products WHERE prod_price = 2.5;
WHERE子句的位置应该在ORDER BY子句之前。
WHERE子句操作符
| 操作符 | 说明 |
|---|---|
| = | 等于 |
| <> | 不等于 |
| != | 不等于 |
| < | 小于 |
| <= | 小于等于 |
| > | 大于 |
| >= | 大于等于 |
| BETWEEN | 在指定两个值之间 |
检查单个值
# 执行匹配时默认不区分大小写
SELECT prod_name, prod_price FROM products WHERE prod_name = 'fuses';
SELECT prod_name, prod_price FROM products WHERE prod_price < 10;
不匹配检查
# 不是由供应商1003制造的产品
SELECT vend_id, prod_name FROM products WHERE vend_id <> 1003;
SELECT vend_id, prod_name FROM products WHERE vend_id != 1003;
单引号用来限定字符串。如果将值与串类型的列进行比较,则需要限定引号。用来与数值列进行比较的值不用引号。
范围值检查
# 检索价格在5美元和10美元之间的产品
SELECT prod_name, prod_price FROM products WHERE prod_price BETWEEN 5 AND 10;
空值检查
# 查询价格是空值的产品,空值检查
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操作符
# AND操作符给WHERE子句附加条件
SELECT prod_id, prod_price, prod_name FROM products WHERE vend_id = 1003 AND prod_price <= 10;
AND 用在WHERE子句的关键字,用来指示检索满足所有给定条件的行。
OR操作符
# 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条件。
# 先处理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操作符用来指定条件返回,范围中地每个条件都可以进行匹配。
# 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子句中用来否定后跟条件地关键字。
SELECT prod_name, prod_price
FROM products
WHERE vend_id NOT IN (1002,1003)
ORDER BY prod_name;
用通配符进行过滤
LIKE操作符
百分号通配符
# %通配符表示任何字符出现任意次数
SELECT prod_id,prod_name
FROM products WHERE prod_name LIKE 'jet%';
WHERE prod_name LIKE ’%‘也是不能匹配NULL值得,需要注意。
下划线通配符
# _下划线只匹配一个字符,不能多也不能少
SELECT prod_id, prod_name
FROM products
WHERE prod_name LIKE '_ton anvil';