主键(primary key)一列(或一组列),其值能够唯一区分表中每个行。
唯一标识表中每行的这个列(或这组列)称为主键。主键用来表示一个特定的行。没有主键,更新或删除表中特定行很困难,因为没有安全的方法保证只涉及相关的行。
表中的任何列都可以作为主键,只要它满足以下条件:
任意两行都不具有相同的主键值;
每个行都必须具有一个主键值(主键列不允许NULL值)。
主键的最好习惯 除MySQL强制实施的规则外,应该坚持的几个普遍认可的最好习惯为:
不更新主键列中的值;
不重用主键列的值;
不在主键列中使用可能会更改的值。(例如,如果使用一个名字作为主键以标识某个供应商,当该供应商合并和更改其名字时,必须更改这个主键。)
检索数据
SELECT语句:它的用途是从一个或多个表中检索信息。为了使用SELECT检索表数据,必须至少给出两条信息——想选择什么,以及从什么地方选择
SELECT prod_name FROM products;
上述语句利用SELECT语句从products表中检索一个名为prod_name的列。所需的列名在SELECT关键字之后给出,FROM关键字指出从其中检索数据的表名。
结束SQL语句 多条SQL语句必须以分号(;)分隔。MySQL如同多数DBMS一样,不需要在单条SQL语句后加分号。但特定的DBMS可能必须在单条SQL语句后加上分号。当然,如果愿意可以总是加上分号。事实上,即使不一定需要,但加上分号肯定没有坏处。如果你使用的是mysql命令行,必须加上分号来结束SQL语句。
SQL语句和大小写 请注意,SQL语句不区分大小写,因此SELECT与select是相同的。同样,写成Select也没有关系。许多SQL开发人员喜欢对所有SQL关键字使用大写,而对所有列和表名使用小写,这样做使代码更易于阅读和调试。
使用空格 在处理SQL语句时,其中所有空格都被忽略。SQL语句可以在一行上给出,也可以分成许多行。多数SQL开发人员认为将SQL语句分成多行更容易阅读和调试。
检索多个列
要想从一个表中检索多个列,使用相同的SELECT语句。唯一的不同是必须在SELECT关键字后给出多个列名,列名之间必须以逗号分隔。
当心逗号 在选择多个列时,一定要在列名之间加上逗号,但最后一个列名后不加。如果在最后一个列名后加了逗号,将出现错误。
下面的SELECT语句从products表中选择3列:
SELECT prod_id,prod_name,prod_price FROM products;
与前一个例子一样,这条语句使用SELECT语句从表products中选择数据。在这个例子中,指定了3个列名,列名之间用逗号分隔。
检索所有列
除了指定所需的列外(如上所述,一个或多个列),SELECT语句还可以检索所有的列而不必逐个列出它们。这可以通过在实际列名的位置使用星号(*)通配符来达到,如下所示:
SELECT*FROM products;
如果给定一个通配符(*),则返回表中所有列
使用通配符 一般,除非你确实需要表中的每个列,否则最好别使用*通配符。虽然使用通配符可能会使你自己省事,不用明确列出所需列,但检索不需要的列通常会降低检索和应用程序的性能。
检索未知列 使用通配符有一个大优点。由于不明确指定列名(因为星号检索每个列),所以能检索出名字未知的列。
检索不同的行
得出products表中产品的所有供应商ID:
SELECT vend_id FROM products;
那么,如何检索出有不同值的列表呢?解决办法是使用DISTINCT关键字,顾名思义,此关键字指示MySQL只返回不同的值。
SELECT DISTINCT vend_id FROM products;
在MySQL中,DISTINCT用于返回唯一值的查询结果。它可以应用于一个或多个列,用于消除结果集中的重复行。以下是DISTINCT的用法示例:
- 对单个列使用DISTINCT:
SELECT DISTINCT column_name FROM table_name;
这将返回指定列中的唯一值,消除重复的行。
2. 对多个列使用DISTINCT:
SELECT DISTINCT column1, column2 FROM table_name;
这将返回指定多个列的唯一组合,消除具有相同值的行。
3. 结合其他条件使用DISTINCT:
SELECT DISTINCT column_name FROM table_name WHERE condition;
在WHERE子句中添加其他条件,以限制查询结果的范围,并返回满足条件的唯一值。
需要注意的是,DISTINCT适用于整个查询结果集,而不仅仅是单个列。它根据指定的列或列组合来确定唯一性,并返回满足唯一性条件的行。
请注意,当在查询中使用DISTINCT时,MySQL将比较所有指定列的值。如果表中存在大量数据或查询涉及多个列,可能会影响查询性能。因此,在使用DISTINCT时需要谨慎使用,并根据具体情况考虑优化查询。
限制结果
LIMIT用于在MySQL查询中限制返回结果的行数。它可以与SELECT语句一起使用,以便只返回满足条件的一部分结果。以下是LIMIT的用法详解:
基本语法:
SELECT column_name FROM table_name LIMIT [offset,] row_count;
- row_count指定要返回的行数。它是一个非负整数,表示从结果集中返回的最大行数。
- offset是可选参数,用于指定要跳过的起始行数。它也是一个非负整数,表示从结果集的哪一行开始返回。
使用示例:
1. 返回前N行:
SELECT column_name FROM table_name LIMIT N;
这将返回查询结果的前N行。
- 返回从第M行开始的N行:
SELECT column_name FROM table_name LIMIT M, N;
这将跳过前M行,并返回从第M+1行开始的N行。
1. 与ORDER BY结合使用:
SELECT column_name FROM table_name ORDER BY column_name LIMIT N;
这将对指定的列进行排序,并返回排序后的前N行。
2. 返回结果的一部分:
SELECT column_name FROM table_name LIMIT N OFFSET M;
这与示例2相同,使用了OFFSET关键字来指定要跳过的起始行数。
需要注意的是,LIMIT在查询中的位置通常是在最后,用于限制返回结果的行数。如果不指定OFFSET,则默认从第一行开始返回。如果不指定LIMIT,则将返回所有满足条件的行。
使用完全限定的表名
完全限定的表名在MySQL中用于明确指定数据库和表的名称,以避免歧义或确保查询在正确的上下文中执行。它由数据库名称、表名称和可选的表别名组成。
完全限定的表名的基本语法如下:
SELECT column_name FROM database_name.table_name [AS alias_name];
- database_name:指定数据库的名称。如果查询在当前数据库中执行,可以省略数据库名称。如果要从其他数据库中选择表,必须提供数据库名称。
- table_name:指定表的名称。它是必需的,用于指定要查询的具体表。
- alias_name:可选参数,用于给表指定别名。别名是为表指定的一个临时名称,可用于简化查询语句或在多表连接中进行引用。
使用示例:
1. 在同一数据库中选择表:
SELECT column_name FROM table_name;
这是最简单的形式,用于在当前数据库中选择指定表。
2. 在其他数据库中选择表:
SELECT column_name FROM database_name.table_name;
如果要从其他数据库中选择表,需要在表名前提供数据库名称。
3. 使用表别名:
SELECT column_name FROM table_name AS alias_name;
别名用于为表指定一个临时名称,以便在查询中引用。
4. 使用完全限定的表名和别名:
SELECT column_name FROM database_name.table_name AS alias_name;
这是完全限定的表名的完整形式,包括数据库名称、表名称和别名。
使用完全限定的表名可以帮助消除歧义,并确保查询在正确的上下文中执行。它对于多个数据库之间的查询或具有相同表名的情况非常有用。
排序检索数据
排序数据
ORDER BY用于在MySQL查询中按指定的列对结果进行排序。它可以以升序(ASC)或降序(DESC)的方式对结果进行排序。以下是ORDER BY的用法详解:
基本语法:
SELECT column_name FROM table_name ORDER BY column_name [ASC|DESC];
- column_name:指定要排序的列的名称。
- ASC:可选参数,表示按升序进行排序(默认)。即较小的值排在前面。
- DESC:可选参数,表示按降序进行排序。即较大的值排在前面。
使用示例:
1. 按单个列进行升序排序:
SELECT column_name FROM table_name ORDER BY column_name ASC;
这将按指定列的值进行升序排序。
2. 按单个列进行降序排序:
SELECT column_name FROM table_name ORDER BY column_name DESC;
这将按指定列的值进行降序排序。
3. 按多个列进行排序:
SELECT column1, column2 FROM table_name ORDER BY column1 ASC, column2 DESC;
这将首先按column1列进行升序排序,然后在具有相同column1值的行之间按column2列进行降序排序。
4. 使用别名排序:
SELECT column_name AS alias_name FROM table_name ORDER BY alias_name ASC;
如果在查询中使用了列别名,可以使用别名进行排序。
按多个列排序
按多个列排序时,可以在ORDER BY子句中指定多个列,并为每个列指定排序顺序(升序或降序)。以下是按多个列排序的示例和说明:
基本语法:
SELECT column1, column2 FROM table_name ORDER BY column1 [ASC|DESC], column2 [ASC|DESC];
示例解释:
- column1和column2是要排序的列的名称。
- [ASC|DESC]是可选参数,用于指定每个列的排序顺序。如果不指定,默认为ASC(升序)。
示例:
1. 按两个列进行排序,都是升序:
SELECT column1, column2 FROM table_name ORDER BY column1, column2;
这将首先按column1列进行升序排序,然后在具有相同column1值的行之间按column2列进行升序排序。
2. 按第一个列进行升序排序,第二个列进行降序排序:
SELECT column1, column2 FROM table_name ORDER BY column1 ASC, column2 DESC;
这将按column1列的升序排序,然后在具有相同column1值的行之间按column2列的降序排序。
3. 按多个列进行降序排序:
SELECT column1, column2 FROM table_name ORDER BY column1 DESC, column2 DESC;
这将按column1列的降序排序,然后在具有相同column1值的行之间按column2列的降序排序。
需要注意的是,ORDER BY通常用于在查询结果中对行进行排序。它可以与SELECT语句一起使用,也可以与其他查询子句(如WHERE)结合使用。在ORDER BY子句中可以指定一个或多个列进行排序,还可以使用列别名进行排序。
如果未指定排序顺序(ASC或DESC),则默认为ASC(升序)。使用ORDER BY可以对查询结果按特定的列进行排序,以满足特定的需求。
过 滤 数 据
使用WHERE子句
WHERE子句用于在MySQL查询中根据指定条件筛选数据。它允许根据列的值、逻辑运算符和比较运算符来定义筛选条件。
基本语法:
SELECT column1, column2 FROM table_name WHERE condition;
- column1, column2:指定要查询的列。
- table_name:指定要查询的表。
- condition:定义筛选条件的逻辑表达式。
筛选条件可以使用以下运算符和操作符:
1. 比较运算符:
- =:等于
- <>不等于
!=:不等于
- >:大于
- >=:大于等于
- 逻辑运算符:
- AND:逻辑与,要求所有条件都满足。
- OR:逻辑或,要求至少一个条件满足。
- NOT:逻辑非,用于否定条件。
- 通配符:
- %:表示任意字符序列(可以包含零个或多个字符)。
- _:表示任意单个字符。
使用示例:
1. 筛选满足某个条件的行:
SELECT column1, column2 FROM table_name WHERE column1 = value;
这将返回column1等于指定值的行。
2. 使用逻辑运算符组合多个条件:
SELECT column1, column2 FROM table_name WHERE column1 = value1 AND column2 > value2;
这将返回满足column1等于value1且column2大于value2的行。
3. 使用通配符进行模糊匹配:
SELECT column1, column2 FROM table_name WHERE column1 LIKE 'abc%';
这将返回column1以"abc"开头的行。
4. 使用多个条件进行筛选:
SELECT column1, column2 FROM table_name WHERE column1 = value1 OR column2 <> value2;
这将返回满足column1等于value1或column2不等于value2的行。
通过WHERE子句,可以根据特定条件对查询结果进行过滤,从而仅获取满足条件的行。筛选条件可以使用比较运算符、逻辑运算符和通配符来实现不同的筛选需求。
数据过滤
当使用WHERE子句进行数据过滤时,可以组合多个条件来建立更复杂和高级的搜索条件。此外,NOT和IN操作符也可以用于进一步扩展查询的筛选能力。下面我们将详细介绍如何组合WHERE子句以及使用NOT和IN操作符。
1. 组合多个条件:
使用逻辑运算符(AND、OR)可以组合多个条件来构建更复杂的搜索条件:
SELECT column1, column2 FROM table_name WHERE condition1 AND condition2 OR condition3;
这将返回满足条件1和条件2,或者满足条件3的行。2. 使用NOT操作符:
NOT操作符用于否定一个条件,即排除满足该条件的行:SELECT column1, column2 FROM table_name WHERE NOT condition;
这将返回不满足条件的行。3. 使用IN操作符:
IN操作符用于指定一个值列表,以便筛选满足列表中任意值的行:SELECT column1, column2 FROM table_name WHERE column1 IN (value1, value2, value3);
这将返回满足column1值为value1、value2或value3的行。4. 使用NOT IN操作符:
NOT IN操作符用于指定一个值列表,以便筛选不满足列表中任意值的行:SELECT column1, column2 FROM table_name WHERE column1 NOT IN (value1, value2, value3);
这将返回不满足column1值为value1、value2或value3的行。通过组合多个条件和使用NOT和IN操作符,您可以根据更复杂和特定的搜索条件对数据进行过滤。这样可以更精确地选择所需的行,以满足特定的查询需求。
在WHERE子句中使用圆括号
在WHERE子句中使用圆括号可以明确指定条件之间的逻辑关系和优先级。圆括号可以用于分组条件,确保条件的逻辑运算顺序正确,并且逻辑关系按预期进行计算。以下是在WHERE子句中使用圆括号的示例和说明:
1. 分组条件:
SELECT column1, column2 FROM table_name WHERE (condition1 AND condition2) OR condition3;
在这个例子中,条件1和条件2被圆括号括起来,表示它们作为一个组进行逻辑运算。然后,该组条件与条件3进行逻辑或运算。2. 嵌套分组:
SELECT column1, column2 FROM table_name WHERE (condition1 OR (condition2 AND condition3)) AND condition4;
这个例子中,使用了嵌套的圆括号来分组条件。首先,条件2和条件3被圆括号括起来,作为一个子组进行逻辑运算。然后,该子组与条件1进行逻辑或运算。最后,该结果与条件4进行逻辑与运算。通过使用圆括号,您可以明确定义条件之间的优先级和逻辑关系,确保查询的条件计算顺序与您的预期一致。圆括号可以嵌套使用,使得查询条件更加复杂且灵活。请根据您的查询需求使用合适的圆括号来组织和分组条件。