此篇博客盼望对你有所帮助,不懂的或有错误的也可在批评区留言,错误必批评必回!!!
一、新增
语法:
- insert into 表名[(字段1,字段2,...)]select(字段1,字段2,...)from 表名;
复制代码 示例:
创建一个student表(id, name, sex, age, email);
创建一个test表(id, name, sex, age, email);而且给student表中插入两组数据,通过新增,把student表中的数据复制到test表中。
二、查询
2.1 聚合查询
2.1.1 聚合函数
常见的有以下六种:
count()
count()用来统计表中的行数。
- select count(*) from 表名;//推荐大家使用这种方式,这种写法是SQL标准中规定的
- select count(常数) from 表名;//这种方式也可以统计出表中的行数
复制代码
也可以指定某一列进行统计。
- select count(列名) from 表名;
复制代码
count(列名),如果说列中有NULL值,则不会被统计在内!、
sum()
sum(列名)求和,把查询结果中所有行中的指定列进行相加
注意:列中的数据类型必须是数值型,不能是日期或字符…。如果不是对非数值类型的列进行计算,会得到告诫信息。
1.之前我们提起过,NULL与任何值运行的结果都是NULL。但通过这里发现,sum()求和NULL 值不参与运算。
2.这里的结果是在一个临时表中,结果不受表中字段长度束缚。
AVG()
对所有行的指定列进行平均值运算。
MAX(),MIN()
求所有行中指定列的最大值,最小值
查出数学的最大值和最小值:
同一列可以使用不同的聚合函数
不同的一列可以使用不同的聚合函数
GROUP_CONCAT()
将来自多个记载的列值连接成一个字符串结果。通常与GROUP BY语句一起使用,以将多个行的值归并为一个逗号分隔的字符串。
示例:这里创建了一个employees表,其中包含员工的 id、department_id 和 name。而且给employees表中存储四组数据。
我们想要获取每个部门中所有员工的名字列表,可以使用 GROUP_CONCAT() 如下:
如果我们还想要按名字排序,并改变分隔符为分号(;),我们可以这样做:
注意事项:
1.GROUP_CONCAT() 默认的结果长度受到 group_concat_max_len 系统变量的限制,其默认值是 1024。如果你预期会有大量的数据被归并,可能需要调整这个值。
2.如果你在一个没有 GROUP BY 语句和其他聚合函数的查询中仅使用 GROUP_CONCAT(),MySQL 可能会将整个结果集视为一个大的组,并尝试将所有行的相关列值连接成一个单一的字符串。这通常不是预期的举动,因为它可能会导致天生一个非常长的字符串,特别是当查询结果集很大时。
2.1.2 GROUP BY 子句
GROUP BY 子句:SELECT中使用GROUP BY 子句可以对指定列进行分组查询。然后,对于每个组,它会计算聚合函数的值。如果查询中没有指定聚合函数,但使用了 GROUP BY,则每个组将只返回一行,通常是分组列的值(尽管这取决于选择的列和数据库的具体实现)。
语法:
- select 列名(分组的列名),聚合函数(列名)...from 表名 group by 列名(分组的列名),列名(分组的列名);
复制代码 示例:假设我们有一个名为 sales 的表,包含列 year, product_id, 和 amount。
然后我们根据product_id进行分组,查看一下它的销售总额。
group by 背面可以跟order by子句
2.1.3 HAVING 子句
GROUP BY 子句进行分组之后,需要对分组结果进行条件过滤时,不能使用WHERE 语句,而需要使用HAVING;
示例:这里为了各人更方便简单观察到,这里我又插入了6组数据。
这里我们需要通过HAVING子句过滤掉销售量小于800的产品。
2.2 联合查询
联合查询(也称为联结查询或JOIN查询)是一种通过两个或多个表中的列之间的关系来查询、组合或归并表中的数据的方法。联合查询是SQL中一个非常强盛的功能,它允许你根据需要在不同的表中检索相关信息。
联合查询是如何执行的?
1.取多张表的笛卡尔积。
举例:创建一张class表,包含列id,name;创建一张student表,包含列class_id,name,sex。
而且分别给两张表中插入数据!
天生笛卡尔积:
2.通过连接条件过滤掉无效数据
3.能通过指定列查询,来精简结果集
2.2.1 内连接
内连接(INNER JOIN)是SQL查询中使用的一种连接类型,用于返回两个或多个表中符合连接条件的记载。内连接仅返回那些在连接条件上有匹配的行。如果在一个表中有行在另一个表中没有匹配的连接条件,那么这些行就不会出现在查询结果中。
语法:
- select 字段 from 表1 as 别名1 [inner] join 表名2 as 别名2 on 连接条件 and 其他条件;//标准的内连接写法
复制代码- select 字段 from 表1 as 别名1 , 表名2 as 别名2 where 连接条件 and 其他条件;
复制代码 示例:查询班级编号,班级名称,学生姓名
注意:当你使用别名时,那么select 背面的字段也必须是别名.字段名,否则则无法辨认;
2.2.2 外连接
外连接分为左外连接和右外连接。如果联合查询,左侧的表完全显示我们就说是左外连接,右侧的表完全显示我们就说是右外连接。
语法:
左外连接:表1全显示
- select 字段名 from 表名1 left join 表名2 on 连接条件;
复制代码 右外连接:表2全显示
- select 字段名 from 表名1 right join 表名2 on 连接条件;
复制代码 示例:假设class表为表1,student表为表2。
左外连接:
右外连接:
外连接:通过right和left确认基准表,没有与基准表匹配的记载,用null填充。
2.2.3 自连接
自连接(Self-Join)是一种特殊的连接查询,它指的是表与其自身进行连接。自连接通常用于查询表中存在层次或递归关系的数据。
案例:查询比‘雨欣’数学结果高的学生。
1.去笛卡尔积
2.观察结果集,确认条件
也可以用join on 语句进行自连接查询
- select * from score s1 join score s2 on s1.name='雨欣' and s1.math<s2.math;
复制代码 2.2.4 子查询
子查询是指嵌入在其他sql语句中select语句,也叫嵌套查询。由于嵌套查询没有固定的限制,多层嵌套的效率是不可控的,以是谨慎使用。
单行查询:返回一行子查询记载
案例:查询数学结果为69,语文结果为66的学生的信息。
多行查询:返回多行记载的子查询
返回一个集合,使用关键字IN
关键字:[NOT]EXISTS
- select * from where exists(select * from 表名);
复制代码 表明:exists背面括号中的查询语句,如果有结果返回,则执行外层查询,如果返回值为空,则不执行外层查询。
from子句使用子查询天生临时表
在from子句中使用子查询:子查询语句出现from子句中,这里要用到数据查询的技巧,把一个子查询当成一个临时表来使用。
2.2.5 归并查询
归并查询通常指的是将多个查询的结果集归并成一个结果集。这可以通过 UNION 或 UNION ALL 操作符来实现。使用 UNION 或 UNION ALL 时,前后查询的结果集中,字段需要一致。
UNION
UNION 操作符用于归并两个或多个 SELECT 语句的结果集,并主动去除重复的记载,只保留唯一的记载。每个 SELECT语句必须拥有相同数量的列,且对应列的数据类型也必须兼容。
在单表中可以去用逻辑运算符去连接不同的查询条件;但多表中,就没办法用逻辑运算符,如果最闭幕果从多表中获取的,必须要用UNION来进行归并。
案例:主动去除结果集中的重复行!
列名不匹配,返回的结果值就是错误的,这种查询就是没故意义的!
UNION ALL
与 UNION 雷同,UNION ALL 也用于归并两个或多个 SELECT 语句的结果集,但它会包含所有的重复记载。也就是说,它不会去除任何重复的行。这通常在你需要包含所有行,包括重复行时非常有效。
案例:不会去除结果集中的重复行!
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |