MySQL数据基本查询

注:本节没有包含嵌套查询和集合查询,只有单表查询和连接查询,后面会更新。

数据查询:(基本格式)

SELECT [ALL|DISTINCT] <目标列表达式> [,<目标列表达式>]...

FROM <表名或视图名> [,<表名或视图名>]...|(SELECT语句)

[AS] <别名>

[WHERE <条件表达式>]

[GROUP BY <列名1>][HAVING <条件表达式>]]

[ORDER BY <列名2> [ASC|DESC]];

  1. SELECT子句:指定要显示的属性列
  2. FROM子句:指定查询的对象(基本表或视图)
  3. WHERE子句:指定查询条件
  4. GROUP BY子句:对查询结果按指定列的值分组,该属性列值相等的元组为一个组。通常会在每组中作用聚焦函数
  5. HAVING短句:只有满足指定条件的组才予以输出
  6. 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子句

HAVINGWHERE的区别:

  • 作用对象不同
  • 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>.]<列名1><比较运算符>[<表名2>.]<列名2>
  2. [<表名1>.]<列名1>BETWEEN[<表名2>.]<列名2>AND[<表名2>.]<列名3>

等值连接:连接运算符为

自身连接:

  1. 一个表与自己相连接
  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

猜你喜欢

转载自blog.csdn.net/qq_55977554/article/details/121379116