读书笔记
(最后更新 )

MySQL必知必会

阅读MySQL必知必会的笔记,并记录一下书中的SQL语句,用于加深一下印象。

了解数据库和表

连接

	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';