检索数据
检索单个列: (列名为prod_name,表名为products)
SELECT prod_name FROM products;
检索多个列: (列名为prod_id,prod_name,prod_price,表名为products)
SELECT prod_id,prod_name,prod_price FROM products;
检索所有列:(使用星号*通配符)
SELECT * FROM products;
检索不同的行: (使用DISTINCT关键字,指示MySQL只返回不同的值)
SELECT DISTINCT FROM products;
限制返回行数: (使用LIMIT关键字,LIMIT 5指示MySQL返回不多于5行)
SELECT prod_name FROM products LIMIT 5;
限制返回行数和起始位置:(LIMIT 5,5指示MySQL返回从第5行开始的5行)
SELECT prod_name FROM products LIMIT 5,5;
使用完全限定的表名:( products.prod_name同时使用表名和列名指定该列)
SELECT products.prod_name FROM products;
排序检索数据
排序数据: (使用ORDER BY子句,指示MySQL对prod_name列以字母顺序排序数据)
SELECT prod_name FROM products ORDER BY prod_name;
按多个列排序: (仅在多个行具有相同的prod_price值时才按照prod_name进行排序)
SELECT prod_id,prod_price,prod_name FROM products ORDER BY prod_price,prod_name;
指定排序方向: (使用DESC 关键字,指示降序排序,ASC升序排序是默认排序方向)
SELECT prod_id,prod_price,prod_name FROM products ORDER BY prod_price DESC;
ORDER BY和LIMIT 的组合: (找出一个列中最高或最低的值)
SELECT prod_price FROM products ORDER BY prod_price DESC LIMIT 1;
过滤数据
where子句操作符
= | 等于 |
<> | 不等于 |
!= | 不等于 |
< | 小于 |
<= | 小于等于 |
> | 大于 |
>= | 大于等于 |
BETWEEN | 在指定的两个值之间 |
检查单个值: (使用WHERE子句,指定搜索条件进行过滤)
SELECT prod_name,prod_price FROM products WHERE prod_price=2.50;
不匹配检查: (过滤出vend_id不等于1003的数据)
SELECT vend_id,prod_name FROM products WHERE vend_id<>1003;
范围值检查: (使用BETWEEN操作符,过滤出prod_price在5~10之间的数据)
SELECT prod_name,prod_price FROM products WHERE prod_price BETWEEN 5 AND 10;
空值检查: (过滤出prod_price 为空值的数据)
SELECT prod_name FROM products WHERE prod_price IS NULL;
对多个列进行过滤: (使用AND操作符,给WHERE字句附加条件)
SELECT prod_id, prod_price,prod_name FROM products
WHERE vend_id=1003 AND prod_price <=10;
匹配条件中的某一个: (使用OR操作符,指示MySQL检索匹配任一条件的行)
SELECT prod_id, prod_price,prod_name FROM products
WHERE vend_id=1003 OR vend_id=1002;
注意:在AND和OR组合的时候,AND再计算次序中的优先级更高。
匹配范围中的条件:(使用IN操作符,指定条件范围,检索vend_id为1002或1003的数据)
SELECT prod_id, prod_price,prod_name FROM products
WHERE vend_id IN (1002,1003);
否定某个条件:(使用NOT操作符,检索除了vend_id为1002或1003的数据)
SELECT prod_id, prod_price,prod_name FROM products
WHERE vend_id NOT IN (1002,1003);
用通配符进行过滤(LIKE)
百分号(%)通配符: (使用%通配符,找到所有以词jet起头的产品,%表示任何字符出现任意多次)
SELECT prod_id,prod_name FROM products WHERE prod_name LIKE ‘jet%’;
注意:根据MySQL的配置方式,搜索可以是不区分大小写的或者是区分大小写的。
下划线(_)通配符: (使用_通配符,下划线只匹配单个字符而不是多个字符)
SELECT prod_id,prod_name FROM products WHERE prod_name LIKE ‘_ ton anvil’;
注意:根据通配符搜索的处理一般要比前面讨论的其他搜索说花时间更长,不要多度使用通配符。
用正则表达式进行搜索(REGEXP)
基本字符匹配: (关键字EXGEXP后所跟的东西作为正则表达式处理,检索列prod_name 包含文本1000的所有行)
SELECT prod_name FROM products
WHERE prod_name REGEXP ‘1000’ ORDER BY prod_name;
注意:LIKE匹配和REGEXP之间有一个重要差别,LIKE匹配整个串,REGEXP匹配子串,如果被匹配的文本在列值中出现,相应的行将被返回。通过用^开始每个表达式,用$结束每个表达式,可以使REGEXP的作用和LIKE一样。
创建计算字段
拼接字段: (使用Concat拼接函数,将值连接到一起构成单个值)
SELECT Concat(vend_name, ‘(’ ,vend_country, ’)’) FROM vendors ORDER BY vend_name;
使用别名: (使用AS关键字,将某一列赋予别名)
SELECT Concat(vend_name, ‘(’ ,vend_country, ’)’) AS vend_title
FROM vendors ORDER BY vend_name;
执行算术计算: (对检索到的数据进行算术计算,MySQL算术操作符有+ - * /)
SELECT prod_id,quantity,item_price,quantity*item_price AS expanded_price FROM vendors ORDER BY vend_name;
使用数据处理函数
SQL支持利用函数来处理数据,函数一般是在数据上执行的。它给数据的转换个处理提供了方便。
文本处理函数
时间和日期处理函数
数值处理函数
汇总数据
求平均值: (使用AVG()函数求平均值,下例使用AVG()返回products表中所有产品的平均价格)
SELECT AVG(prod_price) AS avg_price FROM products;
计数: (使用COUNT()函数确定表中行的数目或符合特定条件的行的数目,下例对表中行的数目进行计数)
SELECT COUNT(*) AS num_cust FROM customers;
对有值行进行计数: (下例使用COUNT(cust_email)对cust_email列中有值的行数进行计数)
SELECT COUNT(cust_email) AS num_cust FROM customers;
取得最大值: (使用MAX()函数返回指定列中的最大值)
SELECT MAX(prod_price) AS max_price FROM products;
取得最小值: (使用MIN()函数返回指定列中的最小值)
SELECT MIN(prod_price) AS min_price FROM products;
总计: (使用SUM()函数返回指定列值的和)
SELECT SUM(quantity) AS item_ordered FROM orderitems WHERE order_num=’20005’;
分组数据(GROUP BY)
创建分组: (使用GROUP BY子句创建分组,下例对每个vend_id 进行一个计数而不是整个表)
SELECT vend_id,COUNT(*) AS num_prods FROM products GROUP BY vend_id;
过滤分组: (WHERE用来过滤行,HAVING用来过滤分组。下例过滤出条数大于等于2的分组)
SELECT cust_id,COUNT(*) AS orders FROM orders GROUP BY cust_id HAVING COUNT(*) >=2;
SELECT子句顺序
子句 | 说明 | 是否必须使用 |
SELECT | 要返回的列或表达式 | 是 |
FROM | 从中检索数据的表 | 仅在从表选择数据的时候 |
WHERE | 行级过滤 | 否 |
GROUP BY | 分组说明 | 仅在按组计算聚集时使用 |
HAVING | 组级过滤 | 否 |
ORDER BY | 输出排序顺序 | 否 |
LIMIT | 要检索的行数 | 否 |
使用子查询
子查询组合两个查询: (一条语句查询的结果作为另一条语句查询的条件)
SELECT cust_id FROM orders
WHERE order_num IN (SELECT order_num FROM orderitems WHERE prod_id =’TNT2’);