1. SELECT 语句
1.1 检索单个列
关键字SELECT后写需要查询的列名
1 2 3 4 5 6 7 8 9
| mysql> select prod_name from products; + | prod_name | + | Fuses | | JetPack 1000 | | TNT (5 sticks) | + 14 rows in set (0.00 sec)
|
- 多条SQL语句必须使用分号(;)分隔,推荐做法.
- SQL语句不区分大小写
1.2 检索多个列
和检索单列类似,关键字SELECT后写需要查询的列名,逗号分隔
1 2 3 4 5 6 7 8 9
| mysql> select prod_id,prod_name,prod_price from products; + | prod_id | prod_name | prod_price | + | ANV01 | .5 ton anvil | 5.99 | | ANV02 | 1 ton anvil | 9.99 | | ANV03 | 2 ton anvil | 14.99 | + 14 rows in set (0.00 sec)
|
1.3 检索所有列
使用通配符(*)即可
最好别使用*通配符,虽然此种写法方便,但是索引不需要的列通常会降低检索和应用程序的性能
1.4 检索不同行并去重
使用关键字DISTINCT,指示MySQL只返回不同值,从而达到去重目的.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| mysql> select vend_id from products; + | vend_id | + | 1001 | | 1002 | | 1003 | | 1003 | | 1005 | + 14 rows in set (0.00 sec)
mysql> select distinct vend_id from products; + | vend_id | + | 1001 | | 1002 | | 1003 | | 1005 | + 4 rows in set (0.01 sec)
|
- DISTINCT关键字必须直接放在列名的前面
- 不能不分使用DISTINCT,即DISTINCT关键字应用于所有列而不仅是前置它的列
1.5 限制结果 Limit使用
只返回指定个数的结果,在语句后使用关键字 limit,关键字后加行数即可
1 2 3 4 5 6 7 8
| mysql> select prod_name from products limit 2; + | prod_name | + | .5 ton anvil | | 1 ton anvil | + 2 rows in set (0.00 sec)
|
指定检索的开始行和行数 limit m,n
1 2 3 4 5 6 7 8
| mysql> select prod_name from products limit 0,2; + | prod_name | + | .5 ton anvil | | 1 ton anvil | + 2 rows in set (0.00 sec)
|
第一个数为开始位置,第二个数为要检索出来的行数.
上面语句的意思 : 从第0行开始,检索出2行的数据.
在LIMIT中指定要检索的行数为检索的最大行数,如果没有足够的行,MySQL将只返回它能返回的那么多行.
1.6 使用完全限定的表名
完全限定的表名可以默认不添加,但是在某些场景下(后续介绍)完全限定的表名还是非常有必须要的.
1 2 3 4 5 6 7 8 9
| mysql> select products.prod_name from products; + | prod_name | + | .5 ton anvil | | 1 ton anvil | | 2 ton anvil | + 14 rows in set (0.00 sec)
|
2. 排序检索数据
2.1 按单个列排序
数据默认检索出来的顺序是按照数据最初在表中被添加的顺序,我们可以使用ORDER BY
子句来显示的指定排序字段.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| mysql> select prod_name from products order by prod_name; + | prod_name | + | .5 ton anvil | | 1 ton anvil | | 2 ton anvil | | Bird seed | | Carrots | | Detonator | | Fuses | | JetPack 1000 | | JetPack 2000 | | Oil can | | Safe | | Sling | | TNT (1 stick) | | TNT (5 sticks) | + 14 rows in set (0.00 sec)
|
此处是按照字典书序排序
2.2 按多个列排序
多个列排序,只要指定列名,列名之间用逗号分隔即可.
检索三个列,首先按价格排序,然后再按名称排序:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| mysql> select prod_id,prod_price,prod_name from products order by prod_price,prod_name; + | prod_id | prod_price | prod_name | + | FC | 2.50 | Carrots | | TNT1 | 2.50 | TNT (1 stick) | | FU1 | 3.42 | Fuses | | SLING | 4.49 | Sling | | ANV01 | 5.99 | .5 ton anvil | | OL1 | 8.99 | Oil can | | ANV02 | 9.99 | 1 ton anvil | | FB | 10.00 | Bird seed | | TNT2 | 10.00 | TNT (5 sticks) | | DTNTR | 13.00 | Detonator | | ANV03 | 14.99 | 2 ton anvil | | JP1000 | 35.00 | JetPack 1000 | | SAFE | 50.00 | Safe | | JP2000 | 55.00 | JetPack 2000 | + 14 rows in set (0.00 sec)
|
此例中,仅在多个行具有相同的prod_price值时才对产品按prod_name进行排序.
如果prod_price列中所有的值都是唯一的,则不会按prod_name排序.
2.3 指定排序方向
数据排序分为两种 : 升序(ASC)和降序(DESC). 默认的排序方式是升序.
DESC关键字只应用到直接位于其前面的列名,如果想在多个列上进行降序排序,就必须对每个列指定DESC关键字
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| mysql> select prod_id,prod_price,prod_name from products order by prod_price desc,prod_name desc; + | prod_id | prod_price | prod_name | + | JP2000 | 55.00 | JetPack 2000 | | SAFE | 50.00 | Safe | | JP1000 | 35.00 | JetPack 1000 | | ANV03 | 14.99 | 2 ton anvil | | DTNTR | 13.00 | Detonator | | TNT2 | 10.00 | TNT (5 sticks) | | FB | 10.00 | Bird seed | | ANV02 | 9.99 | 1 ton anvil | | OL1 | 8.99 | Oil can | | ANV01 | 5.99 | .5 ton anvil | | SLING | 4.49 | Sling | | FU1 | 3.42 | Fuses | | TNT1 | 2.50 | TNT (1 stick) | | FC | 2.50 | Carrots | + 14 rows in set (0.00 sec)
|
在字典排序中,A被视为与a相同,这是MySQL等大多数数据库管理系统默认行为,
如果想要更改需要DBA的帮助
2.4 ORDER BY与LIMIT组合
ORDER BY与LIMIT组合,可以找出一列中最高或最低的值
1 2 3 4 5 6 7
| mysql> select prod_price from products order by prod_price desc limit 1; + | prod_price | + | 55.00 | + 1 row in set (0.00 sec)
|
ORDER BY子句必须在FROM子句之后,LIMIT子句必须在ORDER BY子句之后
但是这两个关键字联合使用会有问题,后面会单独讲解.
Tips
欢迎收藏和转发,感谢你的支持!(๑•̀ㅂ•́)و✧
欢迎关注我:后端小哥,专注后端开发,希望和你一起进步!