数据库复杂语句Word下载.docx
《数据库复杂语句Word下载.docx》由会员分享,可在线阅读,更多相关《数据库复杂语句Word下载.docx(18页珍藏版)》请在冰豆网上搜索。
![数据库复杂语句Word下载.docx](https://file1.bdocx.com/fileroot1/2023-1/31/711a55b3-fafc-4c56-921e-c15717eaf3fa/711a55b3-fafc-4c56-921e-c15717eaf3fa1.gif)
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、左、右连接查询
在多表查询中还有一种查询方式,称为内连接查询,语法如下:
FROM表名称1别名1INNERJOIN表名称2别名2,…
ON关联条件
查询部门表和员工表信息
SELECT*FROMdeptINNERJOINempONdept.deptid=emp.deptid
内连接查询其实就是去掉笛卡尔乘积的多表关联查询,注意:
只查询关联字段,没有关联的不查询
左连接查询
SELECT*
FROMdeptLEFTJOINemp
ONdept.deptid=emp.deptid
以左边的表作为标准,无论关联与否左边表都查询
右连接查询
FROMdeptRIGHTJOINemp
以右边的表作为标准,无论关联与否右边表都查询
3.3、组函数及分组统计、
如需查询员工表中的性别为“男”或“女”的员工个数,则需要SQL语句中分组统计功能。
1、分组在SQL中用“GROUPBY”语法如下:
SELECT{DISTINCT}*|列名1别名1,列名2,别名2,…
FROM表名称1别名1
GROUPBY分组条件
注意:
groupby的位置
以性别为标准对员工进行分组
SELECTempsexFROMempGROUPBYempsex
单独使用分组条件时,以什么字段作为分组条件,那么查询字段就必须是什么字段
2、SQL中常用的统计函数
~COUNT():
全部的记录数
~MAX():
最大值
~MIN():
最小值
~AVG():
平均数
~SUN():
求和
查询员工总数
SELECTCOUNT
(1)FROMemp
count
(1)中填写“1”有助于提高查询效率
查询员工年龄的最大值
SELECTMAX(empage)'
年龄最大值'
FROMemp
查询员工年龄最小值
SELECTMIN(empage)'
年龄最小值'
查询员工年龄的平均值
SELECTAVG(empage)'
年龄的平均值'
查询所有部门人数之和
SELECTSUM(deptnum)'
部门人数之和'
FROMdept
分组函数中使用的通常都是数值类型的字段,或日期类型字段
3、分组统计的综合应用
查询员工信息表中“男“、”女“员工的个数
分析:
|-以性别作为标准进行分组
|-使用COUNT()统计函数
SELECTempsex'
性别'
COUNT(empid)'
员工人数'
FROMemp
GROUPBYempsex
查询每个部门的员工人数
分析:
|-查询使用到了多表
|-以部门编号作为分组标准
SELECTA.deptid'
部门编号'
COUNT(B.empid)'
部门人数'
GROUPBYA.deptid
查询每个部门的员工的平均年龄
|-使用AVG()统计函数
AVG(B.empage)'
部门平均年龄'
在使用分组的时候,不能出现分组条件和分组函数之外的字段
4、HAVING的使用
HAVING是在分组的基础上进行筛选,语法如下:
GROUPBY分组条件{HAVING分组条件}
查询员工平均年龄在22岁之上所属部门编号
分析|-以部门编号作为分组标准
|-分组后,条件筛选使用AVG()函数
SELECTdeptid'
FROMemp
WHEREtrue
GROUPBYdeptid
HAVINGAVG(empage)>
22
小结:
只在某列中出现重复,才需要分组,否则没有意义
3.4、分页语句
如果数据特别多,一次在页面中展示不完,我们就需要用到分页展示数据,这就需要分页的sql语句
mysql分页的关键字为:
LIMITX,Y
X为起始的记录数(排除前几条记录开始),Y为每次展示的记录个数(分页标准)
语法如下:
{LIMITX,Y}
查询员工表中的前两条记录
SELECT*FROMempLIMIT0,2
查询员工表中的第3、4条记录
SELECT*FROMempLIMIT2,2
查询员工表中的第5、6条记录
SELECT*FROMempLIMIT4,2
查询员工表中的第7、8条记录
SELECT*FROMempLIMIT6,2
综上mysql中的分页语句为:
{LIMIT((当前页-1)*分页标准),分页标准}
第一页的记录数
SELECT*FROMempLIMIT((1-1)*2),2
(1-1)*2一般会在程序中直接算出结果,放入该位置即可
第二页的记录数
SELECT*FROMempLIMIT((2-1)*2),2
(2-1)*2一般会在程序中直接算出结果,放入该位置即可
4总结
5预习任务
6作业