可以使用SELECT命令来实现记录的查询,其语法非常复杂,但可进行各种各样的查询。
条件查询和正则表达式
表中相关字段用where结构来限定。
通常我们也会在条件表达式中进行一些模糊查询操作,这时候就需要用到正则表达式(regular expression)了。正则表达式是指用来描述或匹配一系列符合某个句法规则的字符串的单个字符串。MYsql使用REGEXP命令来实现正则表达式,其功能类似UNIX上的grep和sed的功能。常用的MySQL正则表达式中的模式如下


如在一个表中找出邮箱是163.com的记录,它的命令应该如下
select* from t where email regexp “163.com”;
子查询
在进行查询的时候,如果需要的条件是另外一个select语句的结果。这种情形下,可使用子查询关键字in、not in、=、!=、exists 、not exists 等。或form后的字段是一个select语句,它用来返回一个临时表记录。如
selecttbitem.order_id,tbitem.pcnt from (select order_id,count(order_id) as pcnt fromorder_items group by order_id) as tbitem,orders where tbitem.pcnt>1 andtbitem.order_id=orders.order_id;
聚合
在对结果记录进行汇总时,需要使用这种操作,它是通过聚合函数、group by关键字来实现的。其语法格式为
select[field1,field2,….] fun_name from tablename [where condition] [group byfield1,field2,..]
fun_name即为聚合函数,有sum()\count(*)\max()\min()。group by即是要进行分类聚合的字段。如对于下表
mysql>select * from student;
+-------+---------+--------+
|name | kecheng | fenshu |
+-------+---------+--------+
|marry | yuwen | 81 |
|marry | shuxue | 75 |
|john | shuxue | 95 |
|john | yuwen | 76 |
|larry | shuxue | 90 |
|larry | yuwen | 85 |
|larry | yingyu | 88 |
+-------+---------+--------+
7 rowsin set (0.40 sec)
mysql>
求每个学生的总成绩
mysql>select name,sum(fenshu) from student group by name;
再如下表,
mysql>select * from score;
+----------+--------+--------+--------+
|name | yunwen | shuxue | yingyu |
+----------+--------+--------+--------+
|chenfeng | 100 | 80 | 100 |
| xiaofen | 80 | 80 | 80 |
|xiaoming | 60 | 60 | 80 |
+----------+--------+--------+--------+
3 rowsin set (0.00 sec)
mysql>
求学生总成绩小于250的
mysql>select name,(select yunwen+shuxue+yingyu) as total from score where(yunwen+shuxue+yingyu) <250;
或
mysql>select name from score group by name havingsum(yunwen+shuxue+yingyu)<250;
Having过滤
having经常与group by和聚合函数(COUNT, SUM, AVG, MIN,or MAX)一起使用,用来过滤由GROUP BY语句返回的记录集。
where 子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,条件中不能包含聚合函数。
having 子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚合函数,使用having 条件显示特定的组,也可以使用多个分组标准进行分组。
如下求每门课程分数均在80分以上的同学姓名
mysql>select * from student where fenshu>80;
+-------+---------+--------+
|name | kecheng | fenshu |
+-------+---------+--------+
|marry | yuwen | 81 |
|john | shuxue | 95 |
|larry | shuxue | 90 |
|larry | yuwen | 85 |
|larry | yingyu | 88 |
+-------+---------+--------+
5 rowsin set (0.00 sec)
mysql>select name from student group by name;
+-------+
|name |
+-------+
|john |
|larry |
|marry |
+-------+
3 rowsin set (0.00 sec)
mysql>
mysql>select name from student group by namehaving min(fenshu)>80;
+-------+
|name |
+-------+
|larry |
+-------+
1 rowin set (0.00 sec)
mysql>
排序和限制
取出按照某个字段进行排序后的记录和记录数量的显示。这分别是通过关键字ORDER BY和LIMIT来实现的。语法格式为
select * from tablename[where condition] [order by field1 [desc|asc],field2 [desc|asc],…,] [LIMIToffset_start,row_count]
order by后面可以跟多个不同的排序字段,并且每个排序字段可以有不同的排序顺序。默认排序规则是升序排。offset_start表示记录的起始偏移量,默认偏移量是0,只需要写记录行数就可以了。
在MySQL等RDB中,当使用offset或limit来获取指定的数据位置时,随着数据量的增加,响应速度会不断下降。因为数据库系统需要检测所获取的数据是从头开始第几条,每次都是从第一条开始计数。这在服务上线长时间后,随着数据量的增多,系统性能变得越来越差。
连接
当需要同时显示多个表中的字段时,需要使用表连接来实现这样的功能。表连接又可分为内连接和外连接。
内连接使用联接运算符(像=或<>之类的比较运算符)进行表间某些列数据的比较操作,并列出这些表中与连接条件相匹配的数据行(即两张表中互相匹配的记录),组合成新的记录。内连接可以使用using或on子句来指定连接条件,连接条件中指出某两字段相等(可以不同名)。如果不写连接条件,会返回笛卡尔乘积查询记录。
外连接分为左连接和右连接,前者包含所有的左边表中的记录甚至是右边表中没有和它匹配的记录,后者反之。
内连接使用关键字innerjoin,外连接使用left|right join关键字。