MySQL数据库中的查询技巧

1.IN

mysql> select * from pet where name in('lzh','cyb');
+------+-------+------+------------+
| name | owner | sex  | birth      |
+------+-------+------+------------+
| cyb  | lzh   | Y    | 1996-05-25 |
| lzh  | cyb   | N    | 1996-03-24 |
+------+-------+------+------------+
2 rows in set (0.00 sec)

2.BETWEEN AND

mysql> select * from pet where birth BETWEEN '1996-05-25' and '2017-3-24';
+------+-------+------+------------+
| name | owner | sex  | birth      |
+------+-------+------+------------+
| lzk  | NULL  | Y    | 1996-10-01 |
| cyb  | lzh   | Y    | 1996-05-25 |
| HEHE | NULL  | Y    | 2017-03-24 |
| lzk  | NULL  | Y    | 1996-10-01 |
| lzk  | NULL  | Y    | 1996-10-01 |
+------+-------+------+------------+
5 rows in set (0.00 sec)

3.带LIKE的字符串匹配查询
%:匹配一个或者多个字符,长度可以为0.
_:匹配一个字符。

mysql> select * from pet where name like 'l_k';
+------+-------+------+------------+
| name | owner | sex  | birth      |
+------+-------+------+------------+
| lzk  | NULL  | Y    | 1996-10-01 |
| lzk  | NULL  | Y    | 1996-10-01 |
| lzk  | NULL  | Y    | 1996-10-01 |
+------+-------+------+------------+
3 rows in set (0.00 sec)

mysql> select * from pet where name like "l%";
+------+-------+------+------------+
| name | owner | sex  | birth      |
+------+-------+------+------------+
| lzk  | NULL  | Y    | 1996-10-01 |
| leap | root  | N    | 1996-03-24 |
| lzh  | cyb   | N    | 1996-03-24 |
| lzk  | NULL  | Y    | 1996-10-01 |
| lzk  | NULL  | Y    | 1996-10-01 |
+------+-------+------+------------+
5 rows in set (0.00 sec)

4.用DISTINCT关键字取出结果中的重复行

mysql> select DISTINCT name from pet where name like "l%";
+------+
| name |
+------+
| lzk  |
| leap |
| lzh  |
+------+
3 rows in set (0.00 sec)

5.ORDER by +字段名 //按什么字段进行排序.

6.使用 GROUP BY +字段名表示以什么什么字段进行分组,这样分组中只会每组随机显示一个条目
另外我们可以使用GROUP_CONCAT(字段)这样就会将分组后指定的字段的所有值都显示出来

mysql> select * ,GROUP_CONCAT(name) from pet group by sex;
+------+-------+------+------------+----------------------+
| name | owner | sex  | birth      | GROUP_CONCAT(name)   |
+------+-------+------+------------+----------------------+
|      | NULL  | NULL | NULL       |                      |
| leap | root  | N    | 1996-03-24 | leap,lzh             |
| lzk  | NULL  | Y    | 1996-10-01 | lzk,cyb,HEHE,lzk,lzk |
+------+-------+------+------------+----------------------+

7.可以使用LIMIT限制查询结果的数量。

使用方法:
select xx from table_name limit 2; //在所有的查询记录中取前两条。
select xx from table_name limit n,m; //从编号为n的记录中查询三条记录。

8.使用聚合函数进行查询——count函数
对于除*以外的函数,返回所选择集合中非NULL值的数目。
对于*返回所选择集合中包含NULL值的数目。

9.连接查询。
连接是指把不同表的记录连到一起。
内连接查询:内连接表示相等的连接,即连接后的表中某个字段与每个表中的都相同。
外链接查询:外连接是指使用OUTER,JOIN关键字将两个表连接起来,外连接生成的结果集不仅包含符合连接条件的行数据,而且还包括左表、右表或两边连接表中所有的数据行。

SELECT 字段名 from table_name 表1 LEFT|RIGHT JOIN 表2 ON 表1.字段名=表2.字段名 ;

mysql> select owner,information.passward,information.create_time from pet left join information on information.user=pet.name;
//左连接的特点是左表中有多少行,那么最后匹配出来的条目就有多少条
+-------+----------+---------------------+
| owner | passward | create_time         |
+-------+----------+---------------------+
| NULL  | NULL     | NULL                |
| root  | NULL     | NULL                |
| NULL  | NULL     | NULL                |
| lzh   | 666666   | 2017-03-30 17:36:50 |
| NULL  | NULL     | NULL                |
| cyb   | 999999   | 2017-03-27 17:47:47 |
| NULL  | NULL     | NULL                |
| NULL  | NULL     | NULL                |
| NULL  | NULL     | NULL                |
+-------+----------+---------------------+
9 rows in set (0.02 sec)


//下面事以右连接的方式进行查询.
mysql> select owner,information.passward,information.create_time from pet right join information on information.user=pet.name;
+-------+----------+---------------------+
| owner | passward | create_time         |
+-------+----------+---------------------+
| cyb   | 999999   | 2017-03-27 17:47:47 |
| lzh   | 666666   | 2017-03-30 17:36:50 |
+-------+----------+---------------------+
2 rows in set (0.00 sec)


//复合连接查询
//复合连接查询又称为复合条件查询,在连接查询时,我们可以增加其他的限制条件,复合查询的长度取决于最短的表。
mysql> select owner,information.passward,information.create_time from pet,information where information.user=pet.name;
+-------+----------+---------------------+
| owner | passward | create_time         |
+-------+----------+---------------------+
| lzh   | 666666   | 2017-03-30 17:36:50 |
| cyb   | 999999   | 2017-03-27 17:47:47 |
+-------+----------+---------------------+
2 rows in set (0.00 sec)

10.子查询:所谓的子查询就是SELECT查询是另一个查询的附属,从MySQL4.1开始就可以嵌套多个查询,在外一层的查询中使用的是里面一层查询产生的结果集。
当遇到这样的多层查询时,MySQL从最内层的查询开始,然后移动到外层,在这个过程中每个查询产生的结果集都被赋给包围它的父查询

带IN关键字的子查询:IN关键字可以检测结果中是否存在某个特定的值,如果检测成功执行外部的查询。

mysql> select * from information where user in(select name from pet);
               //父查询                              //子查询
+----+------+----------+---------------------+-------------+
| id | user | passward | create_time         | email       |
+----+------+----------+---------------------+-------------+
|  1 | lzh  | 999999   | 2017-03-27 17:47:47 | 123@163.com |
|  2 | cyb  | 666666   | 2017-03-30 17:36:50 | 321@163.com |
+----+------+----------+---------------------+-------------+

带EXISTS关键字的子查询;使用EXISTS关键字时,内层查询语句不返回查询的记录,而是返回一个真假值(如果内层查询到满足条件的记录,就返回true),当返回为true时,外层语句将进行查询。

mysql> select * from information where exists(select * from pet where name="lzh");
+----+------+----------+---------------------+-------------+
| id | user | passward | create_time         | email       |
+----+------+----------+---------------------+-------------+
|  1 | lzh  | 999999   | 2017-03-27 17:47:47 | 123@163.com |
|  2 | cyb  | 666666   | 2017-03-30 17:36:50 | 321@163.com |
+----+------+----------+---------------------+-------------+
2 rows in set (0.00 sec)

使用正则表达式进行查询
字段名 REGEXP ‘匹配方式’

^:匹配以特定字符串开头的记录。
$:匹配以特定字符串结尾的记录。
.:匹配字符串的任意一个字符包括回车或者换行。
[字符set]:匹配字符集合中的任意一个字符。
[^字符set]:匹配字符集合以外的任意一个字符。
s1|s2|s3:匹配s1,s2,s3中的任意一个字符串。
*:匹配多个该符号之前的字符,包括0个或者1个。
+:匹配多个符号之间前字符,包括0个。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值