SELECT带条件查询

SQL查询技巧总结

嘿嘿,数据库这几天感觉学的还是挺简单的,今日小总结

select 带条件的查询  例子如下:

-- 查询 MyStudents 数学成绩没有及格的学生

select FName as 姓名,FMath as 数学成绩,FEnglish as 英语成绩 from MyStudents where FMath<60 and FEnglish<60

-- 查询年龄大于 27and 小于 33 的男学生
---between ..and (between 27 and 30)

select FName as 姓名 from MyStudents where FAge between 27 and 33 and FGender='男'
 -- 查询部门 1,4,5 中的员工  模糊查询 ---( 针对字符串 )

select EmpName as 姓名,EmpDepId as 部门 from Employees where EmpDepId in (1,4,5)

--模糊查询
--查询Mystudents中所有姓张的同学
select * from Mystudents where FName like '张%'

--查询姓名中包含一个敏字的
insert into Mystudents values('赵敏',24,0,100,80)
insert into Mystudents values('李敏锐',24,0,100,80)
select *  from Mystudents
select * from Mystudents  where FName like '%敏%'--只要有‘敏’字的
select * from Mystudents  where FName like '%敏'--最后一个是‘敏’字的

--查询所有姓王的同学 姓名的字数必须是3个的  (使用通配符下划线代表 一个任意字符)
select * from Mystudents where FName like '王__'
select * from Mystudents where FName like '王%' and LEN(FName)=3

--通配符[] 查出姓名包含'磊'或者包含'伟'的人
select * from Mystudents where FName like '%[磊,伟]%'

--查找名字中既没有‘磊’也没有‘伟’的人
--找姓名以X开头 以Y结尾,中间只要不是磊或不是伟的
select *  from Mystudents where FName like 'x[^磊伟]y'

--只要中间没有'磊''伟'的
select *  from Mystudents where FName like '%[^磊伟]%'
--[]中括号里面的任意多的字符,只选一个

--查询姓名中包含%或者_的所有人
select * from Mystudents where FName like '%[%_]%'

--找所有不姓王的人
select * from Mystudents where FName like '[^王]%'
select * from Mystudents where FName not like '王%'

--空值处理   什么是空值 -- null
--添加数学成绩为空的值 姓王的
update Mystudents set FMath=null where FName like '王%'

--查询数学成绩为null的
select * from Mystudents where FMath is null

--数据库中只有三种逻辑结果 true false unkonw 数据库中的null就是 unkonw 如果判断一个值是否为null,就不能使用 =,<>(不等于) 来判断。返回值就永远是false

update Mystudents set FAge =FAge +1 where FId=1
select *from Mystudents

--ISNULL 函数
select FName,FAge, 数学成绩=ISNULL(cast(FMath as varchar(50)),'缺考') from Mystudents where FMath is null
--同一个列上数据类型必须一致,如果不一致就会报错。

--数据排序(集合中的数据时无序的,如果排序之后有了续之后‘游标’,集合可以作为一个查询的数据源,但是有序了的游标是不能作为数据源的)
--例:
select * from (select * from Mystudents where FAge>30) as tbl
select * from (select top 5 * from Mystudents where FAge>30 order by FAge desc) as tbl

--order by 数据查询 按英语成绩降序排的
select * from Mystudents order by FEnglish desc  --次查询结果叫做游标
--先按英语成绩排序 再按数学成绩排序 (先排英语成绩 英语成绩相同的 再按数学成绩排)
select * from Mystudents order by FEnglish desc,FMath desc,FAge asc

--查询学生表中的成绩信息,显示姓名 性别 英语成绩 数学成绩 平均分
select FName,FAge,FGender,FEnglish,FMath,AVG((FMath+FEnglish)/2) from Mystudents order by AVG((FEnglish +FMath )/2) desc

--数据分组  ---(数据挖掘)
--统计MyStudents当中男生和女生的个数
select 性别=FGender, COUNT (*) as 人数  from Mystudents group by FGender

--查询Employees表,要每个部门Id和这个部门的男性人数
--1、找到公司 2、找出所有男生  3、让他们按照部门Id站成几堆  4、数人数
select 部门Id=EmpDepId,COUNT(*)from Emplpyees where EmpGender='男' group by EmpDepId asc

--没有在group by 中出现的字段 也不能出现在 select

--Having语句 对组进行筛选的 where 也是进行筛选的 区别是where是在分组前进行筛选 Having是在分组后进行筛选的
--例如:查询男性人数大于3人的部门
--1、找到单位 2、把男的集合 3、按部门分开站 4、数人数 5、小于3的剔除

select 部门号=EmpDepId,部门男性人数=COUNT(*) from Employees where EmpGender='男' group by EmpDepId Having Count(*)>3

--统计Mystudents表中的男和女的个数 列出人数大于20 的

select 性别=FGender, 人数=COUNT (*) from Mystudents group by FGender
select 性别=FGender, 人数=COUNT (*) from Mystudents group by FGender Having COUNT(*)>20

--SQl执行语句的顺序
--1、from 2、where 3、group by 4、having 5、select  ---选择列>distinct>top 6、order by

select COUNT(distinct(FGender)) as 性别,COUNT (*)as 人数 from Mystudents
select * from Mystudents order by FEnglish desc --降序 desc  升序 asc


转载自:http://blog.youkuaiyun.com/linlin2294592017/article/details/8112013

<think> 我们正在讨论的是MySQL中的条件查询,特别是使用@Select注解(可能是MyBatis框架中的注解)进行条件查询。根据引用[2],@Select是MyBatis中的注解,用于编写查询SQL语句。用户想了解@select条件查询的使用方法和相关知识。 首先,我们需要明确:在MyBatis中,@Select注解用于直接在Java方法上编写SQL查询语句,避免了XML配置文件的繁琐。条件查询则是在SQL语句中使用WHERE子句来限定查询结果。 参考引用[2]中的内容,我们可以整理出以下几点: 1. 普通类型传递:在@Select注解的SQL语句中,可以使用#{参数名}来引用方法参数。 2. 使用条件构造器作为参数:MyBatis Plus提供了条件构造器(如QueryWrapper)来构建复杂的查询条件,然后传递给@Select注解的方法。 3. 多表查询:在@Select中也可以编写多表关联查询的SQL。 此外,引用[4]提到了MySQL中变量的使用,但这是在SQL语句中直接使用用户变量,与MyBatis中的@Select注解使用方式不同。不过,我们也可以在@Select注解的SQL语句中使用MySQL的变量语法,但这通常不是MyBatis推荐的参数传递方式。 下面,我们将详细介绍@Select条件查询的使用方法。 一、基本条件查询 在MyBatis中,我们可以直接在@Select注解中写SQL语句,并通过#{param}来绑定方法参数。 示例:根据用户ID查询用户信息 ```java @Select("SELECT * FROM user WHERE id = #{userId}") User getUserById(@Param("userId") Long userId); ``` 二、动态条件查询 如果查询条件不确定,我们可以使用MyBatis提供的动态SQL标签(在注解中通过<script>标签使用)。 示例:根据条件动态查询用户 ```java @Select("<script>" + "SELECT * FROM user " + "WHERE 1=1 " + "<if test='name != null'> AND name = #{name} </if>" + "<if test='age != null'> AND age = #{age} </if>" + "</script>") List<User> getUserByCondition(@Param("name") String name, @Param("age") Integer age); ``` 三、使用条件构造器(MyBatis Plus) 如果项目中使用了MyBatis Plus,我们可以使用条件构造器来构建查询条件,然后将其作为参数传递给@Select注解的方法。 示例: ```java @Select("SELECT * FROM user ${ew.customSqlSegment}") List<User> selectByWrapper(@Param(Constants.WRAPPER) QueryWrapper<User> wrapper); ``` 注意:这里使用了${ew.customSqlSegment}来插入条件构造器生成的SQL片段(包括WHERE条件等)。 四、多表查询 在@Select注解中,我们可以编写任意复杂的SQL,包括多表连接查询。 示例:查询用户及其订单信息 ```java @Select("SELECT u.*, o.order_id, o.order_date " + "FROM user u LEFT JOIN order o ON u.id = o.user_id " + "WHERE u.id = #{userId}") List<Map<String, Object>> getUserWithOrders(Long userId); ``` 五、参数传递的注意事项 1. 当方法有多个参数时,需要使用@Param注解指定参数名,以便在SQL中引用。 2. 在动态SQL的<script>标签内,可以使用所有的MyBatis动态SQL标签,如<if>、<choose>、<foreach>等。 六、避免使用SELECT * 引用[3]提到,不要使用SELECT *作为查询条件。原因包括: 1. 联表查询时,如果两个表有相同的列名,会出现覆盖。 2. 查询不必要的字段会增网络传输和内存消耗。 3. 使用具体字段名可以提高查询的可读性和可维护性。 因此,在编写@Select注解的SQL时,应明确列出需要查询的字段。 七、MySQL变量在查询中的使用(补充) 虽然这不是MyBatis的标准用法,但有时我们可能需要在SQL中使用MySQL的变量。例如: ```java @Select("SET @rank=0; SELECT @rank:=@rank+1 AS rank, name, score FROM student ORDER BY score DESC;") List<Map<String, Object>> getStudentRank(); ``` 注意:在一条@Select注解中执行多条语句需要MySQL连接允许执行多条语句(在连接字符串中添allowMultiQueries=true)。 但是,在MyBatis中,通常不推荐在一个方法中执行多条SQL语句,因为这样可能会引起SQL注入风险,且不易维护。 综上所述,@Select条件查询主要是利用MyBatis的注解方式编写SQL,通过#{}进行参数绑定,并支持动态SQL。同时,结合MyBatis Plus的条件构造器可以更方便地构建动态查询条件。 为了帮助用户巩固理解,以下是相关问题: §§相关问题§§ 1. 在MyBatis的@Select注解中,如何传递多个参数? 2. 如何在使用@Select注解时实现动态SQL条件查询? 3. 为什么建议在SQL查询中避免使用SELECT *? 4. MyBatis Plus的条件构造器在@Select注解中如何使用? 5. 在@Select注解中执行多条SQL语句需要注意什么? </think> ### @Select 条件查询详解 #### 一、基本语法与使用 在 MySQL 中,`@select` 通常指代 MyBatis 框架的 `@Select` 注解,用于执行条件查询。核心语法结构如下: ```sql SELECT 字段列表 FROM 表名 WHERE 查询条件 ``` 🛠️ **基础用法示例**: ```java // MyBatis 注解方式 @Select("SELECT * FROM users WHERE age > #{minAge}") List<User> findUsersByAge(@Param("minAge") int minAge); ``` #### 二、条件表达式分类 1. **数值比较** `=`, `>`, `<`, `>=`, `<=`, `!=` ```sql SELECT name FROM products WHERE price > 100 ``` 2. **逻辑表达式** `AND`, `OR`, `NOT` ```sql SELECT * FROM orders WHERE status = 'paid' AND total_amount > 500 ``` 3. **特殊运算符** - `BETWEEN`:范围查询 ```sql SELECT * FROM employees WHERE salary BETWEEN 5000 AND 10000 ``` - `IN`:多值匹配 ```sql SELECT name FROM cities WHERE country IN ('CN', 'US') ``` - `LIKE`:模糊查询 ```sql SELECT * FROM books WHERE title LIKE '%数据库%' ``` #### 三、动态条件实现(MyBatis) 通过 `<script>` 标签实现动态 SQL: ```java @Select("<script>" + "SELECT id, name, email FROM users " + "<where>" + " <if test='name != null'> AND name LIKE #{name} </if>" + " <if test='role != null'> AND role = #{role} </if>" + "</where>" + "</script>") List<User> findUsersDynamic(Map<String, Object> params); ``` #### 四、性能优化要点 1. **避免 `SELECT *`** 明确列出所需字段(如 `SELECT id, name`),减少数据传输量[^3]: ```sql -- 不推荐 SELECT * FROM orders WHERE user_id = 1001; -- 推荐 SELECT order_id, amount, status FROM orders WHERE user_id = 1001; ``` 2. **索引友好条件** - ✅ 有效索引:`WHERE indexed_column = value` - ❌ 索引失效:`WHERE function(indexed_column) = value` 3. **变量条件处理** 使用 `@变量` 需注意作用域[^4]: ```sql SET @min_salary = 6000; SELECT * FROM employees WHERE salary > @min_salary; ``` #### 五、安全等于运算符 `<=>` - 可处理 `NULL` 值比较 ```sql SELECT * FROM tasks WHERE complete_date <=> NULL -- 查找未完成任务 ``` #### 六、多表关联查询 ```java @Select("SELECT u.name, o.order_date " + "FROM users u JOIN orders o ON u.id = o.user_id " + "WHERE u.status = 'active'") List<Map<String, Object>> getActiveUserOrders(); ``` ⚠️ **注意事项**: 1. 参数化查询防止 SQL 注入(始终使用 `#{}` 占位符) 2. 联表查询时明确驱动表(减少全表扫描)[^3] --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值