在mysql里面,我个人表查询是一个非常 “大头”的操作。
1.基础的数据检索语句
数据检索的基础语句是SELECT 语句。
例如,检索表中所有的数据:
- 语法:SELECT * FROM 表名;
检索表中特定的某一列:
- 语法:SELECT 列名 FROM 表名;
检索多个列:
- 语法: SELECT 列名1,列名2,列名3… FROM 表名;
2.对检索出的数据进行排序
关系型数据库设计理论认为,如果不明确规定排序顺序,则不应该假定检索出的数据的顺序有意义
–《SQL必知必会》
1.按照某一列排序:
- 语法:SELECT * FROM 表名 ORDER BY 列名;
注意:这里我们排序依照的列不一定非要出现在查询结果中,也就是说,用非检索的列排序数据是完全合法的。
2.按照多个列排序:
- 语法:SELECT * FROM 表名 ORDER BY 列名1,列名2,列名3…;
这里按照多个列排序的意思是:当具有列名1相同的多个结果时,再将这些结果按照列名2进行排序。
3.指定排序方向:
数据排序不限于升序排序(从A到Z),也可以添加DESC 使用降序排序。
注意:DESC只对其前面的列起作用,如果多列排序,只有一个列名后面添加了DESC,那么只有这一列排序为降序排序。
例如:
SELECT id,price,name FROM products ORDER BY price DESC,name;
上面首先按照价格的降序排序,对于价格相同的,再按照name进行默认的升序排序。对于价格不同的,不会考虑依照name排序的结果。
3.数据过滤
上面我们是对表的某一列或者几列进行全部的查询,也就是我们查询结果是表中该列的全部记录。但是有时我们并不想将所有的都查出来,我们只想看到一些符合条件的结果。
数据过滤依靠WHERE子句实现。
1.最简单的,例如我们查询分数为100的学生记录,将该学生的名字列出来。
mysql> SELECT name FROM students WHERE score = 100;
+----------+
| name |
+----------+
| xiaoming |
+----------+
1 row in set (0.00 sec)
这里我们使用的是“=”,当然还有很多其他的操作符号:
操作符 | 说明 |
---|---|
= | 等于 |
<> | 不等于 |
> | 大于 |
>= | 大于等于 |
BETWEEN | 在指定的2个值之间 |
IS NULL | 为NULL值 |
… | … |
2.高级数据过滤
AND操作符
AND操作符是给WHERE子句附加条件的,即检索出来的数据要满足AND前后的2个条件。
OR操作符
检索出来的数据只要满足其中一个条件即可。
计算次序问题:AND操作符优先处理。
IN操作符
IN操作符用来指定条件范围:
例如有表:
mysql> select * from students;
+----------+-----+-------+
| name | sex | score |
+----------+-----+-------+
| xiaoming | m | 100 |
| a | m | 20 |
| b | m | 50 |
| b | m | 80 |
+----------+-----+-------+
4 rows in set (0.00 sec)
查询:
mysql> select score from students where score IN (50,42,100);
+-------+
| score |
+-------+
| 100 |
| 50 |
+-------+
2 rows in set (0.03 sec)
NOT操作符
NOT操作符的作用有且只有一个功能,那就是否定它之后所跟的任何条件。
依然是查询上表,如下:
mysql> select score from students where NOT score IN (20,50,41);
+-------+
| score |
+-------+
| 100 |
| 80 |
+-------+
2 rows in set (0.00 sec)
4.通配符过滤
1.LIKE:指示DBMS,后跟的搜索模式利用通配符匹配而不是直接相等匹配进行比较。
%:代表任何字符出现任何次数。
如下:
mysql> select * from students;
+-------------+-----+-------+
| name | sex | score |
+-------------+-----+-------+
| xiaoming | m | 100 |
| a | m | 20 |
| b | m | 50 |
| b | m | 80 |
| fishab | m | 20 |
| fishcd | m | 20 |
| Michle | m | 20 |
| MichleJason | m | 20 |
+-------------+-----+-------+
8 rows in set (0.00 sec)
mysql> select * from students where name LIKE 'fish%';
+--------+-----+-------+
| name | sex | score |
+--------+-----+-------+
| fishab | m | 20 |
| fishcd | m | 20 |
+--------+-----+-------+
_:匹配多个字符。
如下:
mysql> select * from students where name LIKE 'fisha_';
+--------+-----+-------+
| name | sex | score |
+--------+-----+-------+
| fishab | m | 20 |
+--------+-----+-------+
1 row in set (0.00 sec)
REGEXP:使用扩展正则表达式模式匹配。
如下,检索以M开头的记录:
mysql> select * from students where name REGEXP '^M';
+-------------+-----+-------+
| name | sex | score |
+-------------+-----+-------+
| Michle | m | 20 |
| MichleJason | m | 20 |
+-------------+-----+-------+
2 rows in set (0.00 sec)
不是以M开头的记录:
mysql> select * from students where name NOT REGEXP '^M';
+----------+-----+-------+
| name | sex | score |
+----------+-----+-------+
| xiaoming | m | 100 |
| a | m | 20 |
| b | m | 50 |
| b | m | 80 |
| fishab | m | 20 |
| fishcd | m | 20 |
+----------+-----+-------+
6 rows in set (0.00 sec)
mysql> select * from students where not name REGEXP '^M';
+----------+-----+-------+
| name | sex | score |
+----------+-----+-------+
| xiaoming | m | 100 |
| a | m | 20 |
| b | m | 50 |
| b | m | 80 |
| fishab | m | 20 |
| fishcd | m | 20 |
+----------+-----+-------+
这里NOT位置不固定,2个位置都可以。
5.字段拼接和计算
如下:
mysql> SELECT CONCAT(name,'===',score) AS result from students;
+------------------+
| result |
+------------------+
| xiaoming===100 |
| a===20 |
| b===50 |
| b===80 |
| fishab===20 |
| fishcd===20 |
| Michle===20 |
| MichleJason===20 |
+------------------+
8 rows in set (0.05 sec)
计算字段:
mysql> SELECT CONCAT(name,'===',score*10) AS result from students;
+-------------------+
| result |
+-------------------+
| xiaoming===1000 |
| a===200 |
| b===500 |
| b===800 |
| fishab===200 |
| fishcd===200 |
| Michle===200 |
| MichleJason===200 |
+-------------------+
8 rows in set (0.03 sec)