注:本节没有包含嵌套查询和集合查询,只有单表查询和连接查询,后面会更新。
数据查询:(基本格式)
SELECT [ALL|DISTINCT] <目标列表达式> [,<目标列表达式>]...
FROM <表名或视图名> [,<表名或视图名>]...|(SELECT语句)
[AS] <别名>
[WHERE <条件表达式>]
[GROUP BY <列名1>][HAVING <条件表达式>]]
[ORDER BY <列名2> [ASC|DESC]];
- SELECT子句:指定要显示的属性列
- FROM子句:指定查询的对象(基本表或视图)
- WHERE子句:指定查询条件
- GROUP BY子句:对查询结果按指定列的值分组,该属性列值相等的元组为一个组。通常会在每组中作用聚焦函数
- HAVING短句:只有满足指定条件的组才予以输出
- ORDER BY子句:对查询结果表按指定列值的升序或降序排序
单表查询:
查询表中的若干列:
SELECT <目标表达式>,<目标表达式>........,<目标表达式> FROM <表名>
如:查询供应商的名称、地址和联系电话。
SELECT `name`,`address`,`phone` FROM `supplier`;
<目标表达式>不仅可以为表中的属性列,也可以是表达式
如:将查询到的性别小写化
SELEC LOWER(Gender) FROM Student;
查询所有列:
SELECT * FROM <表名>;
WHERE子句常用的查询条件
查询条件 | 谓词 |
比较 | =,>,<,>=,<=,!=,<>,!>,!<;NOT+上述比较运算符 |
确定范围 | BETWEEN AND,NOT BETWEEN AND |
确定集合 | IN,NOT IN |
字符匹配 | LIKE,NOT LIKE |
空值 | IS NULL,IS NOT NULL |
多重条件(逻辑运算) | AND,OR,NOT |
实现选择操作:
SELECT <目标表达式>....<目标表达式> FROM <表名> WHERE <限制条件>;
如:查询最近一周内提交的总价大于1000元的订单的编号、顾客编号等订单的所有信息
SELECT * FROM `orders` WHERE `totalprice`>1000 AND `orderdate`>DATE_SUB(NOW(), INTERVAL 7 DAY)
聚集函数:
- 统计元组个数:COUNT(*)
- 统计一列中值的个数:COUNT([DISTINGCT|ALL]<列名>)
- 计算一列值的总和(此列必须是数值型):SUM([DISTINCT|ALL]<列名>)
- 计算一列值的平均值(此列必须为数值型):AVG([DISTINCT|ALL]<列名>)
- 求一列中的最大值和最小值:
MAX([DISTINCT|ALL]<列名>)
MIN([DISTINCT|ALL]<列名>)
注:DISTINCT表示在计算时取消重复值,ALL表示不取消重复值,默认ALL
GROUP BY子句分组:
细化聚集函数的作用对象
- 如果未对查询结果分组,聚集函数将作用域整个查询结果
- 对查询结果分组后,聚集函数将分别作用于每个组
- 按指定的一列或多列值分组,值相等的唯一组
注:WHERE子句不能用聚焦函数作为表达式
如:WHERE SUM(Sorce)>=250是错误的
此时想要用条件查询应该用HAVING子句
HAVING与WHERE的区别:
- 作用对象不同
- WHERE作用于表或者视图,从中选择满足条件的元组
- HAVING作用于组,从中选择满足条件的组
不带分组过滤条件的分组统计查询:
如:统计每个顾客的订购金额
SELECT `custkey`,SUM(`totalprice`) FROM `orders` GROUP BY `custkey`;
带分组过滤条件的分组统计查询:
如:查询订单平均金额超过1000元的顾客编号及其姓名
SELECT `customer`.`custkey`,`customer`.`name`
FROM `orders` JOIN `customer` ON `customer`.`custkey`=`orders`.`orderkey`
WHERE `totalprice`>1000
GROUP BY `custkey`
连接查询:(设计两个以上的表的查询)
一般格式:
- [<表名1>.]<列名1><比较运算符>[<表名2>.]<列名2>
- [<表名1>.]<列名1>BETWEEN[<表名2>.]<列名2>AND[<表名2>.]<列名3>
等值连接:连接运算符为=
自身连接:
- 一个表与自己相连接
- 需要给表起别名以示区别
- 必须使用别名前缀
外连接:只有满足条件的元组才能输出
单表自身连接查询:
如:查询与"北京中关网安科技有限公司"在同一个国家的供应商编号、名称和地址信息
SELECT a.`name`,a.`suppkey`,a.`address` FROM `supplier` a,`supplier` b
WHERE a.`nationkey`=b.`nationkey` AND b.`name`='北京中关网安科技有限公司';
两表连接查询:
如:查询供应价格大于零售价格的零件名、制造周名、零售价格和供应价格
SELECT `part`.`name`,`part`.`mfgr`,`part`.`retailprice`,`partsupp`.`supplycost`
FROM `part`,`partsupp`
WHERE `partsupp`.`supplycost`>`part`.`retailprice`;
三表连接查询:
如:查询顾客“苏打绿"订购的订单编号、总价及其订购的零件编号、数量和明细价格
SELECT `customer`.`name`,`orders`.`orderkey`,`orders`.`totalprice`,`lineitem`.`partkey`,`lineitem`.`quantity`,`lineitem`.`extendedprice`
FROM `customer`,`orders`,`lineitem`
WHERE `customer`.`name`='苏打绿'
每日征婚:tutu,女 ,20 ,QQ号:2117472285