软件测试,数据库学习笔记

一、去重复:distinct

A表
1、查询单列时
select name from A表,结果是
在这里插入图片描述
2、查询多列时,需要所有列的都相同才去重复
select id,name from A,结果是(需要id和name都相同时才去重)
在这里插入图片描述

二、查询语句中使用运算符

select ename as 员工,sal*12 as 年薪,sal as 月薪 from emp;

员工             年薪       月薪
------------- ---------- ----------
李小明            9600      800
李大明            7200      600
李小小            2400      200
李春春            9600      800

三、字符串连接concat(string,string)

select concat(s_name,s_sex) from 表A
   s_id s_name   s_sex
   01     张三       男
   02     李四       男
   03     王五       男
   04     赵六      null
 查询结果
 CONCAT(s_name,s_sex)
 张三男
 李四男
 王五男
 赵六

四、sql执行顺序

from>join>on>where>group by(开始使用select中的别名,后面的语句中都可以使用)>聚合(avg,sum…)>having>select>distinct>order by

select 考生姓名, max(总成绩) as max总成绩 
 
from tb_Grade 
 
where 考生姓名 is not null 
 
group by 考生姓名 
 
having max(总成绩) > 600 
 
order by max总成绩 

在上面的示例中 SQL 语句的执行顺序如下:
   (1). 首先执行 FROM 子句, 从 tb_Grade 表组装数据源的数据
   (2). 执行 WHERE 子句, 筛选 tb_Grade 表中所有数据不为 NULL 的数据 。
   (3). 执行 GROUP BY 子句, 把 tb_Grade 表按 “学生姓名” 列进行分组(注:这一步开始才可以使用select中的别名,他返回的是一个游标,而不是一个表,所以在where中不可以使用select中的别名,而having却可以使用)
   (4). 计算 max() 聚集函数, 按 “总成绩” 求出总成绩中最大的一些数值
   (5). 执行 HAVING 子句, 筛选课程的总成绩大于 600 分的.
   (7). 执行 ORDER BY 子句, 把最后的结果按 “Max 成绩” 进行排序.
   参考:猪哥66

五、mysql默认情况下不区分大小写

可以修改mysql配置文件的修改内容如下:
[mysqld]

lower_case_table_names = 1

六、where 多条件过滤,把过滤多的条件放在前面可以提高性能。

SELECT子句中避免使用‘*’

七、in,not in

in用法:select * from b where 列名2 in (select 列名1 from a where 条件) ;
解释:假如select 列名1 from a where 条件 语句的查询结果是(1,2,3)
select * from b where 列名2 in(1,2,3)就是把列名2等于1或2或3的记录找出来。(反之not in就是找出列名2不等于1或2或3的记录)

八、LIKE,not LIKE

语法如下:
WHERE column LIKE pattern
WHERE column NOT LIKE pattern
例子:
SELECT * FROM user WHERE username LIKE ‘小%’;
小%查找username以"小"开头的记录,%小则表示以”小”结尾,%小%则表示包含“小”字符。(NOT LIKE则意思相反)

九、order by

order by默认升序(asc),order by desc则为降序

十、limit

limit 0,3(当前页-1)*每页数
例子:
SELECT * FROM table LIMIT 5,10;检索6~15行的记录
select * from table limit 5;检索前5行的记录相当于limit 0,5
通常order by 与limit使用可以查找出记录的最高或最低值

十一、where

where在返回查询结果之前过滤,不能使用聚合函数,where执行在聚合函数前。

十二、having

having在返回结果后进行过滤,可使用聚合函数(聚合函数括号中可以使用where能使用的字段),对查出来的结果过滤或者可以使用group by后面的字段

十三、where与having区别

1、where与having查询结果一样:

SELECT regagent,amount FROM `cy_pay_ok`  having amount>1000;
SELECT regagent,amount FROM `cy_pay_ok`  WHERE amount>1000;

能用having是因为我前面的查询select语句中已经查询出amount字段,如果select 语句中没有amount是会报错的。

这样查询,having语句是会报错的:

SELECT regagent FROM `cy_pay_ok`  having amount>1000;
SELECT regagent,amount FROM `cy_pay_ok`  WHERE amount>1000;

在这里插入图片描述
2、having能用,where不能用
查询每种goods_category_id商品的价格平均值,获取平均价格大于1000元的商品信息

select goods_category_id , avg(goods_price) as ag from sw_goods group by goods_category having ag > 1000
select goods_category_id , avg(goods_price) as ag from sw_goods group by goods_category where ag > 1000
    

where后面应取的是数据库的字段,having是前面的结果集中查询出来什么字段就后面就可以用什么字段

十四、group by

出现在select列表中的字段,如果不是出现在组函数中,那么必须出现在group by 子句中。
数据表:

B_id(部门) y_id(员工)  city_id(城市) money(销售金额)
"1"			"1"			"1"				"200"
"1"			"1"			"1"				"300"
"1"			"2"			"1"				"400"
"2"			"3"			"1"				"100"
"2"			"3"			"1"				"500"
"2"			"4"			"1"				"10000"

如根据部门ID和员工ID对销售记录表进行分组,因为一个员工可能有多条销售记录,查询每个员工在每个部门的总销售金额

SELECT SUM(money)as a,B_id,Y_id from money_list GROUP BY Y_id,B_id

查询结果:
在这里插入图片描述
再查询每个部门的最大销售金额

SELECT max(a) from (SELECT SUM(money)as a,B_id,Y_id from money_list GROUP BY Y_id,B_id)c GROUP BY c.B_id

查询结果:
在这里插入图片描述
最后查询每个部门销售冠军

SELECT b.B_id,b.Y_id,amonut from (SELECT sum(money)as amonut,B_id,Y_id from money_list GROUP BY B_id,Y_id)b where b.amonut in(SELECT max(a) from (SELECT SUM(money)as a,B_id,Y_id from money_list GROUP BY Y_id,B_id)c GROUP BY c.B_id)

十五、聚合函数

聚合函数sum、avg、count、max、min,作用于一组数,返回一个结果。
1、sum统计函数
如统计某个员工销售金额

SELECT SUM(money)as a,B_id,Y_id from money_list GROUP BY Y_id,B_id

2、avg平均函数
如查询学生的平均成绩

SELECT avg(score),Sid from sc GROUP BY sid

3、count()求个数/记录数
如查询每个学生所学的课程

SELECT COUNT(*),Sid from sc GROUP BY sid

4、max、min查询最大/小值
如查询每门课程的最大分数,最小分数

SELECT max(score),min(score),cid from sc GROUP BY Cid

十六、多表查询

select * from 表1,表2(没有连接条件结果会返回笛卡尔积(笛卡尔积就是表1的行数乘上表2的行数得到的结果集,结果集的列就是两表的列相加),消除笛卡尔积就要加上两表的连接条件,n张表连接查询,至少有n-1个连接条件。
如两表连接产生笛卡尔积:
teacher表(5条数)
在这里插入图片描述

course表(4条数)
在这里插入图片描述
两表相连

SELECT * from course,teacher

查询结果(20行,5列)
在这里插入图片描述
加上两表连接条件,查询两表中tid相等的记录

SELECT * from course,teacher WHERE course.tid=teacher.Tid

查询结果
在这里插入图片描述

十七、子查询

子查询就是嵌套在主查询中的查询,它可以出现在主查询中所有位置,包括SELECT、FROM、WHERE、GROUP BY、HAVING、ORDER BY
如查询学生表的学生姓名和成绩表的学生的成绩

SELECT (SELECT sname from student where student.Sid=sc.Sid)as 学生姓名,score as 成绩 from sc

如找到数学课程的最大成绩

方法一:SELECT MAX(score) from (SELECT sc.cid,score from sc,course where sc.Cid=course.Cid and course.Cname='数学')c
方法二:SELECT max(score) from sc where cid=(SELECT cid from course where Cname='数学')

十八、自连接

自连接就是这个表有一列的数据恰恰和这张表的另一列有关联!比如公司员工表里存着所有员工的信息,员工和员工之间存在上下级的关系,员工表里有一个字段专门存放员工上级的员工编号(也就是该表某一个员工的姓名),如果我想查看这么一种关系,那么使用自连接就可以了,这个表存在上级姓名的列对应这个表员工姓名的列。
如存在表:员工编号、员工名称、员工上级编号
在这里插入图片描述

SELECT b.Tname as 员工,a.Tname as 上级 from productdir a,productdir b where a.id=b.Nid

查询结果:
在这里插入图片描述

十九、delete from和truncate table

1、delete from语句可以使用where对要删除的记录进行选择。而使用truncate table将删除表中的所有记录。因此,delete语句更灵活。

二十、日期

1、查询出来的日期加10天:SELECT DATE_ADD(HIREDATE,INTERVAL 10 dAY) FROM EMP;(可正可负,正表示加,负为减)hour、week、year、day;(date_sub也可以date_sub(2019.11.11 11.11.11,INTERVAL 2 HOUR))
2、从日期中提取年:SELECT * from emp where YEAR(HIREDATE)=‘1981’;(SELECT * from emp WHERE HIREDATE BETWEEN ‘1981-01-01’ and ‘1982-01-01’)
3、Now()当前系统时间
4、日期current_date(),当前时间current_time();
5、查询时间差:datediff(时间一,时间二);
6、Format(x,d)如:format(123456.789,2)返回123,456.79
7、Date_format(%Y-%M-%D %h:%s:%i)日期格式
8、UNIX_TIMESTAMP(date)将参数值以秒形式返回。From_unixtime返回yyyy-MM-DD HH:MM:SS或指定format日期

二十一、ifull

iffull(expr1,expr2)如果expr1不是空值则返回expr1,否则返回expr2.(SELECT IFNULL(COMM,0) from emp;)

二十一、连接

一、内连接;inner join两表相同部分
二、左连接:left join左外连接是A表的所有行匹配上B表得出的结果集
三、右连接:right join右外连接是B表的所有行匹配上A表得出的结果集
四、全连接:outer join全连接是A表的所有行并上B表的所有行得出的结果集
具体说明可参考:一只大头

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值