从表中检索信息
该SELECT语句用于从表中提取信息。声明的一般形式是:
1 | SELECT what_to_select |
what_to_select表示你想看到什么,这可以是列表中的一列, * 可以表示“ 所有列”。which_table表示要从中检索数据的表。该WHERE 条款是可选的。如果存在,则 conditions_to_satisfy指定行必须满足的一个或多个条件才有资格进行检索。
1 | mysql> select name |
1.选择所有数据
SELECT最简单的形式从表中检索所有内容
1 | mysql> select * from pet; |
UPDATE语句修复错误记录 :
1 | mysql> update pet |
2.选择特定行
例如,如果想验证刚才对Bowser出生日期所做的更改,请选择Bowser的记录,如下所示:
1 | mysql> select * |
字符串比较通常不区分大小写,因此可以将名称指定为’bowser’, ‘BOWSER’等等。查询结果是一样的。
也可以在任何列上指定条件,例如想知道1997年或之后出生的动物:
1 | mysql> select * |
还可以使用 AND 进行组合条件进行查询
1 | mysql> select * |
除了AND逻辑运算符还有OR。
1 | mysql> select * |
AND和OR可以混合,但 AND优先级高于 OR。如果同时使用这两个运算符,最好使用括号明确指出条件应如何分组。
1 | mysql> select * |
3.选择特定列
如果不查看表中的整行,只需将感兴趣的列名进行逗号分隔。例如如果查询谁的动物什么时候出生,请选择name和 birth列:
1 | mysql> SELECT name, birth FROM pet; |
要找出宠物属于谁,如下查询
1 | mysql> select owner from pet; |
要最小化输出,请通过添加关键字 DISTINCT 去除重复输出:
1 | mysql> select distinct owner from pet; |
使用WHERE子句将行选择与列选择组合在一起。例如,仅获取狗和猫的出生日期,如下查询:
1 | mysql> select name,species,birth |
4.对行排序
当行以某种有意义的方式排序时,通常更容易查询输出。要对结果进行排序,请使用ORDER BY子句。
默认排序顺序是升序。要按反向(降序)排序,请将DESC关键字添加到要排序 的列名称后面
1 | mysql> select name, birth from pet order by birth; |
该DESC关键字仅适用于紧邻的列名(birth); 它不会影响species列排序顺序。
LIMIT 子句用于限制由 SELECT 语句返回的数据数量。下面是 LIMIT 子句与 OFFSET 子句一起使用时的语法:
1 | SELECT column1, column2, columnN |
引擎将返回从下一行开始直到给定的 OFFSET 为止的所有行。
5.日期计算
要确定每只宠物的年龄,使用 TIMESTAMPDIFF()功能。它的参数是你所希望结果表达的 单位,以及取得差异的两个日期。以下查询显示了每只宠物的出生日期,当前日期和年龄。一个 别名(age)使得输出列更有意义。
1 | mysql> SELECT name, birth, CURDATE(), |
也可以使用order by 对age进行排序,不再演示
下面说明TIMESTAMPDIFF函数的语法。
1 | TIMESTAMPDIFF(unit,begin,end); |
TIMESTAMPDIFF函数返回begin-end的结果,其中begin和end是DATE或DATETIME表达式。
TIMESTAMPDIFF函数允许其参数具有混合类型,例如,begin是DATE值,end可以是DATETIME值。 如果使用DATE值,则TIMESTAMPDIFF函数将其视为时间部分为“00:00:00”的DATETIME值。
unit参数是确定(end-begin)的结果的单位,表示为整数。 以下是有效单位:
MICROSECOND(微秒)、SECOND(秒)、MINUTE(分钟)、HOUR(小时)、DAY(天)、WEEK(星期)、MONTH(月)、QUARTER(季度)、YEAR(年)
类似的查询可用于确定死亡动物的死亡年龄。可以通过检查death值是否为null 。然后,对于那些非NULL值的,计算death和 birth值之差:
1 | mysql> select name,birth,death, |
MySQL提供了用于提取日期的部分,如一些功能 YEAR(), MONTH()和 DAYOFMONTH()。如下一个简单的查询birth和 MONTH(birth):
1 | mysql> select name,birth,month(birth) from pet; |
DATE_ADD()可以将时间间隔添加到给定日期。如果将值添加到CURDATE(),然后提取月份部分MONTH(),结果将生成查找生日的月份:
1 | mysql> select name,birth from pet |
6.null 值
要测试NULL,请使用IS NULL 和 IS NOT NULL运算符,如下所示
1 | mysql> SELECT 1 IS NULL, 1 IS NOT NULL |
任何算术比较NULL的结果 也是NULL,所以你不能从这种比较中获得任何有意义的结果。
在MySQL中,0或NULL 为假,其他则为真。布尔运算的默认真值是1。
7.模式匹配
MySQL提供标准的SQL模式匹配以及基于扩展正则表达式的模式匹配,类似于Unix实用程序(如vi,grep和 sed)使用的扩展正则表达式 。
SQL模式匹配可以使用 “_” 匹配任何单个字符并且%匹配任意数量的字符(包括零个字符)。在MySQL中,SQL模式默认情况下不区分大小写。使 用SQL模式时不要使用 =或<>,改用LIKE或 NOT LIKE比较运算符。
查找以b(b%)开头。%fy(以fy结尾),%w%(包含w字符)
1 | mysql> select * |
要查找包含五个字符的名称:
1 | mysql> select * from pet where name like '_____'; |
MySQL提供的另一种模式匹配使用扩展的正则表达式。当为这种类型的模式测试匹配时,使用 REGEXP和NOT REGEXP运算符(或 RLIKE和 NOT RLIKE,它们是同义词)。
以下列表描述了扩展正则表达式的一些特征:
. 匹配任何单个字符。
字符类[…]匹配括号内的任何字符。例如, [abc]匹配a, b或c。[a-z] 匹配任何字母,而[0-9] 匹配任何数字。
*匹配前面事物的零个或多个实例。例如,x 匹配任意数量的x字符, [0-9]匹配任意数量的数字,.*匹配任意数量的任何字符。
如果模式与测试值中的任何位置匹配,则正则表达式模式匹配成功 。(这与LIKE模式匹配不同,仅在模式与整个值匹配时才会成功。)
使用锚定模式以使其与要测试的值的开头或结尾匹配,请使用模式^开头或$结尾。
1 | mysql> select * from pet where name regexp '^b'; |
8.计数行
COUNT(*)计算行数,因此计算动物数量的查询如下所示:
1 | mysql> select count(*) from pet; |
计算每个人拥有几个宠物
1 | mysql> select owner,count(*) from pet group by owner; |
上述查询使用GROUP BY对每个owner进行分组。使用COUNT()结合 GROUP BY在各种分组表征数据时非常有用。
想要得到每种性别的动物数量仅适用于已知性别的动物:
1 | mysql> select species,sex,count(*) |
9.使用多个表
pet 表记录了宠物的基本信息,还需要一张表记录他们生活中的事件,如下所示
1 | mysql> create table event (name varchar(20),date date,type varchar(20),remark varchar(250)); |
假设你想要得到宠物下崽的年龄。宠物的下崽日期在 event表格中,但要计算她在该日期的年龄,需要她的出生日期,该日期存储在 pet表格中。这意味着查询需要两个表:
1 | mysql> select pet.name,timestampdiff(year,birth,date) as age,remark |
该FROM子句连接两个表,因为查询需要从两个表中提取信息
组合(连接)来自多个表的信息时,需要指定一个表中的记录如何与另一个表中的记录匹配。
该查询使用 INNER JOIN来组合表。只有当两个表都满足ON子句中指定的条件时,内部联接才允许其中一个表中的行出现在结果中。在这个例子中, ON子句指定 pet表中的name列必须的匹配 event表的name列 。如果名称出现在一个表中但不出现在另一个表中,则该行不会出现在结果中,因为该ON 子句中的条件失败。
由于该name列出现在两个表中,因此必须具体说明引用该列时的表。这是通过将表名添加到列名称来完成的。
如果要将表中的记录与同一表中的其他记录进行比较,有时将表连接到自身会很有用。例如,要在宠物中找到繁殖对,可以pet自身加入表格,以生成候选对:
1 | mysql> select p1.name,p1.sex,p2.name,p2.sex,p1.species |
在此查询中,我们为表名指定别名以引用列,并保持每个列引用与表关联的表的实例。