Where查询和模糊查询
作用:检索数据中符合条件的值
逻辑运算符
运算符 | 语法 | 描述 |
---|---|---|
and && | a and b || a&&b | 逻辑与,两个都为真,结果为真 |
or || | a or b || a || b | 逻辑或,其中一个为真,则结果为真 |
Not ! | not a || !a | 逻辑非,取反操作 |
where语句举例
1.查找某个区间
select [tablecolumn1,...] from tableName where [condition1 and condition2....] or [condition1 or condition2]
2.模糊查询
select [tablecolumn1,...] from tableName where tablecolumn between num and num
3.not查询
select [tablecolumn1,...] from tableName where not condition1
4.单一条件查询
select tablecolumn from tableNamewhere num>200
5.NULL条件查询
注意:表达式为"IS NULL",不能写出"=NULL",两个NULL只也不能判断相等,如:
select tablecolumn from tableName where condition is null
如果改成 = NULL, 则查询结果是空集但不会报错 (不熟悉SQL常犯错误)**
模糊查询
运算符 | 语法 | 描述 |
---|---|---|
IS NULL | a is null | 如果操作符为NULL,则结果为真 |
IS NOT NULL | a is not null | 如果操作符为not null ,结果为真 |
BETWEEN | a between b and c | 若a在b和c之间则结果为真 |
Like | a like b | sql匹配,如果a匹配到b,则结果为真 |
In | a in (a1,a2,a3…) | 假设a在a1或者a2。。。 |
模糊查询举例
-- condition 为查询条件
-- like结合 %(代表0到任意个字符) _(一个字符)
select tablecolumn1,tablecoumn2 from tableName
where condition like 'x%'
-- 查询*** 查询后跟一个字
select tablecolumn1,tablecoumn2 from tableName
where condition like 'x_'
-- 查询编号在100,101,102的人
select tablecolumn1 from tableName
where condition in (100,101,102)
联结查询对比
select * from Table1 join_type Table2 on join_condition
#说明:join_type是连接类型,join_condition是关联条件
- inner join:显示Table1和Table2中通过Relation建立关联的信息,多余的信息不显示。
- left join:显示Table1和Table2中通过Relation建立关联的信息,并同时显示左表中所有信息
- right join:Table1和Table2中通过Relation建立关联的信息,并同时显示右表中所有信息
举例
建立数据库表如下图所示:
-
学生表
-
课程表
-
分数表
查询结果
- inner join 查询结果如下图所示:
select * from T_Student inner join T_Score on T_Student.S_ID=T_Score.S_ID
- left join 查询结果如下图所示:
select * from T_Student left join T_Score on T_Student.S_ID=T_Score.S_ID
- right join 查询结果如下图所示:
select * from T_Student right join T_Score on T_Student.S_ID=T_Score.S_ID
子查询和嵌套查询
定义
子查询:嵌套在其他查询中的查询
有三张表分别如下:
- customers: 存储顾客信息
- orderitems:只存储订单信息,无客户信息
- orders:存储订单号和顾客id
注意: 一般在子查询中,程序先运行在嵌套在最内层的语句,再运行外层。因此在写子查询语句时,可以先测试下内层的子查询语句是否输出了想要的内容,再一层层往外测试,增加子查询正确率。否则多层的嵌套使语句可读性很低。
子查询例子
查询购买商品为TNT2的顾客信息
分步步骤:
-
在orderItems表中找到TNT2的订单编号
SELECT order_num FROM orderitems WHERE prod_id='TNT2';
-
在**orders表 ** 里找出第一步找出的订单号对应的客户id
SELECT cust_id FROM orders WHERE order_num IN (SELECT order_num FROM orderitems WHERE prod_id='TNT2');
-
在customers中找出第二步对应客户的所有信息
```mysql
SELECT * FROM customers
WHERE cust_id
IN (SELECT cust_id FROM orders WHERE order_num IN
(SELECT order_num FROM orderitems WHERE prod_id='TNT2'));
```
聚合函数和分组过滤
常用的聚合函数
函数名称 | 描述 |
---|---|
COUNT() | 计数 |
SUM() | 求和 |
AVG() | 求平均值 |
MAX() | 求最大值 |
MIN() | 求最小值 |
聚合函数使用例子
-
count()
select count(column) from tableName --count(指定列),会忽略所有的null值 select count(*) from tableName select count(1) from tableName
- count(*)包括了所以的列相当于行数,在统计结果的时候,不会忽略列值为NULL
- count(1)包括了葫芦哦所以列,用1代表代码行,在统计的时候,不会忽略列值为NULL
执行效率上:
列名为主键,count(列名) 会比count(1)快
列名不为主键,count(1)会比count(列名)快
如果表有多个列且没有主键,则count(1)的执行效率优于count(*)
如果有主键,则count(主键)的执行效率最优
如果只有一个字段 则select count(*)最优
-
sum()
select sum('字段') as 总和 from result
-
avg()
select avg('字段') as 平均分 from result
-
max()
select max('字段') as 最高分 from result
-
min()
select min('字段') as 最低分 from result
分组查询
在对数据表中数据进行统计时,可能需要按照一定的类别分别进行统计,比如,分别统计student表中,gender字段值为na、nv和NULL的学生成绩grade之和
参数说明
指定的字段名1、字段名2,是对查询结果分组的依据
HAVING关键字,指定条件表达式,对分组后的内容进行过滤
GROUP BY,一般和聚合函数一起使用,如果,查询的字段出现在GROUP BY后,却没有包含在聚合函数中,该字段显示的是,分组后的第一条记录的值,这样,可能会导致查询结果不符合我们的预期
单独使用Group by分组
单独使用GROUP BY关键字,查询的是每个分组中的一条记录,
查询student表中的记录,安装gender字段值进行分组
可以看出,返回了3条记录,分别是gender字段值为NULL、nv、na的记录,查询结果按照gender字段中不同的值进行了分类,然后,值显示每个分组中的一条记录,意义不大,一般情况下,GROUP BY都和聚合函数一起使用
GROUP BY和聚合函数,一起使用
GROUP BY和聚合函数,一起使用,可以统计出某个,或者某些字段在一个分组中的最大值、最小值、平均值
查询student表,按照gender字段值进行分组,计算出每个分组中各有多少名学生
可以看出,GROUP BY对gender字段进行了分组,然后,通过COUNT()函数统计出了每组的数量
GROUP BY和HAVING关键字,一起使用
HAVING关键字和WHERE关键字的作用相同,都是用于设置条件表达式,对查询结果进行过滤。
两者的区别,HAVING关键字后,可以跟聚合函数,而WHERE关键字不能,通常情况下,HAVING关键字,都是和GROUP BY一起使用,用于对分组后的结果进行过滤
查询student表,按照gender字段进行分组,查询出grade字段值之和小于300的分组
可以看出,只有gender字段值为NULL和nv的分组,grade字段值之和小于300