数据库复杂语句.docx
- 文档编号:8569031
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:18
- 大小:584.72KB
数据库复杂语句.docx
《数据库复杂语句.docx》由会员分享,可在线阅读,更多相关《数据库复杂语句.docx(18页珍藏版)》请在冰豆网上搜索。
数据库复杂语句
1课程名称:
sql语句
(二)
2知识点概述
2.1、本次预备讲解的知识点
1、表之间的关联关系
2、多表的查询
3、分组统计
4、分页查询
3、具体内容
用Navicat8forMysql连接数据库基本操作如图:
1、建立连接
2、填写连接信息
3、双击以建立的连接名(connection_one)
4、双击要打开的数据库(db_temp)
5、单击右键,创建dept、emp表
6、填写dept、emp表结构详细信息
dept表
emp表
3.1、表之间的关联关系
数据库中的表一般存在三种关联关系
1、一对一
2、一对多、多对一
3、多对多
表之间的的关联关系,通过“外键”来体现,外键的作用就是建立表之间的关联关系,外键一般在多方表。
一个表可以有多个“外键“
用Navicat8forMysql设计外键,操作如图:
1、右键--选择设计表
2、选择创建栏位
3、添加如下选项
4、选择外键,按如下步骤填写外键信息
5、填写完外键信息选保存
此刻dept表、emp表就建立的一对多的关联关系。
关联关系是为了保证数据库中数据的完整性
3.2、多表查询
如果查询使用一个以上的表就成为多表查询
在Navicat8中写SQL语句,则需使用查询窗体如图所示:
1、右键单击查询
2、查询编辑选项中即可写SQL语句
3.2.1、多表查询基本语法
多表查询语法如下:
SELECT{DISTINCT}*|表名.列名1别名1.列明,表名.列名2,别名2.列明,…
FROM表名称1别名1,表名称2别名2,…
{WHERE条件{s}}
{ORDERBY排序字段ASC|DESC,排序字段ASC|DESC}
同时查询dept、emp表
SELECT*FROMdept,emp;
查询emp表的记录数
SELECTCOUNT(*)FROMemp
查询dept表的记录数
SELECTCOUNT(*)FROMdept
dept表4条记录emp表7条记录
在使用多表时会产生笛卡尔乘积,4*7=28条记录,这些记录中许多是重复信息,所以在查询多表时要使用关联字段作为条件,去掉笛卡尔乘积
在dept表和emp表中关联的字段是:
dept表的deptid字段与emp表的deptid,而且emp的deptid字段的值都来自dept的deptid,即dept.deptid=emp.empid
去掉笛卡尔乘积的查询为:
SELECT*FROMdept,empWHEREdept.deptid=emp.deptid
使用多表查询,建议使用别名
查询员工编号,员工姓名,员工性别,员工年龄,员工地址,所属部门名称
|-此查询包含了员工表中的信息,部门表中的信息,故使用多表查询
SELECTB.empid,B.empname,B.empsex,B.empage,B.empaddress,A.deptname
FROMdeptA,empB
WHEREA.deptid=B.deptid
3.2.2、左、右连接查询
在多表查询中还有一种查询方式,称为内连接查询,语法如下:
SELECT{DISTINCT}*|表名.列名1别名1.列明,表名.列名2,别名2.列明,…
FROM表名称1别名1INNERJOIN表名称2别名2,…
ON关联条件
{WHERE条件{s}}
{ORDERBY排序字段ASC|DESC,排序字段ASC|DESC}
查询部门表和员工表信息
SELECT*FROMdeptINNERJOINempONdept.deptid=emp.deptid
内连接查询其实就是去掉笛卡尔乘积的多表关联查询,注意:
只查询关联字段,没有关联的不查询
左连接查询
SELECT*
FROMdeptLEFTJOINemp
ONdept.deptid=emp.deptid
以左边的表作为标准,无论关联与否左边表都查询
右连接查询
SELECT*
FROMdeptRIGHTJOINemp
ONdept.deptid=emp.deptid
以右边的表作为标准,无论关联与否右边表都查询
3.3、组函数及分组统计、
如需查询员工表中的性别为“男”或“女”的员工个数,则需要SQL语句中分组统计功能。
1、分组在SQL中用“GROUPBY”语法如下:
SELECT{DISTINCT}*|列名1别名1,列名2,别名2,…
FROM表名称1别名1
{WHERE条件{s}}
GROUPBY分组条件
{ORDERBY排序字段ASC|DESC,排序字段ASC|DESC}
注意:
groupby的位置
以性别为标准对员工进行分组
SELECTempsexFROMempGROUPBYempsex
注意:
单独使用分组条件时,以什么字段作为分组条件,那么查询字段就必须是什么字段
2、SQL中常用的统计函数
~COUNT():
全部的记录数
~MAX():
最大值
~MIN():
最小值
~AVG():
平均数
~SUN():
求和
查询员工总数
SELECTCOUNT
(1)FROMemp
count
(1)中填写“1”有助于提高查询效率
查询员工年龄的最大值
SELECTMAX(empage)'年龄最大值'FROMemp
查询员工年龄最小值
SELECTMIN(empage)'年龄最小值'FROMemp
查询员工年龄的平均值
SELECTAVG(empage)'年龄的平均值'FROMemp
查询所有部门人数之和
SELECTSUM(deptnum)'部门人数之和'FROMdept
注意:
分组函数中使用的通常都是数值类型的字段,或日期类型字段
3、分组统计的综合应用
查询员工信息表中“男“、”女“员工的个数
分析:
|-以性别作为标准进行分组
|-使用COUNT()统计函数
SELECTempsex'性别',COUNT(empid)'员工人数'
FROMemp
GROUPBYempsex
查询每个部门的员工人数
分析:
|-查询使用到了多表
|-以部门编号作为分组标准
|-使用COUNT()统计函数
SELECTA.deptid'部门编号',COUNT(B.empid)'部门人数'
FROMdeptA,empB
WHEREA.deptid=B.deptid
GROUPBYA.deptid
查询每个部门的员工的平均年龄
分析:
|-查询使用到了多表
|-以部门编号作为分组标准
|-使用AVG()统计函数
SELECTA.deptid'部门编号',AVG(B.empage)'部门平均年龄'
FROMdeptA,empB
WHEREA.deptid=B.deptid
GROUPBYA.deptid
注意:
在使用分组的时候,不能出现分组条件和分组函数之外的字段
4、HAVING的使用
HAVING是在分组的基础上进行筛选,语法如下:
SELECT{DISTINCT}*|列名1别名1,列名2,别名2,…
FROM表名称1别名1
{WHERE条件{s}}
GROUPBY分组条件{HAVING分组条件}
{ORDERBY排序字段ASC|DESC,排序字段ASC|DESC}
查询员工平均年龄在22岁之上所属部门编号
分析|-以部门编号作为分组标准
|-分组后,条件筛选使用AVG()函数
SELECTdeptid'部门编号'
FROMemp
WHEREtrue
GROUPBYdeptid
HAVINGAVG(empage)>22
小结:
只在某列中出现重复,才需要分组,否则没有意义
3.4、分页语句
如果数据特别多,一次在页面中展示不完,我们就需要用到分页展示数据,这就需要分页的sql语句
mysql分页的关键字为:
LIMITX,Y
X为起始的记录数(排除前几条记录开始),Y为每次展示的记录个数(分页标准)
语法如下:
SELECT{DISTINCT}*|列名1别名1,列名2,别名2,…
FROM表名称1别名1
{WHERE条件{s}}
{ORDERBY排序字段ASC|DESC,排序字段ASC|DESC}
{LIMITX,Y}
查询员工表中的前两条记录
SELECT*FROMempLIMIT0,2
查询员工表中的第3、4条记录
SELECT*FROMempLIMIT2,2
查询员工表中的第5、6条记录
SELECT*FROMempLIMIT4,2
查询员工表中的第7、8条记录
SELECT*FROMempLIMIT6,2
综上mysql中的分页语句为:
SELECT{DISTINCT}*|列名1别名1,列名2,别名2,…
FROM表名称1别名1
{WHERE条件{s}}
{ORDERBY排序字段ASC|DESC,排序字段ASC|DESC}
{LIMIT((当前页-1)*分页标准),分页标准}
第一页的记录数
SELECT*FROMempLIMIT((1-1)*2),2
注意:
(1-1)*2一般会在程序中直接算出结果,放入该位置即可
第二页的记录数
SELECT*FROMempLIMIT((2-1)*2),2
注意:
(2-1)*2一般会在程序中直接算出结果,放入该位置即可
4总结
5预习任务
6作业
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据库 复杂 语句
![提示](https://static.bdocx.com/images/bang_tan.gif)