查询年龄15-17 select * from 表名 where age<=17; selete * from 表名 where age between15and17; 查询年龄15和17的 select * from 表名 where age=15and age=17; selectnamefrom 表名 where(age=15or age =17) and sex=man; /*这条 SELECT 语句与前一条的唯一差别是,这条语句中,前两个条件用圆括号括了起来。因为圆括号具有较 AND 或 OR 操作符高的计算次序,DBMS首先过滤圆括号内的 OR 条件*/
4、IN操作符
1 2 3
/*IN操作符用来指定条件范围,范围中的每个条件都可以进行匹配*/ 查询年龄15和17的 select * from 表名 where age IN(15,17) ORDERBY username;
5、NOT操作符
1 2 3
/*NOT操作符用来否定后面跟条件的关键字*/ 查询除了15和17的人 select *from 表名 wher age NOTIN(15,17) ORDERBY username;
6、LIKE操作符
6.1 百分号(%)通配符
1 2
/*%通配符表示任何字符出现任意次数*/ selectid,prod_name from products where prod_name LIKE'jet%';
1 2 3 4 5 6 7 8 9
/*根据MySQL的配置方式,搜索可以是区分大小写的。如果区分大小写, 'jet%' 与 JetPack 1000 将不匹配。 通配符可以在搜索模式中任意位置使用,并且可以使用多个通配符。*/ selectid,prod_name from products where prod_name LIKE'%jet%'; /*尾空格可能会干扰通配符匹配。例如,在保存词anvil 时,如果它 后面有一个或多个空格,则子句 WHERE prod_name LIKE '%anvil' 将不会匹配它们,因为在最后的 l 后有多余的字符。解决这个问题的一个简单的办法是在搜索模式最后附加一个 % 。一个更好的办法是使用函数(第11章将会介绍)去掉首尾空格*/
/*虽然似乎 % 通配符可以匹配任何东西,但有一个例外,即 NULL 。即使是 WHERE prod_name LIKE '%' 也不能匹配用值 NULL 作为产品名的行。*/
6.2 下划线( _ )通配符
1 2 3
/*下划线(_)通配符只能匹配单个字符*/ /*_总是匹配一个字符,不能多也不能少*/ SELECT *FROM products WHERE prod_name LIKE'jes_s_sdw_';
mysql> select * from user where username REGEXP 'HUAHUA'; +-------------+----------+----------+------+-------------+-----------+---------+ | username | pwd | license | sex | tel | drive_age | cartype | +-------------+----------+----------+------+-------------+-----------+---------+ | huahua | fggg6rge | CAOG8T6 | man | 15388342650 | 1 | 1 | | HUAHUAa | wwqw | 川AOTNTG | man | 15388342650 | 2 | 2 | | huahuahu | dab5htd | CAOG8T6 | man | 15388342650 | 3 | 2 | | huahuahua | ses23df | 川ANB211 | man | 15388342650 | 7 | 0 | | huahuahuahe | sdwadsd | 川UCZ002 | man | 15388342650 | 6 | 2 | +-------------+----------+----------+------+-------------+-----------+---------+ 5 rows in set (0.00 sec)
mysql> select * fromuserwhere username REGEXP BINARY'HUAHUA'; +----------+------+----------+------+-------------+-----------+---------+ | username | pwd | license | sex | tel | drive_age | cartype | +----------+------+----------+------+-------------+-----------+---------+ | HUAHUAa | wwqw | 川AOTNTG | man | 15388342650 | 2 | 2 | +----------+------+----------+------+-------------+-----------+---------+ 1 row in set (0.00 sec)
7.2 进行OR匹配 |通配符
为搜索两个串之一,使用|,如下所示:
1 2 3 4 5 6 7 8 9
/*|通配符表示匹配huahuaa和yuhan其中之一,因此两者都可以返回*/ mysql> select * from user where username REGEXP 'huahuaa|yuhan'; +----------+-----------+----------+------+-------------+-----------+---------+ | username | pwd | license | sex | tel | drive_age | cartype | +----------+-----------+----------+------+-------------+-----------+---------+ | HUAHUAa | wwqw | 川AOTNTG | man | 15388342650 | 2 | 2 | | yuhan | hjzcxvw21 | CAOG8T6 | man | 15388342650 | 5 | 2 | +----------+-----------+----------+------+-------------+-----------+---------+ 2 rows in set (0.00 sec)
7.3 [] 匹配几个字符之一
1 2 3 4 5
SELECT prod_name FROM products WHERE prod_name REGEXP '[123] Ton'; /*[] 是另一种形式的 OR 语句。事实上,正则表达式 [123]Ton 为 [1|2|3]Ton 的缩写,也可以使用后者。但是,需要用 [] 来定义 OR 语句 查找什么。为更好地理解这一点,请看下面的例子:*/ SELECT prod_name FROM products WHERE prod_name REGEXP '1|2|3 Ton';
如上所示:着相当于检测1 ,2和3 Ton。
8、子查询
8.1子查询过滤
在SELECT语句中,子查询总是从内向外处理
1 2 3 4
SELECT cust_id FROM orders WHERE order_num IN(SELECT FROM orderitems WHERE prod_id = 'TNT2') /*这个查询表示:首先查询表orderitems中prod_id列为TNT2的oder_num数据,然后根据oder_num在表orders中查询cust_id数据。*/ SELECT cust_name,cuse_contact FROM customers WHERE cust_id IN(SELECT cust_id FROM orders WHERE order_num IN(SELECT order_num FROM orderitems WHERE prod_id = 'TNT2'));/*套娃查询*/