MySQL学习笔记(二):查找记录方法-SELECT(详细)

来源:互联网 发布:手机优化工具 编辑:程序博客网 时间:2024/06/15 05:04

SELECT使用方法

  • 查找记录

    SELECT select_expr[,select_expr...]

    [

    • FROM tb_references
    • [WHERE where_condition]
    • [GROUP BY {col_name|position} [ASC|DESC],...]
    • [HAVING where_condition]
    • [ORDER BY {col_name | expr | position} [ASC|DESC],...]
    • [LIMIT {[offset,] row_count|row_count OFFSET offset}]

      ]
  • 关于其中的一些名词解释

    • select_expr
      • 查询表达式
      • 每一个表达式表示所需要查找的一列,至少有一个
      • 多个列之间以英文逗号分隔
      • 星号(*)表示多有列。(tb_name.*可以表示命名表的所有列)
      • 查询表达式可以使用[AS] alias_name为其赋予别名
      • 别名可用于GROUP BY,ORDER BYHAVING子句
    • WHERE
      • 条件表达式
      • 对记录进行过滤,如果没有指定WHERE子句,则显示所有记录
      • WHERE表达式中,可以使用MySQL支持的函数或运算符。
    • GROUP BY
      • 查询结果分组
    • HAVING
      • 分组条件
    • ORDER BY
      • 对查询结果进行排序
    • LIMIT
      • 限制查询结果返回的数量

SELECT方法示例


使用示例数据表

在下面的方法演示中都以这张数据表作演示

mysql> SELECT * FROM users2;+----+----------+----------------------------------+-----+------+| id | username | userpassword                     | age | sex  |+----+----------+----------------------------------+-----+------+|  1 | AAA      | IAMPASSWORD                      |  25 |    1 ||  3 | BBB      | IAMPASSWORD                      |  45 |    1 ||  4 | CCC      | *asfjdhia                        |  26 |    1 ||  6 | DDD      | *dsfjksp;flke                    |  32 |    1 ||  8 | FFF      | bc9c74cd849e1f1b99b16b0d92292bf6 |  50 |    0 ||  9 | GGG      | ahnkhFKAJ                        |  15 | NULL || 10 | WOO      | **qwdfhjoQ                       |  25 | NULL |+----+----------+----------------------------------+-----+------+7 rows in set (0.01 sec)

查询指定列的数据

例如查询id字段、username字段的内容

  • SELECT select_expr[,select_expr...]
mysql> SELECT id,username FROM users2;+----+----------+| id | username |+----+----------+|  1 | AAA      ||  3 | BBB      ||  4 | CCC      ||  6 | DDD      ||  8 | FFF      ||  9 | GGG      || 10 | WOO      |+----+----------+7 rows in set (0.00 sec)mysql> SELECT username,id FROM users;Empty set (0.01 sec)mysql> SELECT username,id FROM users2;+----------+----+| username | id |+----------+----+| AAA      |  1 || BBB      |  3 || CCC      |  4 || DDD      |  6 || FFF      |  8 || GGG      |  9 || WOO      | 10 |+----------+----+7 rows in set (0.00 sec)

可以发现两者表的顺序适合查询语句中的select_expr顺序是一致的。


查询指定列的数据,并作为别名出结果

  • SELECT select_expr [AS] alias_name

将查询的id字段以uidusername字段以uname列出结果

mysql> SELECT id AS uid, username AS uname FROM users2;+-----+-------+| uid | uname |+-----+-------+|   1 | AAA   ||   3 | BBB   ||   4 | CCC   ||   6 | DDD   ||   8 | FFF   ||   9 | GGG   ||  10 | WOO   |+-----+-------+7 rows in set (0.00 sec)

在表达式中[AS]是允许不键入的,但是在实际操作中建议的还是都给写上,以免发生误解。例如以下操作:
它的意义为查询users2表中的id字段的值,并取别名为username展示出来。而不是查询users2表中idusername字段的值。

mysql> SELECT id username FROM users2;+----------+| username |+----------+|        1 ||        3 ||        4 ||        6 ||        8 ||        9 ||       10 |+----------+7 rows in set (0.01 sec)

将查询结果分类分组

  • SELECT select_expr[,select_expr...] [GROUP BY {col_name|position} [ASC|DESC],...]

将查询结果以性别sex进行分类,在表达式中ASC表示以正序进行查找,DESC表示以倒序进行查找。

mysql> SELECT * FROM users2 GROUP BY sex;+----+----------+----------------------------------+-----+------+| id | username | userpassword                     | age | sex  |+----+----------+----------------------------------+-----+------+|  9 | GGG      | ahnkhFKAJ                        |  15 | NULL ||  8 | FFF      | bc9c74cd849e1f1b99b16b0d92292bf6 |  50 |    0 ||  1 | AAA      | IAMPASSWORD                      |  25 |    1 |+----+----------+----------------------------------+-----+------+3 rows in set (0.01 sec)

另外设定分组条件

  • [HAVING where_condition]

可以配合着上一条查询分组操作使用。
例如查询性别sex字段并以sex字段分组中的年龄age>20的数据操作。

mysql> SELECT sex FROM users2 GROUP BY sex HAVING age > 20;ERROR 1054 (42S22): Unknown column 'age' in 'having clause'

如果按照上面的查询语句会发现出错,出错的原因是以为查询的字段中没有包含age字段,所以此时用age>20来作为条件会出现错误。
所以需要将条件语句中用到的字段加入查询字段中,如下操作语句:

mysql> SELECT sex,age FROM users2 GROUP BY sex HAVING age > 20;+------+-----+| sex  | age |+------+-----+|    0 |  50 ||    1 |  25 |+------+-----+2 rows in set (0.01 sec)mysql> SELECT * FROM users2 GROUP BY sex HAVING age > 20;+----+----------+----------------------------------+-----+------+| id | username | userpassword                     | age | sex  |+----+----------+----------------------------------+-----+------+|  8 | FFF      | bc9c74cd849e1f1b99b16b0d92292bf6 |  50 |    0 ||  1 | AAA      | IAMPASSWORD                      |  25 |    1 |+----+----------+----------------------------------+-----+------+2 rows in set (0.00 sec)

使用LIMIT限制查询

  • [LIMIT {offset,} row_count | row_count OFFSET offset}]

例如查询users2表中的头两行数据:

mysql> SELECT * FROM users2 LIMIT 2    -> ;+----+----------+--------------+-----+------+| id | username | userpassword | age | sex  |+----+----------+--------------+-----+------+|  1 | AAA      | IAMPASSWORD  |  25 |    1 ||  3 | BBB      | IAMPASSWORD  |  45 |    1 |+----+----------+--------------+-----+------+2 rows in set (0.00 sec)

查询第4行开始的2行数据,需要注意的是LIMIT中是以0开始计算的,所以查询第4行时应该加入LIMIT的条件时应该是3=(4-1)

mysql> SELECT * FROM users2 LIMIT 3,2;+----+----------+----------------------------------+-----+------+| id | username | userpassword                     | age | sex  |+----+----------+----------------------------------+-----+------+|  6 | DDD      | *dsfjksp;flke                    |  32 |    1 ||  8 | FFF      | bc9c74cd849e1f1b99b16b0d92292bf6 |  50 |    0 |+----+----------+----------------------------------+-----+------+2 rows in set (0.00 sec)

加入对查询结果的排序操作

  • [ORDER BY {col_name | expr | position} [ASC|DESC],...]

在上面说到了ASC是升序,DESC是降序。
例如查询users2表中的所有字段,降序排列,并展示出排序结果后的第4行开始的两行的数据。

mysql> SELECT * FROM users2 ORDER BY id DESC LIMIT 3,2;+----+----------+---------------+-----+------+| id | username | userpassword  | age | sex  |+----+----------+---------------+-----+------+|  6 | DDD      | *dsfjksp;flke |  32 |    1 ||  4 | CCC      | *asfjdhia     |  26 |    1 |+----+----------+---------------+-----+------+2 rows in set (0.00 sec)

将查询的结果放入另一张表中

新建一张数据表users3,将在users2表中查询到的数据放入users3表中。

mysql> CREATE TABLE users3(    -> id TINYINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,    -> username VARCHAR(20)    -> );Query OK, 0 rows affected (0.03 sec)mysql> SELECT * FROM users3;Empty set (0.02 sec)mysql> INSERT users3(username) SELECT username FROM users2 WHERE age>30;Query OK, 3 rows affected (0.00 sec)Records: 3  Duplicates: 0  Warnings: 0mysql> SELECT * FROM users3;+----+----------+| id | username |+----+----------+|  1 | BBB      ||  2 | DDD      ||  3 | FFF      |+----+----------+3 rows in set (0.00 sec)
原创粉丝点击