MySQL 8 的学习——4从表中检索信息
SELECT 语句用于从表中提取信息。声明的一般形式是:
SELECT what_to_select
FROM which_table
WHERE conditions_to_satisfy;
what_to_select 表示想要看到的内容(可以是列名或者*
,* 代表所有列);
which_table 表示要从哪一个表检索数据;
where条件是可选的。如果存在,则 conditions_to_satisfy
指定行必须满足的一个或多个条件才有资格进行检索。
一、检索所有数据
mysql> select * from pet;
+----------+--------+---------+------+------------+------------+
| name | owner | species | sex | birth | death |
+----------+--------+---------+------+------------+------------+
| Fluffy | Harold | cat | f | 1993-02-04 | 0000-00-00 |
| Claws | Gwen | cat | m | 1994-03-17 | 0000-00-00 |
| Buffy | Harold | dog | f | 1989-05-13 | 0000-00-00 |
| Fang | Benny | dog | m | 1990-08-27 | 0000-00-00 |
| Bowser | Diane | dog | m | 1979-08-31 | 1995-07-29 |
| Chirpy | Gwen | bird | f | 1998-09-11 | 0000-00-00 |
| Whistler | Gwen | bird | NULL | 1997-12-09 | 0000-00-00 |
| Slim | Benny | snake | m | 1996-04-29 | 0000-00-00 |
| Puffball | Diane | hamster | f | 1999-03-30 | NULL |
+----------+--------+---------+------+------------+------------+
9 rows in set (0.00 sec)## 修改指定的一条记录的一个字段值
mysql> update pet-> set birth = '1989-08-31'-> where name = 'Bowser';
Query OK, 1 row affected (0.07 sec)
Rows matched: 1 Changed: 1 Warnings: 0## 查询是否更改成功,可以看到,生日更改了
mysql> select * from pet where name = 'Bowser';
+--------+-------+---------+------+------------+------------+
| name | owner | species | sex | birth | death |
+--------+-------+---------+------+------------+------------+
| Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 |
+--------+-------+---------+------+------------+------------+
1 row in set (0.00 sec)
二、检索特定行数据
有时,你不希望看到全部表数据,尤其时这个表数据的数目特别大的时候,在这种情况下,您可以对所需信息指定一些约束。
如果你只希望查询Bower的信息,你可以这样做:
mysql> SELECT * FROM pet WHERE name = 'Bowser';
+--------+-------+---------+------+------------+------------+
| name | owner | species | sex | birth | death |
+--------+-------+---------+------+------------+------------+
| Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 |
+--------+-------+---------+------+------------+------------+
字符串比较通常不区分大小写,因此您可以将名称指定为'bowser'
, 'BOWSER'
等等。查询结果是一样的。
## 你可以在任何列上指定条件,而不仅仅是 name。例如,如果您想知道1998年或之后出生的动物:
mysql> select * from pet where birth>='1998-1-1';
+----------+-------+---------+------+------------+-------+
| name | owner | species | sex | birth | death |
+----------+-------+---------+------+------------+-------+
| Chirpy | Gwen | bird | f | 1998-09-11 | NULL |
| Puffball | Diane | hamster | f | 1999-03-30 | NULL |
+----------+-------+---------+------+------------+-------+## 结合条件来定位雌性狗:
mysql> select * from pet where species='dog' and sex='f';
+-------+--------+---------+------+------------+-------+
| name | owner | species | sex | birth | death |
+-------+--------+---------+------+------------+-------+
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
+-------+--------+---------+------+------------+-------+## 前面的查询使用 AND 逻辑运算符。还有一个 OR 运算符:
mysql> select * from pet where (species='cat' and sex='m')-> or (species='dog' and sex='f');
+-------+--------+---------+------+------------+-------+
| name | owner | species | sex | birth | death |
+-------+--------+---------+------+------------+-------+
| Claws | Gwen | cat | m | 1994-03-17 | NULL |
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
+-------+--------+---------+------+------------+-------+
AND并且 OR可以混合,但 AND优先级高于 OR。如果您同时使用这两个运算符,最好使用括号明确指出条件应如何分组。
三、检索特定列数据
## 只查看 name, birth
mysql> SELECT name, birth FROM pet;
+----------+------------+
| name | birth |
+----------+------------+
| Fluffy | 1993-02-04 |
| Claws | 1994-03-17 |
| Buffy | 1989-05-13 |
| Fang | 1990-08-27 |
| Bowser | 1989-08-31 |
| Chirpy | 1998-09-11 |
| Whistler | 1997-12-09 |
| Slim | 1996-04-29 |
| Puffball | 1999-03-30 |
+----------+------------+## 要找出谁拥有宠物,请使用此查询:
mysql> SELECT owner FROM pet;
+--------+
| owner |
+--------+
| Harold |
| Gwen |
| Harold |
| Benny |
| Diane |
| Gwen |
| Gwen |
| Benny |
| Diane |
+--------+## 上面的查询有重复的记录,要最小化输出,可以通过添加关键字 DISTINCT 检索每个唯一的输出记录
mysql> SELECT DISTINCT owner FROM pet;
+--------+
| owner |
+--------+
| Benny |
| Diane |
| Gwen |
| Harold |
+--------+## 可以使用WHERE子句将行选择与列选择组合在一起。
mysql> SELECT name, species, birth FROM pet-> WHERE species = 'dog' OR species = 'cat';
+--------+---------+------------+
| name | species | birth |
+--------+---------+------------+
| Fluffy | cat | 1993-02-04 |
| Claws | cat | 1994-03-17 |
| Buffy | dog | 1989-05-13 |
| Fang | dog | 1990-08-27 |
| Bowser | dog | 1989-08-31 |
+--------+---------+------------+## where species in ('dog','cat');
mysql> SELECT NAME, species, birth FROM pet -> WHERE species IN ('dog','cat');
+--------+---------+------------+
| name | species | birth |
+--------+---------+------------+
| Fluffy | cat | 1993-02-04 |
| Claws | cat | 1994-03-17 |
| Buffy | dog | 1989-05-13 |
| Fang | dog | 1990-08-27 |
| Bowser | dog | 1989-08-31 |
+--------+---------+------------+
四、排序行数据
当行以某种有意义的方式排序时,通常更容易检查查询输出。要对结果进行排序,请使用ORDER BY
子句。
这是动物的生日,按日期排序:
## 这是动物的生日,按日期排序:
mysql> SELECT name, birth FROM pet ORDER BY birth;
+----------+------------+
| name | birth |
+----------+------------+
| Buffy | 1989-05-13 |
| Bowser | 1989-08-31 |
| Fang | 1990-08-27 |
| Fluffy | 1993-02-04 |
| Claws | 1994-03-17 |
| Slim | 1996-04-29 |
| Whistler | 1997-12-09 |
| Chirpy | 1998-09-11 |
| Puffball | 1999-03-30 |
+----------+------------+## 默认排序顺序为升序,首先是最小值。要按反向(降序)顺序排序,请将DESC关键字添加到要排序 的列的名称:
mysql> SELECT name, birth FROM pet ORDER BY birth DESC;
+----------+------------+
| name | birth |
+----------+------------+
| Puffball | 1999-03-30 |
| Chirpy | 1998-09-11 |
| Whistler | 1997-12-09 |
| Slim | 1996-04-29 |
| Claws | 1994-03-17 |
| Fluffy | 1993-02-04 |
| Fang | 1990-08-27 |
| Bowser | 1989-08-31 |
| Buffy | 1989-05-13 |
+----------+------------+## 您可以对多个列进行排序,并且可以按不同方向对不同列进行排序。例如,要按动物类型按升序排序,然后按动物类型中的出生日期按降序排序(最年轻的动物首先),请使用以下查询:
mysql> SELECT name, species, birth FROM pet-> ORDER BY species, birth DESC;
+----------+---------+------------+
| name | species | birth |
+----------+---------+------------+
| Chirpy | bird | 1998-09-11 |
| Whistler | bird | 1997-12-09 |
| Claws | cat | 1994-03-17 |
| Fluffy | cat | 1993-02-04 |
| Fang | dog | 1990-08-27 |
| Bowser | dog | 1989-08-31 |
| Buffy | dog | 1989-05-13 |
| Puffball | hamster | 1999-03-30 |
| Slim | snake | 1996-04-29 |
+----------+---------+------------+
## 上面的 DESC 关键字仅适用于紧邻其前面的列名(birth); 它不会影响species列排序顺序。
五、日期计算
MySQL提供了几个可用于执行日期计算的函数,例如,计算年龄或提取日期的部分。
要确定每只宠物的年龄,请使用此 TIMESTAMPDIFF()
功能。它的参数是您希望表达结果的单位,以及两个可以区分的日期(出生日期,现今日期)。以下查询显示每只宠物的出生日期,当前日期和年龄。一个 别名(age
)是用来使得最终输出的列标签更有意义。
mysql> select name,birth,curdate(),-> timestampdiff(year,birth,curdate()) as age-> from pet;
+----------+------------+------------+------+
| name | birth | curdate() | age |
+----------+------------+------------+------+
| Fluffy | 1993-02-04 | 2018-08-13 | 25 |
| Claws | 1994-03-17 | 2018-08-13 | 24 |
| Buffy | 1989-05-13 | 2018-08-13 | 29 |
| Fang | 1990-08-27 | 2018-08-13 | 27 |
| Bowser | 1989-08-31 | 2018-08-13 | 28 |
| Chirpy | 1998-09-11 | 2018-08-13 | 19 |
| Whistler | 1997-12-09 | 2018-08-13 | 20 |
| Slim | 1996-04-29 | 2018-08-13 | 22 |
| Puffball | 1999-03-30 | 2018-08-13 | 19 |
+----------+------------+------------+------+
9 rows in set (0.01 sec)## 查询有效,但如果以某种顺序显示行,则可以更轻松地扫描结果。
## 这可以通过添加一个ORDER BY name子句来按名称对输出进行排序来完成:
mysql> select name,birth,curdate(),-> timestampdiff(year,birth,curdate()) as age-> from pet order by name;
+----------+------------+------------+------+
| name | birth | curdate() | age |
+----------+------------+------------+------+
| Bowser | 1989-08-31 | 2018-08-13 | 28 |
| Buffy | 1989-05-13 | 2018-08-13 | 29 |
| Chirpy | 1998-09-11 | 2018-08-13 | 19 |
| Claws | 1994-03-17 | 2018-08-13 | 24 |
| Fang | 1990-08-27 | 2018-08-13 | 27 |
| Fluffy | 1993-02-04 | 2018-08-13 | 25 |
| Puffball | 1999-03-30 | 2018-08-13 | 19 |
| Slim | 1996-04-29 | 2018-08-13 | 22 |
| Whistler | 1997-12-09 | 2018-08-13 | 20 |
+----------+------------+------------+------+
9 rows in set (0.00 sec)## 以上结果可以通过 order by age 子句来排序## 类似的查询可用于确定死亡动物的死亡年龄。可以通过检查death值 是否为NULL。然后,对于那些具有非NULL值的人,计算death和 birth值之间的差值:
mysql> select name,birth,death,-> timestampdiff(year,birth,death) as age-> from pet where death is not null order by age;
+--------+------------+------------+------+
| name | birth | death | age |
+--------+------------+------------+------+
| Bowser | 1989-08-31 | 1995-07-29 | 5 |
+--------+------------+------------+------+
1 row in set (0.00 sec)
## 此处查询使用death IS NOT NULL而不是death <> NULL因为 NULL是一个特殊值,无法使用通常的比较运算符进行比较。
## <> 代表不等于 ,<=> 代表等于## 如果你想知道哪些动物下个月有生日怎么办?对于这种类型的计算,年和日是无关紧要的;
## 您只想提取birth列的月份部分 。MySQL提供了用于提取日期的部分,如一些功能 YEAR(),
## MONTH()和 DAYOFMONTH()。 MONTH()可用于提取月份。
mysql> select name,birth,month(birth) as birthMonth-> from pet-> where month(birth)<=>month(curdate());
+--------+------------+------------+
| name | birth | birthMonth |
+--------+------------+------------+
| Fang | 1990-08-27 | 8 |
| Bowser | 1989-08-31 | 8 |
+--------+------------+------------+
2 rows in set (0.00 sec)## 如果当前月份是12月,则会出现一个小的复杂情况。你不能只在月份数字(12)中添加一个并查找月份出生的动物 13,因为没有这样的月份。相反,你寻找1月(月1)出生的动物 。## 您可以编写查询,以便无论当前月份是什么,它都可以工作,因此您不必使用特定月份的数字。 DATE_ADD()使您可以将时间间隔添加到给定日期。如果您将值添加一个月CURDATE(),然后使用,则提取月份部分MONTH(),结果将生成查找生日的月份:mysql> SELECT name, birth FROM pet-> WHERE MONTH(birth) = MONTH(DATE_ADD(CURDATE(),INTERVAL 1 MONTH));## 完成相同任务的另一种方法是1在使用modulo函数(MOD)将月值包装0为当前值之后,添加1, 以获取当前后一个月:mysql> SELECT name, birth FROM pet-> WHERE MONTH(birth) = MOD(MONTH(CURDATE()), 12) + 1;## MONTH()返回1和12之间的数字。并 MOD(something,12)在0和11之间返回一个数字。所以添加1,必须在MOD()之后 .
六、使用NULL值
从概念上讲,NULL
意味着 “ 缺失的未知值 ”,并且与其他值的处理方式略有不同。
要测试NULL
,请使用 IS NULL
和IS NOT NULL
运算符,如下所示:
mysql> SELECT 1 IS NULL, 1 IS NOT NULL;
+-----------+---------------+
| 1 IS NULL | 1 IS NOT NULL |
+-----------+---------------+
| 0 | 1 |
+-----------+---------------+## 你使用算术比较操作符,如 =, <或 <>以测试NULL。要自己演示,请尝试以下查询:
mysql> SELECT 1 = NULL, 1 <> NULL, 1 < NULL, 1 > NULL;
+----------+-----------+----------+----------+
| 1 = NULL | 1 <> NULL | 1 < NULL | 1 > NULL |
+----------+-----------+----------+----------+
| NULL | NULL | NULL | NULL |
+----------+-----------+----------+----------+## 任何有 NULL 参与的算术比较的结果也是 NULL,因此你无法从此类比较中获得任何有意义的结果。## 在MySQL中,0或NULL 代表 false,除此之外的值代表 true。布尔运算的默认真值是1。mysql> SELECT 0 IS NULL, 0 IS NOT NULL, '' IS NULL, '' IS NOT NULL;
+-----------+---------------+------------+----------------+
| 0 IS NULL | 0 IS NOT NULL | '' IS NULL | '' IS NOT NULL |
+-----------+---------------+------------+----------------+
| 0 | 1 | 0 | 1 |
+-----------+---------------+------------+----------------+## 上述结果显示,完全可以将零或空字符串插入到NOT NULL列中,因为这些实际上是 NOT NULL 的。
七、模式匹配
SQL模式匹配使你可以使用 _
(下划线)匹配任何单个字符,并且 % (百分号)
匹配任意数量的字符(包括零个字符)。在MySQL中,SQL模式默认情况下不区分大小写。这里显示了一些例子。使用SQL模式时不要使用 =
或<>
,请改用LIKE
或 NOT LIKE
比较运算符。
## 要查找以字母 b 开头的 name:
mysql> select * from pet where name like 'b%';
+--------+--------+---------+------+------------+------------+
| name | owner | species | sex | birth | death |
+--------+--------+---------+------+------------+------------+
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
| Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 |
+--------+--------+---------+------+------------+------------+## 要查找以字母 fy 结尾的 name:
mysql> select * from pet where name like '%fy';
+--------+--------+---------+------+------------+-------+
| name | owner | species | sex | birth | death |
+--------+--------+---------+------+------------+-------+
| Fluffy | Harold | cat | f | 1993-02-04 | NULL |
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
+--------+--------+---------+------+------------+-------+## 要查找包含字母 w 的 name:
mysql> select * from pet where name like '%w%';
+----------+-------+---------+------+------------+------------+
| name | owner | species | sex | birth | death |
+----------+-------+---------+------+------------+------------+
| Claws | Gwen | cat | m | 1994-03-17 | NULL |
| Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 |
| Whistler | Gwen | bird | NULL | 1997-12-09 | NULL |
+----------+-------+---------+------+------------+------------+## 要查找包含五个字符的 name:
mysql> select * from pet where name like '_____';
+-------+--------+---------+------+------------+-------+
| name | owner | species | sex | birth | death |
+-------+--------+---------+------+------------+-------+
| Claws | Gwen | cat | m | 1994-03-17 | NULL |
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
+-------+--------+---------+------+------------+-------+
MySQL提供的另一种模式匹配(使用扩展的正则表达式)。当你测试此类模式的匹配项时,请使用 REGEXP_LIKE()函数( REGEXP或 RLIKE 运算符,它们是REGEXP_LIKE()的同义词 )。
以下列表描述了扩展正则表达式的一些特征:
.
匹配任何单个字符。字符类
[...]
匹配括号内的任何单个字符。例如,[abc]
匹配a
,b
或c
。要代表一系列字符,请使用短划线。[a-z]
匹配任何字母(扩展正则查询不区分大小写),而[0-9]
匹配任何数字。*
匹配前面的事物的零个或多个实例。例如,x*
匹配任意数量的x
字符,[0-9]*
匹配任意数量的数字,并.*
匹配任意数量的任何数字。如果正在测试的值有任何位置匹配正则中规则,则正则表达式模式匹配成功。(这与
LIKE
模式匹配不同,模式匹配仅在模式匹配整个值时才会成功。)使用^在pattern的开头或
$
在 pattern 的结尾,使得测试的值必须在开头或结尾匹配 pattern。
为了演示扩展正则表达式的工作原理,先前显示 LIKE
的查询将在此处重写以供使用 REGEXP_LIKE()
。
## 要查找以字母 b 开头的 name:
mysql> select * from pet where regexp_like(name,'^b');
+--------+--------+---------+------+------------+------------+
| name | owner | species | sex | birth | death |
+--------+--------+---------+------+------------+------------+
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
| Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 |
+--------+--------+---------+------+------------+------------+## 要查找以字母 fy 结尾的 name:
mysql> select * from pet where regexp_like(name,'fy$');
+--------+--------+---------+------+------------+-------+
| name | owner | species | sex | birth | death |
+--------+--------+---------+------+------------+-------+
| Fluffy | Harold | cat | f | 1993-02-04 | NULL |
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
+--------+--------+---------+------+------------+-------+## 要查找包含字母 w 的 name:
mysql> select * from pet where regexp_like(name,'w');
+----------+-------+---------+------+------------+------------+
| name | owner | species | sex | birth | death |
+----------+-------+---------+------+------------+------------+
| Claws | Gwen | cat | m | 1994-03-17 | NULL |
| Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 |
| Whistler | Gwen | bird | NULL | 1997-12-09 | NULL |
+----------+-------+---------+------+------------+------------+## 要查找包含五个字符的 name:
mysql> select * from pet where regexp_like(name, '^.....$');
+-------+--------+---------+------+------------+-------+
| name | owner | species | sex | birth | death |
+-------+--------+---------+------+------------+-------+
| Claws | Gwen | cat | m | 1994-03-17 | NULL |
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
+-------+--------+---------+------+------------+-------+## 还可以使用{n}(“repeat-n-times”)运算符编写 字符重复次数,以上查询可以使用该命令代替重复次数
mysql> select * from pet where regexp_like(name, '^.{5}$');
+-------+--------+---------+------+------------+-------+
| name | owner | species | sex | birth | death |
+-------+--------+---------+------+------------+-------+
| Claws | Gwen | cat | m | 1994-03-17 | NULL |
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
+-------+--------+---------+------+------------+-------+
八、计数行
## COUNT(*)计算行数,因此计算动物的查询如下所示:
mysql> select count(*) from pet;
+----------+
| count(*) |
+----------+
| 9 |
+----------+## COUNT()如果您想了解每位业主拥有多少宠物,您可以使用:
mysql> select owner,count(*) from pet group by owner;
+--------+----------+
| owner | count(*) |
+--------+----------+
| Harold | 2 |
| Gwen | 3 |
| Benny | 2 |
| Diane | 2 |
+--------+----------+## 上述查询中使用 group by 将每个记录根据 owner 进行分组。## 查询每种动物的数量
mysql> select species,count(*) from pet group by species;
+---------+----------+
| species | count(*) |
+---------+----------+
| cat | 2 |
| dog | 3 |
| bird | 2 |
| snake | 1 |
| hamster | 1 |
+---------+----------+## 每性别的动物数量:
mysql> select sex,count(*) from pet group by sex;
+------+----------+
| sex | count(*) |
+------+----------+
| f | 4 |
| m | 4 |
| NULL | 1 |
+------+----------+
## NULL表示性别未知## 每种物种和性别组合的动物数量:
mysql> select species,sex,count(*) from pet group by species,sex;
+---------+------+----------+
| species | sex | count(*) |
+---------+------+----------+
| cat | f | 1 |
| cat | m | 1 |
| dog | f | 1 |
| dog | m | 2 |
| bird | f | 1 |
| bird | NULL | 1 |
| snake | m | 1 |
| hamster | f | 1 |
+---------+------+----------+## 使用时无需检索整个表 COUNT()。例如,以前的查询,只在狗和猫上执行时,如下所示:
mysql> select species,sex,count(*) from pet -> where species in ('cat','dog') -> group by species,sex;
+---------+------+----------+
| species | sex | count(*) |
+---------+------+----------+
| cat | f | 1 |
| cat | m | 1 |
| dog | f | 1 |
| dog | m | 2 |
+---------+------+----------+## 或者,如果你想要每性别的动物数量只对已知性别的动物:
mysql> select species,sex,count(*) from pet where sex is not null group by species,sex;
+---------+------+----------+
| species | sex | count(*) |
+---------+------+----------+
| cat | f | 1 |
| cat | m | 1 |
| dog | f | 1 |
| dog | m | 2 |
| bird | f | 1 |
| snake | m | 1 |
| hamster | f | 1 |
+---------+------+----------+
九、使用多个表
该pet
表记录了你拥有的宠物。如果你想记录有关它们的其他信息,例如生活中的事件,例如兽医的访问或者出生时,您需要另一个 表。这个表应该是什么样的?它需要包含以下信息:
宠物名称,以便您了解每个事件所属的动物。
日期,以便您知道事件发生的时间。
描述事件的字段。
如果您希望能够对事件进行分类,则为事件类型字段。
鉴于这些注意事项,event 表的CREATE TABLE
语句可能如下所示:
mysql> create table event(-> name varchar(20),-> date date,-> type varchar(20),-> remark varchar(255)-> );
Query OK, 0 rows affected (0.13 sec)mysql> show tables;
+---------------------+
| Tables_in_menagerie |
+---------------------+
| event |
| pet |
+---------------------+
2 rows in set (0.01 sec)mysql> describe event;
+--------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+--------------+------+-----+---------+-------+
| name | varchar(20) | YES | | NULL | |
| date | date | YES | | NULL | |
| type | varchar(20) | YES | | NULL | |
| remark | varchar(255) | YES | | NULL | |
+--------+--------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
与pet
表一样,最简单的方法是通过创建包含以下信息的制表符分隔文本文件来加载初始记录。
name | date | type | remark |
---|---|---|---|
Fluffy | 1995-05-15 | litter | 4 kittens, 3 female, 1 male |
Buffy | 1993-06-23 | litter | 5 puppies, 2 female, 3 male |
Buffy | 1994-06-19 | litter | 3 puppies, 3 female |
Chirpy | 1999-03-21 | vet | needed beak straightened |
Slim | 1997-08-03 | vet | broken rib |
Bowser | 1991-10-12 | kennel | |
Fang | 1991-10-12 | kennel | |
Fang | 1998-08-28 | birthday | Gave him a new chew toy |
Claws | 1998-03-17 | birthday | Gave him a new flea collar |
Whistler | 1998-12-09 | birthday | First birthday |
## 导入数据
mysql> load data local infile 'D:/event.txt' into table event lines terminated by '\r\n';
Query OK, 10 rows affected (0.02 sec)
Records: 10 Deleted: 0 Skipped: 0 Warnings: 0## 查询数据
mysql> select * from event;
+----------+------------+----------+-----------------------------+
| name | date | type | remark |
+----------+------------+----------+-----------------------------+
| Fluffy | 1995-05-15 | litter | 4 kittens, 3 female, 1 male |
| Buffy | 1993-06-23 | litter | 5 puppies, 2 female, 3 male |
| Buffy | 1994-06-19 | litter | 3 puppies, 3 female |
| Chirpy | 1999-03-21 | vet | needed beak straightened |
| Slim | 1997-08-03 | vet | broken rib |
| Bowser | 1991-10-12 | kennel | NULL |
| Fang | 1991-10-12 | kennel | NULL |
| Fang | 1998-08-28 | birthday | Gave him a new chew toy |
| Claws | 1998-03-17 | birthday | Gave him a new flea collar |
| Whistler | 1998-12-09 | birthday | First birthday |
+----------+------------+----------+-----------------------------+
10 rows in set (0.00 sec)
假设你想要找出每只宠物的窝的年龄。我们之前看到过如何计算两个日期的年龄。收养的 litter的日期在event 表中,但要计算她在该日期的年龄,您需要她的出生日期,该日期存储在 pet 表中。这意味着查询需要两个表:
mysql> select pet.name,timestampdiff(year,birth,date) as age,remark-> from pet inner join event-> on pet.name = event.name-> where event.type = 'litter';
+--------+------+-----------------------------+
| name | age | remark |
+--------+------+-----------------------------+
| Fluffy | 2 | 4 kittens, 3 female, 1 male |
| Buffy | 4 | 5 puppies, 2 female, 3 male |
| Buffy | 5 | 3 puppies, 3 female |
+--------+------+-----------------------------+
3 rows in set (0.00 sec)
有关此查询的注意事项有以下几点:
该
FROM
子句连接两个表,因为查询需要从两个表中提取信息。组合(连接)来自多个表的信息时,需要指定一个表中的记录如何与另一个表中的记录匹配。这很容易,因为它们都有一个
name
列。该查询使用ON
子句根据值匹配两个表中的记录name
。该查询使用
INNER JOIN
来组合表。当且仅当两个表都满足ON子句中指定的条件时,INNER JOIN允许来自任一表的行出现在结果中。在此示例中,ON子句指定pet表中的name列必须与event表中的name列匹配。如果name出现在一个表中但不出现在另一个表中,则该行不会出现在结果中,因为ON子句中的条件失败。由于
name
列出现在两个表中,因此你必须具体说明引用该name列时的表。这是通过将表名添加到列名称来完成的。
如果要将表中的记录与同一表中的其他记录进行比较,有时将表连接到自身会很有用。例如,要在您的宠物中找到繁殖对,您可以pet
自己加入表格,以生成类似物种的男性和女性候选对:
mysql> SELECT p1.name, p1.sex, p2.name, p2.sex, p1.species-> FROM pet AS p1 INNER JOIN pet AS p2 -> ON p1.species = p2.species AND p1.sex = 'f' AND p2.sex = 'm';
+--------+------+--------+------+---------+
| name | sex | name | sex | species |
+--------+------+--------+------+---------+
| Fluffy | f | Claws | m | cat |
| Buffy | f | Fang | m | dog |
| Buffy | f | Bowser | m | dog |
+--------+------+--------+------+---------+## 在此查询中,我们为表名指定别名以引用列,并保持每个列引用与表关联的表的实例。
MySQL 8 的学习——4从表中检索信息相关推荐
- mysql数据库(7):表中检索信息
(1)选择所有数据:select * from pet; (2)修改表内容 方法一:先删除用 DELETE FROM pet; 去修改txt中内容,再LOAD DATA LOCAL INFILE ' ...
- 编写SQL语句,从Customers表中检索所有的ID(cust_id)
问题: 编写SQL语句,从Customers表中检索所有的ID(cust_id) 答案: SELECT cust_idFROM Customers; SQL语句中用来检索信息的就是SELECT语句了. ...
- html调用mysql数据库表里值,如何从MYSQL数据库正确调用行到HTML表中
我有一个表格,用户填写信息添加到MySQL表中.如何从MYSQL数据库正确调用行到HTML表中 现在,当我尝试显示表我得到 ID Name Phone - - - 一个非常薄的线表头下出现的.我检查了 ...
- SQL1 从 Customers 表中检索所有的 ID
描述 现有表Customers如下: cust_id A B C [问题] 编写 SQL 语句,从 Customers 表中检索所有的cust_id [示例答案] 返回cust_id列的内容 cust ...
- 如何修改数据表中的信息
要修改数据表中的信息,你可以使用 UPDATE 语句. UPDATE 语句的基本语法如下: UPDATE 表名称 SET 列名称 = 新值 WHERE 条件;
- django 数据库mysql学习向数据库表中添加数据
环境:windows ,已经安装了 mysql, 安装了django 1.新建一个django 项目 2.新建一个子应用 python manage.py startapp moelsinfo 3.在 ...
- MySQL教程(十一)—— 操作数据表中的记录
1 插入记录 1.1 INSERT 1 INSERT [INTO] tb1_name[(col_name,...)] {VALUES | VALUE} ({expr | DEFAULT},...) ...
- mysql+表中公共信息,計算mysql中兩個表之間的公共行數
so here's my question... 這是我的問題- Hi have two tables in mysql, called go_H and go_J, both looking lik ...
- mysql 对表插入多行_MySQL表中怎么一次插入两行或更多行
是的,我们可以一次在一个表中插入两行或更多行.以下是语法-insert into yourTableName(yourColumnName1,yourColumnName2) values(yourV ...
最新文章
- 某大厂程序员吐槽:老家亲戚狮子大开口,竟跟自己借八十万给儿子买房!
- Auto.js Pro如何连接VS Code插件
- CentosMySQL5.6安装方法
- eclipse启动了tomcat,但是浏览器打不开欢迎页
- HDU2193-AVL-数据结构-AVL
- 深入浅出 数据库索引
- 解析activity之间数据传递方法的详解
- Solr基础,在Eclipse中运行Solr
- python—json模块的编码与解码
- js格式化SQL语句
- opencv 图像平滑处理(python)
- pdf怎么移除权限口令,忘记pdf密码如何找回?
- mysql PTA题解查询平均成绩最高的前三名同学
- 碰到斑马打印机下载字体问题
- 浅析:光纤跳线的插入损耗和回波损耗
- 震惊一个月销800万的模式,全新拼团模式全攻略(运营干货)
- 京东广告推荐机器学习系统实践
- 卷积神经网络超详细介绍
- 请编写函数实现自然底数 e=2.718281828
- FCFS和SJF算法
热门文章
- 商标注册查询入口官网在国家知识产权局商标局查询
- 如何批量给pdf文件命名?
- PLC远程监控与数据采集方案
- java synchronized_Java中synchronized关键字理解
- 一文读懂智能对话系统
- pd.DataFrame转换成list
- c# DGV导出excel 使用object类型数组,解决string类型需双击后或分列才可运算的异常
- 2nd homework of OS
- html转换markdownpad,MarkdownPad2导出HTML支持[TOC]
- 土木工程结构力学————钢架的位移法