一.《MySQL必知必会》笔记(每天3:00更新,周末除外)
第二章:MySQL简介
-
为了给出用户名、主机名、端口和口令,应该使用
mysql -u ben -p -h myserver -P 9999 -
帮助
- 命令输入在mysql>之后;
- 命令用; 或 \g结束,换句话说,仅按Enter不执行命令;
- 输入help 或 \h获得帮助,也可以输入更多的文本获得特定命令的帮助(如,输入help select获得使用SELECT语句的帮助);
- 输入quit 或 exit退出命令行实用程序。
第三章:使用MySQL
- 为了连接到MySQL,需要以下信息:
- 主机名(计算机名)——如果连接到本地MySQL服务器,为localhost ;
- 端口(如果使用默认端口3306之外的端口);
- 一个合法的用户名;
- 用户口令(如果需要)。
- 选择数据库
例如,为了使用crashcourse数据库,应该输入以下内容:
- 输入 USE crashcourse;
- 输出 Database changed
- 了解数据库和表
数据库、表、列、用户、权限等的信息被存储在数据库和表中(MySQL使用MySQL来存储这些信息)。不过,内部的表一般不直接访问。可用MySQL的SHOW命令来显示这些信息(MySQL从内部表中提取这些信息)。请看下面的例子:
常用命令解析:
- 输入 SHOW TABLES; 展示多个数据表
- 输入 SHOW COLUMNS FROM table_name; SHOW也可以用来显示表列:
- DESCRIBE table_name
- DESCRIBE table_name 是 SHOW COLUMNS FROM table_name;的一种快捷方式。
- SHOW STATUS,用于显示广泛的服务器状态信息;
- SHOW CREATE DATA BASE 和 SHOW CREATE TABLE,分别用来显示创建特定数据库或表的MySQL语句;
- SHOW GRANTS,用来显示授予用户(所有用户或特定用户)的安全权限;
- SHOW ERRORS 和 SHOW WARNINGS,用来显示服务器错误或警告消息。
- 小结
如何连接和登录MySQL,
使用USE选择数据库,
使用SHOW查看MySQL数据库、表和内部信息。
第4章 检索数据
- SELECT 语句
SELECT COLUMN_1, COLUMN_2 FROM TABLE_NAME;
SELECT * FROM TABLE_NAME; - 检索不同的行
解决办法是使用DISTINCT关键字,顾名思义,此关键字指示MySQL只返回不同的值。
SELECTDISTINCT
COLUMN_1, COLUMN_2 FROM TABLE_NAME; - 限制结果
SELECT COLUMN_1 FROM TABLE_NAME LIMIT 5; - 使用完全限定的表名
-- 限定表名的字段
SELECT products.prod_name FROM products;
-- 限定数据库的表
SELECT products.prod_name FROM crashcourse.products; - 小结
本章学习了如何使用SQL的SELECT语句来检索单个表列、多个表列以及所有表列。
第5章 排序检索数据
- ORDER BY 语句
SELECT prod_name FROM productsORDER BY
prod_name; - 按多个列名排序
SELECT prod_id, prod_price, prod_name FROM productsORDER BY prod_price, prod_name
; - 指定排序方向 (ORDER BY COLUMN_NAME ASC|DESC)
数据排序不限于升序排序(从A 到 Z)。这只是默认的排序顺序,还可以使用ORDER BY子句以降序(从Z 到 A)顺序排序。为了进行降序排序,必须指定DESC关键字。
SELECT prod_id, prod_price, prod_name FROM products ORDER BY prod_priceDESC
;
注意:ORDER BY子句的位置 在给出ORDER BY子句时,应该保证它位于FROM子句之后。如果使用LIMIT,它必须位于ORDER BY之后。使用子句的次序不对将产生错误消息。
- 小结 本章学习了如何用SELECT语句的ORDER BY子句对检索出的数据进行排序。这个子句必须是SELECT语句中的最后一条子句。可根据需要,利用它在一个或多个列上对数据进行排序。
第6章 过滤数据 (WHERE)
= 等于
<> 不等于
!= 不等于
< 小于
<= 小于等于
> 大于
>= 大于等于 BETWEEN 在指定的两个值之间
IS NULL 检测空值
第7章 数据过滤
-
组合WHERE字句
-
AND
SELECT prod_id, prod_price, prod_name FROM products WHERE vend_id = 1003 AND prod_price <= 10; -
OR
SELECT prod_name, prod_price FROM products WHERE vend_id = 1002 OR vend_id = 1003; -
IN
SELECT prod_name, prod_price FROM products WHERE vend_id IN (1002,1003) ORDER BY prod_name; -
NOT
WHERE子句中的NOT操作符有且只有一个功能,那就是否定它之后所跟的任何条件。
MySQL中的NOT MySQL支持使用NOT 对 IN 、 BETWEEN 和 EXISTS 子句取反,这与多数其他 DBMS允许使用NOT对各种条件取反有很大的差别。 -
小结
本章讲授如何用AND 和 OR操作符组合成WHERE子句,而且还讲授了如何明确地管理计算的次序,如何使用IN 和 NOT操作符。
第8章 用通配符进行过滤
-
模糊匹配LIKE
最常使用的通配符是百分号(%)。在搜索串中,%表示任何字符出现任意次数。
注意:区分大小写 根据MySQL的配置方式,搜索可以是区分大小写的。 -
下划线()通配符
另一个有用的通配符是下划线()。下划线的用途与%一样,但下划线只匹配单个字符而不是多个字符。 -
使用通配符的技巧
正如所见,MySQL的通配符很有用。但这种功能是有代价的:通配符搜索的处理一般要比前面讨论的其他搜索所花时间更长。这里给出一些使用通配符要记住的技巧。 -
小结
本章介绍了什么是通配符以及如何在WHERE子句中使用SQL通配符,并且还说明了通配符应该细心使用,不要过度使用。
第9章 用正则表达式进行搜索
- 基本字符匹配
检索prod_name包含文本1000的所有行
例子:
select prod_name from products where prod_name regexp '1000' order by prod_name;
select prod_name from products where prod_name regexp '[123] Ton' order by prod_name;
特殊字符必须以 \ 为前导,\- 表示查找 -,\. 表示查找 .
\f 换页
\n 换行
\r 回车
\t 制表
\v 纵向制表
- 小结
本章介绍了正则表达式的基础知识,学习了如何在MySQL的SELECT语句中通过REGEXP关键字使用它们。
第10章 创建计算字段
- 拼接 Concat
SELECT Concat(vend_name, ' (', vend_country, ')') FROM vendors ORDER BY vend_name; - RTrim,LTrim,Trim清除空格
SELECT Concat(RTrim(vend_name), ' (', RTrim(vend_country), ')') AS vend_title FROM vendors ORDER BY vend_name;
3.小结
计算字段在串拼接和算术计算的用途。
第11章 使用数据处理函数
- 字符串
|-- 函 数 --|-- 说 明
Upper()函数
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() 返回一个时间的分钟部分
Month() 返回一个日期的月份部分
Now() 返回当前日期和时间
Second() 返回一个时间的秒部分
Time() 返回一个日期时间的时间部分
Year() 返回一个日期的年份部分 - 数值处理函数
函 数 说 明
Abs() 返回一个数的绝对值
Cos() 返回一个角度的余弦
Exp() 返回一个数的指数值
Mod() 返回除操作的余数
Pi() 返回圆周率
Rand() 返回一个随机数
Sin() 返回一个角度的正弦
Sqrt() 返回一个数的平方根
Tan() 返回一个角度的正切
第12章 汇总数据
- 聚集函数
函 数 说 明
AVG() 返回某列的平均值
COUNT() 返回某列的行数
MAX() 返回某列的最大值
MIN() 返回某列的最小值
SUM() 返回某列值之和 - 组合聚集函数
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章 分组数据
- 创建分组 GROUP BY
SELECT vend_id, COUNT(*) AS num_prods FROM products GROUP BY vend_id; - 过滤分组 HAVING
SELECT cust_id, COUNT() AS orders FROM orders GROUP BY cust_id HAVING COUNT() >= 2;
注意: 那么,不使用WHERE使用什么呢?MySQL为此目的提供了另外的子句,那就是HAVING子句。HAVING非常类似于WHERE。事实上,目前为止所学过的所有类型的WHERE子句都可以用HAVING来替代。唯一的差别是WHERE过滤行,而HAVING过滤分组。
HAVING 和 WHERE的差别 这里有另一种理解方法,WHERE在数据分组前进行过滤,HAVING在数据分组后进行过滤。这是一个重要的区别,WHERE排除的行不包括在分组中。这可能会改变计算值,从而影响HAVING子句中基于这些值过滤掉的分组。
那么,有没有在一条语句中同时使用WHERE 和 HAVING子句的需要呢?事实上,确实有。假如想进一步过滤上面的语句,使它返回过去12个月内具有两个以上订单的顾客。为达到这一点,可增加一条WHERE子句,过滤出过去12个月内下过的订单。然后再增加HAVING子句过滤出具有两个以上订单的分组。
SELECT vend_id, COUNT() AS num_prods FROM products WHERE prod_price >= 10 GROUP BY vend_id HAVING COUNT() >= 2;
3. 分组和排序
不要忘记ORDER BY 一般在使用GROUP BY子句时,应该也给出ORDER BY子句。这是保证数据正确排序的唯一方法。千万不要仅依赖GROUP BY排序数据。
4. selsect 字句顺序
select
from
where
group by
having
order by
limit
第14章 使用子查询
select column_a from a where id in (select column_b from b)