MySQL(二)select检索数据
MySQL检索数据
下面的所有语句检索的表都为 exampletable
exampletable表的内容如下:
name | city | age | zip | |
---|---|---|---|---|
ergou | HRB | 39 | 110120 | 3xxxx@163.com |
joe | BJ | 20 | 102102 | 4xxxx@163.com |
john | BD | 14 | 154143 | 1xxxx@163.com |
mike | TJ | 18 | 112165 | 5xxxx@163.com |
smith | SJZ | 45 | 132123 | 2xxxx@163.com |
szq | BJ | 23 | 110223 | 6xxxx@163.com |
1.检索单个列
SELECT 列名 FROM 表名;
如果想要搜索该表中的所有姓名
SELECT name
FROM exampletable;
语句执行完毕后将得到结果:
name |
---|
ergou |
joe |
john |
mike |
smith |
szq |
需要注意的是,SQL本身是不区分大小写的,但是为了方便阅读和调试,我们最好将SQL关键字诸如SELECT/DROP/CREAT等大写,将列名,表名,条件语句等小写。并且使用关键字后,及时换行来确保语句的可读性。养成良好的习惯可以有效的规避很多坑,例如在未来编写较为复杂的语句时,清晰的调理和良好的书写格式能够更好的帮助我们梳理逻辑。
还有一点需要注意,在语句结束后,一定要在语句的末尾加 ; 来结束语句!
2.检索多个列
检索多个列只需要在各列之间添加逗号即可
例如 检索exampletable中name,city和age列的所有信息
SELECT name,city,age
FROM exampletable;
得到结果
name | city | age |
---|---|---|
ergou | HRB | 39 |
joe | BJ | 20 |
john | BD | 14 |
mike | TJ | 18 |
smith | SJZ | 45 |
szq | BJ | 23 |
注:如果在最后一列的列后添加逗号,语句将产生错误
SELECT name,city,age,
FROM exampletable;
Error Code: 1064. You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘FROM test.exampletable’ at line 2
3.检索所有列
通过(*)通配符可以检索表中的所有数据
SELECT *
FROM test.exampletable;
得到结果:
name | city | age | zip | |
---|---|---|---|---|
ergou | HRB | 39 | 110120 | 3xxxx@163.com |
joe | BJ | 20 | 102102 | 4xxxx@163.com |
john | BD | 14 | 154143 | 1xxxx@163.com |
mike | TJ | 18 | 112165 | 5xxxx@163.com |
smith | SJZ | 45 | 132123 | 2xxxx@163.com |
szq | BJ | 23 | 110223 | 6xxxx@163.com |
需要注意的是:在一般情况下,如果不是需要所有的数据不要轻易使用(*)通配符来检索表,这样会降低检索和应用程序的性能。
3.1检索不同的行
现在有需求要求汇总exampletable表中人所在的城市列表,那么该如何操作呢?
如果我们仅仅SELECT city FROM exampletable,那么在显示结果时,BJ这个值就会重复出现,这不是理想的结果。
这时候引入一个关键字 :DISTINCT
SELECT DISTINCT city
FROM exampletable;
得到结果:
city |
---|
HRB |
BJ |
BD |
TJ |
SJZ |
DISTINCT关键字下的列只返回值不相同的行。
注:不能部分使用DISTINCT,在给定DISTINCT关键字后,关键字后的所有列都返回不相同值的行。
4.限制结果
在检索时,也许我们只需要获得第二条到第五条数据,也可能有需求要排除前三个数据又或者只需要前三条数据,这时候就需要引入两个关键字LIMIT和OFFSET
LIMIT y:读取y条数据
LIMIT x,y:跳过x条数据,读取y条数据
LIMIT y OFFSET x:跳过x条数据,读取y条数据
读取前三条数据:
SELECT *
FROM test.exampletable
LIMIT 3;
SELECT *
FROM test.exampletable
LIMIT 0,3;
SELECT *
FROM test.exampletable
LIMIT 3 OFFSET 0;
name | city | age | zip | |
---|---|---|---|---|
ergou | HRB | 39 | 110120 | 3xxxx@163.com |
joe | BJ | 20 | 102102 | 4xxxx@163.com |
john | BD | 14 | 154143 | 1xxxx@163.com |
读取第2-4条数据
SELECT *
FROM test.exampletable
LIMIT 1,3;
SELECT *
FROM test.exampletable
LIMIT 3 OFFSET 1;
得到结果:
name | city | age | zip | |
---|---|---|---|---|
joe | BJ | 20 | 102102 | 4xxxx@163.com |
john | BD | 14 | 154143 | 1xxxx@163.com |
mike | TJ | 18 | 112165 | 5xxxx@163.com |
注:如果我们的表中只有2行数据,那么在使用limit 3语句后,会返回全部2行数据而不会报错。
5.检索后的数据排序
5.1 ORDER BY关键字
在检索数据后,如果我们想要让得出的结果以城市的首字母顺序排序要如何做呢?
这时候要引入一个关键字 ORDER BY
SELECT name,city
FROM test.exampletable
ORDER BY city;
得出结果:
name | city |
---|---|
john | BD |
joe | BJ |
szq | BJ |
ergou | HRB |
smith | SJZ |
mike | TJ |
可以看到结果以城市的首字符按照A-Z的顺序排序了
注:在搜索时也可以按照非选择列进行排序,比如搜索姓名和城市,但排序以年龄大小排序也是可行的。
注1:ORDER BY子句的排序必须在FROM后,如果位置在FROM前则报错,如果使用LIMIT,则必须要在ORDER BY后
SELECT name,city
FROM test.exampletable
ORDER BY age;
5.2多列排序
在实际情况下我们会碰到以下需求:我们按照姓和名的顺序显示数据,并且在姓相同的情况下,在按照名的顺序依次排序。这时候就用到了多列排序。由于表内没有姓和名的列,在此处假设
SELECT xing,ming,age,address
FROM examtable
ORDER BY xing,ming;
5.3指定的排序方向
在实现排序后,新的需求出现了:让我们按照年龄从大到小,或者从小到大显示所有信息,这该怎么办呢?
这时候引入两个关键字:ASC和DESC
ASC(ascend):升序排序
DESC(descend)降序排序
ASC与DESC关键字用于ORDER BY 子句后,在其他位置则报错。
ORDER BY后不添加关键字则默认为ASC升序排序。
SELECT *
FROM test.exampletable
ORDER BY age ASC;
按照年龄从小到大的顺序排序,得出结果:
name | city | age | zip | |
---|---|---|---|---|
john | BD | 14 | 154143 | 1xxxx@163.com |
mike | TJ | 18 | 112165 | 5xxxx@163.com |
joe | BJ | 20 | 102102 | 4xxxx@163.com |
szq | BJ | 23 | 110223 | 6xxxx@163.com |
ergou | HRB | 39 | 110120 | 3xxxx@163.com |
smith | SJZ | 45 | 132123 | 2xxxx@163.com |
SELECT *
FROM test.exampletable
ORDER BY age DESC;
按照年龄从大到小的顺序排序,得出结果:
name | city | age | zip | |
---|---|---|---|---|
smith | SJZ | 45 | 132123 | 2xxxx@163.com |
ergou | HRB | 39 | 110120 | 3xxxx@163.com |
szq | BJ | 23 | 110223 | 6xxxx@163.com |
joe | BJ | 20 | 102102 | 4xxxx@163.com |
mike | TJ | 18 | 112165 | 5xxxx@163.com |
john | BD | 14 | 154143 | 1xxxx@163.com |
如果想对ORDER BY的多个参数单独设置排序顺序,则在每个列名后,逗号前添加关键字即可:
SELECT *
FROM test.exampletable
ORDER BY age DESC,city ASC;
记:)
以上是select检索数据的简单概念和例子,在未来查询随着条件越发的复杂,检索的难度会逐级提升,检索的过程中考验的不只是对于语句的使用,在不同的场景下多种实现方式对性能的影响也是不同的,数据库大佬一生都在追求使用最优解去使用数据库,这也督促我学习时不能仅仅停留在表面,要把哪怕一件事做到精通,那么其他事情也就都不会太差了。(逐渐扯远)
本文地址:https://blog.csdn.net/Py_csdn_/article/details/108976872
上一篇: linux总线设备驱动模型——总线bus_basic
下一篇: 手机端实时定位