当前位置: 代码网 > it编程>数据库>Mysql > MySQL基本表查询操作汇总之单表查询+多表操作大全

MySQL基本表查询操作汇总之单表查询+多表操作大全

2025年11月26日 Mysql 我要评论
干货分享,感谢您的阅读!介绍mysql的单表查询和多表操作,从基本概念到具体实例,帮助读者全面理解和掌握这些关键技术。通过阅读本文,您将了解如何构建高效的查询语句、如何利用索引和外键优化查询性能,以及

干货分享,感谢您的阅读!介绍mysql的单表查询和多表操作,从基本概念到具体实例,帮助读者全面理解和掌握这些关键技术。通过阅读本文,您将了解如何构建高效的查询语句、如何利用索引和外键优化查询性能,以及如何在复杂数据关系中灵活运用连接查询和子查询。同时,我们还将分享一些实用的建议和注意事项,以助您在实际应用中规避常见问题,提高数据库操作的安全性和可靠性。

无论您是初学者还是有经验的开发者,这篇文章都将为您提供有价值的参考和指导,帮助您在数据库操作中更加游刃有余。

一、单表查询整合

主要内容:简单查询+条件查询+高级查询+表和字段取别名(以及简单的mapper写法)

(一)通用模版展示

以下是mysql单表查询的通用写法举例:

  • 简单查询:最基本的查询方式,它用于获取表中所有数据。
select * from table_name;
  • 条件查询:根据特定的条件获取数据的方式,它使用where子句来指定条件。
select * from table_name where column_name = 'value';
  • 高级查询:使用聚合函数、分组、排序等方式来获取数据的方式。
select avg(column_name) as average_value, count(*) as total_rows from table_name group by column_name order by average_value desc;
  • 表和字段取别名:可以使查询语句更加简洁明了,也可以防止字段名或表名与sql关键字重名的问题。
select t.column_name as alias_name from table_name as t where t.column_name > 10;

需要注意的是,在编写查询语句时,应该根据实际情况和需求来选择合适的查询方式和语法,以提高查询效率和数据质量。同时,还应该考虑sql注入等安全问题,使用预处理语句等方式来增强安全性。

(二)举例说明

假设有一个名为students的表,其中包含以下字段:id, name, age, gender, major, score,现在我们以该表为例,演示mysql单表查询的操作。

  • 简单查询:获取students表中所有数据:
select * from students;
  • 条件查询:获取students表中名字为tom的学生数据:
select * from students where name = 'tom';
  • 高级查询:获取students表中每个专业学生的平均成绩,并按平均成绩从高到低排序:
select major, avg(score) as average_score from students group by major order by average_score desc;
  • 表和字段取别名:获取students表中年龄大于20岁的学生的姓名和年龄,并将年龄字段取别名为age_value:
select name, age as age_value from students where age > 20;

以上是针对students表的mysql单表查询的具体例子,可根据实际情况和需求进行调整和优化。

(三)注意事项

在使用mysql进行单表查询时,需要注意以下事项:

  1. 选择合适的查询方式和语法,以提高查询效率和数据质量。
  2. 注意sql注入等安全问题,使用预处理语句等方式来增强安全性。
  3. 尽量避免使用select *等通配符查询,而是应该只查询需要的字段,以提高查询效率。
  4. 使用表和字段的别名时,应该使用有意义的别名,使查询语句更加清晰明了。
  5. 在使用group by和order by等聚合函数和排序语法时,应该确保语法正确且没有歧义,以避免数据误差和查询错误。
  6. 对于大型数据表,可以使用limit语法来限制返回的行数,以减少查询时间和网络带宽的消耗。
  7. 使用explain语法可以帮助了解查询的执行计划和性能,以优化查询效率。

mysql单表查询需要注意以上事项,以获得更好的查询效果和数据质量。

(四)mapper简单举例

针对上面提到的单表查询的例子,下面给出对应的mybatis mapper的优秀写法:

简单查询

获取students表中所有数据:

<select id="selectallstudents" resulttype="student">
  select * from students
</select>

条件查询

获取students表中名字为tom的学生数据:

<select id="selectstudentbyname" parametertype="string" resulttype="student">
  select * from students where name = #{name}
</select>

高级查询

获取students表中每个专业学生的平均成绩,并按平均成绩从高到低排序:

<select id="selectavgscorebymajor" resulttype="scorebymajor">
  select major, avg(score) as average_score from students group by major order by average_score desc
</select>

其中,scorebymajor是一个自定义的结果映射类,用于将查询结果封装为一个对象。

表和字段取别名

获取students表中年龄大于20岁的学生的姓名和年龄,并将年龄字段取别名为age_value:

<select id="selectnameandagebyage" parametertype="int" resulttype="student">
  select name, age as age_value from students where age > #{age}
</select>

需要注意的是,以上是一些简单的查询示例,实际情况下可能会涉及到更复杂的查询,需要根据具体的业务需求和数据结构来调整查询语句和mapper的写法。另外,在使用mapper时也需要注意sql注入等安全问题,以及使用缓存等技术来提高查询效率和性能。

二、多表操作说明

主要内容:外键+操作关联表+连接查询+子查询

(一)多表操作的基本模版展示

结合具体的例子,给出多表操作的通用模版,并分析每个模版的作用。

外键约束模版

create table table1 (
  id int primary key,
  ...
) engine=innodb;
create table table2 (
  id int primary key,
  table1_id int,
  ...
  foreign key (table1_id) references table1(id)
) engine=innodb;

外键约束模版中,我们可以定义一个外键,将一个表的某个字段设置为另一个表的主键。这样,当我们在更新或删除一张表的记录时,会自动对应更新或删除另一张表中的相关记录。在创建表时,我们需要注意两点:

  • 必须将引擎设置为 innodb,才能使用外键约束。
  • 外键所在表(table2)的字段必须是另一张表(table1)的主键。

操作关联表模版

select t1.column1, t2.column2
from table1 t1, table2 t2
where t1.id = t2.table1_id;

操作关联表模版中,我们需要用到 join 关键字,将两张表的记录连接起来。常见的 join 类型有 inner join、left join、right join 等。上面的模版使用的是 inner join,它只返回两张表中都存在的记录。在实际应用中,我们需要根据具体的业务需求来选择合适的 join 类型。

连接查询模版

select t1.column1, t2.column2
from table1 t1
join table2 t2 on t1.id = t2.table1_id;

连接查询模版和操作关联表模版类似,但是它使用了 on 关键字来指定连接条件,更加清晰明了。在实际应用中,我们可以根据实际情况选择操作关联表模版或连接查询模版。

子查询模版

select column1, column2, ...
from table1
where column1 in (select column1 from table2 where ...);

子查询模版中,我们在 where 子句中使用了一个子查询来获取 table2 表中符合条件的数据,并将其作为查询条件之一。子查询可以用在 select、insert、update 和 delete 等语句中,是一种非常强大的查询手段。

(二)简单案例展示

两张表情况

假设我们有两个表,一个是用户表(user),另一个是订单表(order),其中订单表中包含了用户id的外键(user_id)。

我们需要查询出所有已完成的订单及对应的用户名和手机号。可以使用连接查询来实现:

select o.order_id, u.user_name, u.phone_number
from `order` o
inner join `user` u on o.user_id = u.user_id
where o.order_status = 'completed';

在上面的查询中,我们使用了 inner join 将订单表和用户表连接起来,连接条件是订单表的 user_id 字段与用户表的 user_id 字段相等。在 select 子句中,我们指定了要查询的字段,注意使用了别名来区分两个表中相同字段名的情况。在 where 子句中,我们过滤出订单状态为已完成的记录。

如果我们需要查询某个用户的订单及对应的用户名和手机号,可以使用子查询来实现:

select o.order_id, u.user_name, u.phone_number
from `order` o
inner join (
    select user_id, user_name, phone_number
    from `user`
    where user_id = 123
) u on o.user_id = u.user_id
where o.order_status = 'completed';

在上面的查询中,我们使用了子查询来获取指定用户的用户名和手机号,并将其命名为 u 表。在连接查询中,我们使用了 u 表来代替用户表,以此来获取指定用户的订单信息。

现在我们想查询每个用户的订单总数,并按照订单总数从高到低进行排序。我们可以使用以下sql查询:

select u.name, count(o.id) as order_count 
from users u 
left join orders o on u.id = o.user_id 
group by u.id 
order by order_count desc;

在这个查询中,我们使用了left join将users表和orders表关联起来。然后我们使用了count函数来计算每个用户的订单数量,并将其重命名为order_count。最后,我们使用group by对用户进行分组,并使用order by按订单总数从高到低排序。

这个查询可以帮助我们了解哪些用户下单最频繁,并根据这些数据做出更明智的业务决策。

三张表情况

假设我们有三个表,一个是订单表(orders),另一个是商品表(products),第三个是订单商品关联表(order_products),用来记录每个订单中包含了哪些商品,其结构如下:

orders:

field

type

null

key

default

extra

order_id

int

no

pri

null

auto_increment

user_id

int

no

null

order_date

datetime

no

null

status

varchar(20)

no

null

products:

field

type

null

key

default

extra

product_id

int

no

pri

null

auto_increment

name

varchar(50)

no

null

description

text

no

null

price

decimal(10,2)

no

null

order_products:

field

type

null

key

default

extra

order_id

int

no

mul

null

product_id

int

no

mul

null

quantity

int

no

null

unit_price

decimal(10,2)

no

null

现在我们需要查询用户最近一个月的订单中,包含哪些商品,以及每个商品的销售数量、单价和总价。可以使用以下 sql 语句来实现:

select op.product_id, p.name, op.unit_price, sum(op.quantity) as sales_volume, sum(op.quantity * op.unit_price) as sales_amount
from orders o
inner join order_products op on o.order_id = op.order_id
inner join products p on op.product_id = p.product_id
where o.user_id = 123
and o.order_date >= date_sub(now(), interval 1 month)
group by op.product_id, p.name, op.unit_price;

在上面的查询中,我们使用了三个表的连接查询。在 where 子句中,我们过滤出了用户最近一个月的订单记录,并指定了用户id为123。在 select 子句中,我们指定了要查询的字段,其中 sum 函数用来计算每个商品的销售数量和销售金额,group by 子句用来分组计算。

注意,在使用 group by 子句时,必须将所有非聚合字段都列出来,否则会报错。在本例中,我们需要将商品名称和单价列出来。

多表情况(三张以上)

当涉及到5个或更多的表时,通常会使用更高级的查询技术,例如子查询和嵌套查询。以下是一个类似的示例,假设我们有6个表:users、orders、order_items、products、categories和suppliers,每个表的结构如下:

  • users: id, name, email, password
  • orders: id, user_id, created_at
  • order_items: id, order_id, product_id, quantity, price
  • products: id, name, category_id, supplier_id
  • categories: id, name
  • suppliers: id, name, email, phone

现在,我们想要查找所有已下订单的用户的姓名、订单号、订单创建时间、订单中的产品名称、产品所属类别、产品供应商名称、产品数量和价格。

这个查询涉及了6个表,我们需要使用多个join子句来将它们连接起来,同时使用子查询和嵌套查询来过滤结果。

select 
  u.name as user_name,
  o.id as order_id,
  o.created_at as order_created_at,
  p.name as product_name,
  c.name as category_name,
  s.name as supplier_name,
  oi.quantity as product_quantity,
  oi.price as product_price
from users u
join orders o on u.id = o.user_id
join order_items oi on o.id = oi.order_id
join products p on oi.product_id = p.id
join categories c on p.category_id = c.id
join suppliers s on p.supplier_id = s.id
where o.created_at between '2022-01-01' and '2022-12-31'
  and u.id in (select user_id from orders where created_at between '2022-01-01' and '2022-12-31')
order by u.name, o.created_at;

这个查询使用了多个join子句,将6个表连接起来。我们还使用了一个子查询来获取在指定时间范围内下单的用户的id,并使用in运算符将其与外部查询中的用户id进行匹配。我们还使用了where子句来过滤指定时间范围内下单的订单,并使用order by将结果按用户姓名和订单创建时间进行排序。

当涉及到多个表时,保持代码的可读性和可维护性非常重要。使用良好的命名约定和注释,以及遵循最佳实践和代码风格指南,可以使代码更易于理解和维护。

(三)注意事项

在进行多表操作时,需要注意以下几点:

  1. 多表连接可能会产生笛卡尔积,需要注意去重或限制返回结果数量。
  2. 在进行关联查询时,尽量使用索引字段作为关联条件,以提高查询效率。
  3. 多表查询涉及到数据的读写,为了保证数据的一致性,应该使用事务进行处理。
  4. 在多表关联查询中,使用子查询时要注意子查询的效率,尽量使用连接查询代替子查询。
  5. 多表操作可能会涉及到数据的修改和删除,因此需要谨慎处理,避免误操作导致数据的丢失。
  6. 在进行多表查询时,应该选择适当的查询方式和语句结构,以提高查询效率。同时,还需要根据实际情况进行调整和优化。

三、总结

mysql单表查询和多表操作是数据库管理中常见且重要的任务。通过掌握简单查询、条件查询、高级查询、表和字段取别名等单表查询技巧,可以有效地获取和操作单表数据。而在多表操作中,理解外键约束、操作关联表、连接查询和子查询等技术,可以实现复杂的数据关联和查询需求。

在实际应用中,选择合适的查询方式和语法至关重要,既能提高查询效率,又能保证数据的质量和安全性。特别是在多表操作中,使用索引、优化查询语句和使用事务等手段,可以显著提升查询性能和数据一致性。

通过本文的介绍,相信读者能够对mysql的单表查询和多表操作有更深入的理解,并能在实际工作中灵活运用这些技术,提高数据管理和处理的效率。

到此这篇关于mysql基本表查询操作汇总之单表查询+多表操作大全的文章就介绍到这了,更多相关mysql表查询内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com