进入mysql安装目录下的bin目录:
mysql -uroot -p123456;
show databases;
use local;
show tables;
show columns from fee;
help show;
show create database local;
show create talbe fee;
show grants;
show errors;
show warnings;
select prod_name from products;
select prod_id,vend_id,prod_name from products;
select * from products;
select distinct vend_id from products;
select vend_id from products limit 5;
select vend_id from products limit 5,5;
第一个数为开始位置,第二个数为要检索的个数。
使用完全限定的表名:select products.vend_id from mysql_crash_course.products;
select prod_name from products order by prod_name;
select prod_id,prod_price,prod_name from products order by prod_name,prod_price;
仅在多个行具有相同的prod_price 值时才对产品按prod_name进行排序。如果prod_price列中所有的值都是唯一的,则不会按prod_name排序。
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 desc,prod_name;
以降序排序产品 (最贵的在最前面),然后再对产品名排序:
DESC关键字只应用到直接位于其前面的列名。在上例中,只对 prod_price列指定DESC,对prod_name列不指定。因此, prod_price列以降序排序,而prod_name列(在每个价格内)仍然按标准 的升序排序。 (默认升序)
在字典(dictionary)排序顺序中, A被视为与a相同,这是MySQL (和大多数数据库管理系统)的默认行为。但是,许多数据库 管理员能够在需要时改变这种行为(如果你的数据库包含大量 外语字符,可能必须这样做)。
这里,关键的问题是,如果确实需要改变这种排序顺序,用简 单的ORDER BY子句做不到。你必须请求数据库管理员的帮助
select prod_price from products order by prod_price desc limit 1;
select prod_price,prod_name from products where prod_price = 2.50;
从products表中检索两个列,但不返回所有行,只返 回prod_price值为2.50的行
操作符 | 说明 |
---|---|
= | 等于 |
<>,!= | 不等于 |
< | 小于 |
<= | 小于等于 |
> | 大于 |
>= | 大于等于 |
between | 在指定的两值之间 |
select prod_price,prod_name from products where prod_name = 'fuses';
检查WHERE prod_name=‘fuses’语句,它返回prod_name的值 为Fuses的一行。MySQL在执行匹配时默认不区分大小写,所 以fuses与Fuses匹配。
select prod_price,prod_name from products where prod_price < 10;
价格小于10美元的所有产品
select prod_price,prod_name from products where prod_price <= 10;
价格小于等于10美元的所有产品:
select vend_id,prod_name from products where vend_id <> 1003;
不是由供应商1003制造的所有产品
select prod_name,prod_price from products where prod_price between 5 and 10;
检索价格在5美元和10 美元之间的所有产品
使用BETWEEN时,必须指定两个值 ——所需范围的低端值和高端值。这两个值必须用AND关键字 分隔。BETWEEN匹配范围中所有的值,包括指定的开始值和结束值。
select prod_name from products where prod_price is null;
NULL 无值(no value),它与字段包含0、空字符串或仅仅包含 空格不同。
is null子句用来检查具有NULL值的列。
select prod_id,prod_price,prod_name from products where vend_id = 1003 and prod_price <= 10;
句检索由供应商1003制造且价格小于等于10美元的所 有产品的名称和价格
select prod_id,prod_price,prod_name from products where vend_id = 1003 or vend_id = 1002;
检索由任一个指定供应商制造的所有产品的产品 名和价格。
错误SQL:select prod_id,prod_price,prod_name from products where vend_id = 1003 or vend_id = 1002 and prod_price >= 10;
正确SQL:select prod_id,prod_price,prod_name from products where (vend_id = 1003 or vend_id = 1002) and prod_price >= 10;
检索价格为10美元(含)以上且由1002或1003制 造的所有产品
select prod_name,prod_price from products where vend_id in (1002,1003) order by prod_name;
句检索供应商1002和1003制造的所有产品。
为什么要使用IN操作符?其优点具体如下。
select prod_name,prod_price from products where vend_id not in (1002,1003) order by prod_name;
检索出除1002和1003之外的所有供应 商制造的产品
value%:表示以value开始任意字符结尾且不限次数。
%value%:表示字符包含value,不限开头和结尾。
%value:表示以任意字符开头,value结尾。
select prod_id,prod_name from products where prod_name like 'jet%';
检索出所有以词jet起头的产品。%告诉MySQL接受jet之后的任意字符,不 管它有多少字符。
下划线的用途与%一样,但下划线只匹配单个字符而不是多个字符。
select prod_id,prod_name from products where prod_name like '_ ton anvil';
查询第一个字符为任意字符,后
ton anvil
尽管MySQL
通配符很有用,但它要比一般检索所花的时间更长,应合理使用:
总之,通配符是一种极重要和有用的搜索工具,以后我们经常会用 到它。
正则表达式的作 用是匹配文本,将一个模式(正则表达式)与一个文本串进行比较。MySQL 用WHERE子句对正则表达式提供了初步的支持,允许你指定正则表达式, 过滤SELECT检索出的数据。
MySQL仅支持多数正则表达式实现的一个很小的子集。
select prod_name from products where prod_name regexp '1000' order by prod_name;
检索列prod_name包含 文本1000的所有行 REGEXP后所跟的东西作 为正则表达式(与文字正文1000匹配的一个正则表达式)处理。
select prod_name from products where prod_name regexp '.000' order by prod_name;
正则表达式
.000
。.
是正则表达式语言中一个特殊 的字符。它表示匹配任意一个字符,因此,1000和2000都匹配且返回。
LIKE
与REGEXP
差别:
select prod_name from products where prod_name like '1000' order by prod_name;
select prod_name from products where prod_name regexp '1000' order by prod_name;
如果执行上述两条语句,会发现第一条语句不返回数据,而第 二条语句返回一行。LIKE
匹配整个列。如果被匹配的文本在列值 中出现,LIKE
将不会找到它,相应的行也不被返回(除非使用 通配符)。而REGEXP
在列值内进行匹配,如果被匹配的文本在 列值中出现,REGEXP
将会找到它,相应的行将被返回。这是一 个非常重要的差别。
自版本 3.23.4后,MySQL
中的正则表达式匹配不区分大小写。为区分大 小写,可使用BINARY
关键字,如WHERE prod_name REGEXP BINARY 'JetPack .000'
。
OR
匹配select prod_name from products where prod_name regexp '1000|2000' order by prod_name;
了正则表达式1000|2000。|为正则表达式的OR操作 符。它表示匹配其中之一,因此1000和2000都匹配并返回。
select prod_name from products where prod_name regexp '[123]' order by prod_name;
正则表达式[123] Ton,[123]定义一组字符,它的意思是匹配1或2或3,因此,1 ton和2 ton都匹配且返回。
select prod_name from products where prod_name regexp '1|2|3 Ton' order by prod_name;
匹配'1'或 '2'或'3 ton
集合可用来定义要匹配的一个或多个字符。例如,下面的集合将匹 配数字0到9: [0123456789]
简化:[0-9]
select prod_name from products where prod_name regexp '[1-5] Ton' order by prod_name;
正则表达式[1-5] Ton。[1-5]定义了一个范围,这个 表达式意思是匹配1到5,因此返回3个匹配行。由于5 ton匹配, 所以返回.5 ton。
查找字符包含.
字符的值
错误:select vend_name from vendors where vend_name regexp '.' order by vend_name;
.
匹配任意字符,需要使用转义\\.
正确:select vend_name from vendors where vend_name regexp '\\.' order by vend_name;
Concat()函数:将值联结到一起构成单个值。
select concat(vend_name,'(',vend_country,')') from vendors order by vend_name;
RTrim()函数:删除数据右侧多余的空格来整理数据
select concat(vend_name,'(',RTrim(vend_country),')') from vendors order by vend_name;
MySQL除了支持RTrim()(正如刚才所见,它去掉 串右边的空格),还支持LTrim()(去掉串左边的空格)以及 Trim()(去掉串左右两边的空格)
别名(alias)是一个字段或值 的替换名。别名用AS关键字赋予。
select concat(RTrim(vend_name),'(',RTrim(vend_country),')') as vend_title from vendors order by vend_name;
select prod_id,quantity,item_price,quantity*item_price as expanded_price from orderitems where order_num = 20005;
汇总物品的价格(单 价乘以订购数量)
Upper()函数:将文本转换为大写。
select upper(vend_name) from vendors;
常用文本处理函数:
函数 | 说明 |
---|---|
Left() | 返回串左边的字符 |
Length() | 返回串的长度 |
Locate() | 找出串的一个子串 |
Lower() | 将串转换为小写 |
LTrim() | 去掉串左边的空格 |
Right() | 返回串右边的字符 |
RTrim() | 去掉串右边的空格 |
Soundex() | 返回串的SOUNDEX值 |
SubString() | 返回子串的字符 |
Upper() | 将串转换为大写 |
select cust_name,cust_contact from customers where soundex(cust_contact) = soundex('Y Lie');
使用Soundex()函数进行搜索,它匹配所有发音类似于 Y.Lie的联系名
常用日期和时间处理函数:
函数 | 说明 |
---|---|
AddDate() | 增加一个日期(天、周等) |
AddTime() | 增加一个时间(时、分等) |
CurDate() | 返回当前日期 |
CurTime() | 返回当前时间 |
Date() | 返回日期时间的日期部分 |
DateDiff() | 计算两个日期之差 |
Date_Add() | 高度灵活的日期运算函数 |
Date_Format() | 返回一个格式化的日期或时间串 |
Day() | 返回一个日期的天数部分 |
DayOfWeek() | 对于一个日期,返回对应的星期几 |
Hour() | 返回一个时间的小时部分 |
Minute() | 返回一个时间的分钟部分 |
Month() | 返回一个日期的月份部分 |
Now() | 返回当前日期和时间 |
Second() | 返回一个时间的秒部分 |
Time() | 返回一个日期时间的时间部分 |
Year() | 返回一个日期的年份部分 |
select cust_id,order_num,order_date,Date(order_date) from orders where Date(order_date) = '2005-09-01';
函数 | 说明 |
---|---|
Abs() | 返回一个数的绝对值 |
Cos() | 返回一个角度的余弦 |
Exp() | 返回一个数的指数值 |
Mod() | 返回除操作的余数 |
Pi() | 返回圆周率 |
Rand() | 返回一个随机数 |
Sin() | 返回一个角度的正弦 |
Sqrt() | 返回一个数的平方根 |
Tan() | 返回一个角度的正切 |
聚集函数(aggregate function) 运行在行组上,计算和返回单 个值的函数。
常用SQL聚集函数:
函数 | 说明 |
---|---|
AVG() | 返回某列的平均值 |
COUNT() | 返回某列的行数 |
MAX() | 返回某列的最大值 |
MIN() | 返回某列的最小值 |
SUM() | 返回某列值之和 |
select avg(prod_price) avg_price from products where vend_id = 1003;
仅过滤出
vend_id
为1003的产品的平均值。
DISTINCT
:只包含不同的值。
select avg(distinct prod_price) avg_price from products where vend_id = 1003;
**取别名:**在指定别名以包含某个聚集函数的结果时,不应该使 用表中实际的列名。虽然这样做并非不合法,但使用唯一的名 字会使你的
SQL
更易于理解和使用。
select vend_id,count(*) as num_prods from products group by vend_id;
因为使用了
GROUP BY
,就不必指定要计算和估值的每个组了。系统 会自动完成。GROUP BY
子句指示MySQL
分组数据,然后对每个组而不是 整个结果集进行聚集。
在具体使用GROUP BY
子句前,需要知道一些重要的规定。
GROUP BY
子句可以包含任意数目的列。这使得能对分组进行嵌套, 为数据分组提供更细致的控制。GROUP BY
子句中嵌套了分组,数据将在后规定的分组上 进行汇总。换句话说,在建立分组时,指定的所有列都一起计算 (所以不能从个别的列取回数据)。GROUP BY
子句中列出的每个列都必须是检索列或有效的表达式 (但不能是聚集函数)。如果在SELECT
中使用表达式,则必须在 GROUP BY
子句中指定相同的表达式。不能使用别名。SELECT
语句中的每个列都必须在GROUP BY
子 句中给出。NULL
值,则NULL
将作为一个分组返回。如果列中有多行NULL
值,它们将分为一组。GROUP BY
子句必须出现在WHERE
子句之后,ORDER BY
子句之前。使用
WITH ROLLUP
关键字,可以得到每个分组以 及每个分组汇总级别(针对每个分组)的值。
select vend_id,count(*) as num_prods from products group by vend_id with rollup;
HAVING
:。HAVING非常类似于WHERE。事实上,目前为止所 学过的所有类型的WHERE子句都可以用HAVING来替代。唯一的差别是 WHERE过滤行,而HAVING过滤分组。
select vend_id,count(*) as num_prods from products group by vend_id having count(*) >= 2;
这条SELECT语句的前3行类似于上面的语句。后一行增加了 HAVING子句,它过滤COUNT(*) >= 2。
HAVING和WHERE的差别:这里有另一种理解方法,WHERE
在数据 分组前进行过滤,HAVING
在数据分组后进行过滤。这是一个重 要的区别,WHERE
排除的行不包括在分组中。这可能会改变计 算值,从而影响HAVING
子句中基于这些值过滤掉的分组。
GROUP BY
和ORDER BY
经之间的差别:
ORDER BY | GROUP BY |
---|---|
排序产生的输出 | 分组行。但输出可能不是分组的顺序 |
任意列都可以使用(甚至 非选择的列也可以使用) | 只可能使用选择列或表达式列,而且必须使用每个选择 列表达式 |
不一定需要 | 如果与聚集函数一起使用列(或表达式),则必须使用 |
子句 | 说明 | 是否必须使用 |
---|---|---|
SELECT | 要返回的列或表达式 | 是 |
FROM | 从中检索数据的表 | 仅在从表选择数据时使用 |
WHERE | 行级过滤 | 否 |
GROUP BY | 分组说明 | 仅在按组计算聚集时使用 |
HAVING | 组级过滤 | 否 |
ORDER BY | 输出排序顺序 | 否 |
LIMIT | 要检索的行数 | 否 |