MySQL必知必会读书笔记------1

主键(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的用法示例:

  1. 对单个列使用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行。

  1. 返回从第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. 比较运算符:

    • =:等于
    • <>不等于

!=:不等于

    • >:大于
    • >=:大于等于
  1. 逻辑运算符:
    • AND:逻辑与,要求所有条件都满足。
    • OR:逻辑或,要求至少一个条件满足。
    • NOT:逻辑非,用于否定条件。
  1. 通配符:
    • %:表示任意字符序列(可以包含零个或多个字符)。
    • _:表示任意单个字符。

使用示例:

     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进行逻辑与运算。

通过使用圆括号,您可以明确定义条件之间的优先级和逻辑关系,确保查询的条件计算顺序与您的预期一致。圆括号可以嵌套使用,使得查询条件更加复杂且灵活。请根据您的查询需求使用合适的圆括号来组织和分组条件。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值