从数据表查询数据(select)
该SELECT
语句用于从表中提取信息。该语句的一般形式为:
SELECT what_to_selectFROM which_tableWHERE conditions_to_satisfy;
what_to_select
指示您要参见的内容。这可以是列的列表,也*
可以表示“所有列”。”which_table
表示要从中检索数据的表。该WHERE
子句是可选的。如果存在,则conditions_to_satisfy
指定行必须满足的一个或多个条件才有资格进行检索。
选择所有数据
最简单的形式SELECT
从表中检索所有内容:
mysql>SELECT *FROM pet; +---------- +-------- +--------- +------ +------------ +------------ + | name | owner | species | sex | birth | death | +---------- +-------- +--------- +------ +------------ +------------ + | Fluffy | Harold | cat | f | 1993 -02 -04 | NULL | | Claws | Gwen | cat | m | 1994 -03 -17 | NULL | | Buffy | Harold | dog | f | 1989 -05 -13 | NULL | | Fang | Benny | dog | m | 1990 -08 -27 | NULL | | Bowser | Diane | dog | m | 1979 -08 -31 | 1995 -07 -29 | | Chirpy | Gwen | bird | f | 1998 -09 -11 | NULL | | Whistler | Gwen | bird | NULL | 1997 -12 -09 | NULL | | Slim | Benny | snake | m | 1996 -04 -29 | NULL | | Puffball | Diane | hamster | f | 1999 -03 -30 | NULL | +---------- +-------- +--------- +------ +------------ +------------ +
SELECT
如果您想参见整个表(例如,在将初始数据集加载到表中之后),则这种形式非常有用。例如,您可能碰巧认为Bowser的出生日期似乎不太正确。查阅原始的血统书,您会发现正确的出生年份应该是1989,而不是1979。
至少有两种方法可以解决此问题:
编辑文件
pet.txt
以更正错误,然后清空表并使用DELETE
和重新加载它LOAD DATA
:mysql>
DELETE FROM pet; mysql>LOAD DATA LOCAL INFILE 'pet.txt'INTO TABLE pet;但是,如果执行此操作,则还必须重新输入Puffball的记录。
使用
UPDATE
语句仅修复错误的记录:mysql>
UPDATE petSET birth = '1989-08-31'WHERE name = 'Bowser';该
UPDATE
问题仅更改的记录,不要求您重新加载表。
选择特定行
如上一节所示,很容易检索整个表。只需WHERE
从SELECT
语句中省略该子句即可。但通常您不希望看到整个表格,尤其是当表格变大时。取而代之的是,您通常对回答特定问题更感兴趣,在这种情况下,您可以对所需信息指定一些约束。让我们从与宠物有关的问题来看一些选择查询。
您只能从表中选择特定的行。例如,如果要验证对Bowser生日的更改,请选择Bowser的记录,如下所示:
mysql>SELECT *FROM petWHERE name = 'Bowser'; +-------- +------- +--------- +------ +------------ +------------ + | name | owner | species | sex | birth | death | +-------- +------- +--------- +------ +------------ +------------ + | Bowser | Diane | dog | m | 1989 -08 -31 | 1995 -07 -29 | +-------- +------- +--------- +------ +------------ +------------ +
输出确认该年正确记录为1989,而不是1979。
字符串比较通常不区分大小写,因此您可以将名称指定为'bowser'
,'BOWSER'
等等。查询结果相同。
您可以在任何列上指定条件,而不仅仅是name
。例如,如果您想知道在1998年或之后出生的动物,请测试以下列birth
:
mysql>SELECT *FROM petWHERE 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 petWHERE species = 'dog' AND sex = 'f'; +------- +-------- +--------- +------ +------------ +------- + | name | owner | species | sex | birth | death | +------- +-------- +--------- +------ +------------ +------- + | Buffy | Harold | dog | f | 1989 -05 -13 | NULL | +------- +-------- +--------- +------ +------------ +------- +
前面的查询使用AND
逻辑运算符。还有一个OR
运算符:
mysql>SELECT *FROM petWHERE species = 'snake' OR species = 'bird'; +---------- +------- +--------- +------ +------------ +------- + | name | owner | species | sex | birth | death | +---------- +------- +--------- +------ +------------ +------- + | Chirpy | Gwen | bird | f | 1998 -09 -11 | NULL | | Whistler | Gwen | bird | NULL | 1997 -12 -09 | NULL | | Slim | Benny | snake | m | 1996 -04 -29 | NULL | +---------- +------- +--------- +------ +------------ +------- +
AND
并且OR
可以混合使用,尽管AND
优先级高于OR
。如果同时使用这两个运算符,则最好使用括号来明确指示应如何对条件进行分组:
mysql>SELECT *FROM petWHERE (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 | +------- +-------- +--------- +------ +------------ +------- +
选择特殊列
如果您不想看到表中的整个行,只需用逗号分隔您感兴趣的列的名称即可。例如,如果您想知道动物何时出生,请选择name
和birth
列:
mysql>SELECT name , birthFROM 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 | +-------- +
注意,查询只是owner
从每个记录中检索该列,并且其中一些出现多次。为了最大程度地减少输出,只需添加关键字一次即可检索每个唯一的输出记录DISTINCT
:
mysql>SELECT DISTINCT owner FROM pet; +-------- + | owner | +-------- + | Benny | | Diane | | Gwen | | Harold | +-------- +
您可以使用WHERE
子句将行选择与列选择结合起来。例如,要仅获取狗和猫的出生日期,请使用以下查询:
mysql>SELECT name , species, birthFROM petWHERE 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 | +-------- +--------- +------------ +