qq群关系数据库查询.docx
《qq群关系数据库查询.docx》由会员分享,可在线阅读,更多相关《qq群关系数据库查询.docx(11页珍藏版)》请在冰豆网上搜索。
![qq群关系数据库查询.docx](https://file1.bdocx.com/fileroot1/2023-2/2/24f6ecab-8a50-470a-811a-8a8b7ea4f374/24f6ecab-8a50-470a-811a-8a8b7ea4f3741.gif)
qq群关系数据库查询
qq群关系数据库查询
篇一:
数据库简单与复杂查询
例5.1部门的编号、名称和位置
select*fromdepartment//星号“*”可以在select子句中表示“所有的属性”
例5.2部门的编号、名称和位置
selectdept_no,dept_name,locationfromdepartment
例5.3查询位于Dallas的部门编号和名称
selectdept_no,dept_name
fromdepartment
WHERElocation=Dallas
例5.4查询预算额的0.51倍大于60000的项目名称
SELECTproject_name
FROMproject
WHEREbudget*0.51>60000
例5.5查询在部门编号为d1的部门工作且职员编号为25348或职工名称为‘Matthew’的雇员信息。
SELECT*
FROMemployee
WHEREemp_no=25348ORemp_fanme=Matthew
ANDdept_no=d1
例5.6查询不在部门编号为d1的部门工作的职员编号和姓名
SELECTemp_no,emp_lname
FROMemployee
WHERENOTdept_no=d1
例5.7获取编号既不是10102也不是9031的职员的所有列。
SELECT*
FROMemployee
WHEREemp_noNOTIN(10102,9031)
例5.8获取预算在$95000~$120000之间的所有项目的名称和预算。
SELECTproject_name,budget
FROMproject
WHEREbudgetBETWEEN95000AND120000
例5.9获取预算小于$95000和大于$120000之间的所有项目的名称。
SELECTproject_name
FROMproject
WHEREbudgetNOTBETWEEN95000AND120000
例5.10获取为项目2工作的,具有未知工作的所有职员的职员编号和相应的项目编号。
SELECTemp_no,project_no
FROMworks_on
WHEREproject_no=‘p2ANDjobISNULL
系统函数ISNULL允许在显示时用指定的数值来替代NULL
SELECTemp_no,ISNULL(job,’Jobunknowntask’)
FROMworks_on
WHEREproject_no=‘p2ANDjobISNULL
例5.11找出所有姓是以字母J开头的职员的名字和编号。
SELECTemp_fname,emp_lname,emp_no
WHEREemp_lnameLIKE‘j%’
例5.12找出所有名中第二个字母是a的职员的名字和编号。
SELECTemp_fname,emp_lname,emp_no
FROMemployee
WHEREemp_fnameLIKE‘_a%’
例5.13获取所在地名从C到F的字母打头的所有部门的详细资料。
SELECT*
FROMDEPARTMENT
WHERELOCATIONLIKE‘[C-F]%’
例5.14获取姓的打头字母不是J,K,L,M,N,O,并且名的开头字母是E或者Z的所有职员的编号和名字。
SELECT*
FROMEMPLOYEE
WHEREEMP_LNAMELIKE[^J-O]%AND
emp_fnameLIKE[EZ]%
例5.15所有被方括号括起来的通配符(%,_,[,],^)都表示本来的意思。
SELECTproject_no,project_name
FROMproject
WHEREproject_NAMELIKE‘%[_]%’
例5.16获取在研究部门工作的所有职员的名和姓。
SELECTemp_fname,emp_lname
FROMemployee
WHEREdept_no=
(SELECTdept_no
FROMDEPARTMENT
WHEREdept_name=research)
例5.17获取职员moser参与的项目编号。
SELECTDISTINCTproject_no
FROMworks_on
WHEREemp_no=
(SELECTemp_no
FROMemployee
WHEREemp_lname=moser)
例5.18获取部门位于Dallas的所有职员的详细信息。
SELECT*
FROMemployee
WHEREdept_noin
(SELECTdept_no
FROMdepartment
WHERElocation=Dallas)
例5.19获取为Apollo项目工作的所有职员的姓。
SELECTemp_lname
FROMemployee
(SELECTemp_no
FROMworks_on
WHEREproject_noin
(selectproject_no
fromproject
whereproject_name=Apollo)
)
例5.20获取不是在项目上花费了最多时间的所有职员的编号、项目编号和工作名称。
SELECTDISTINCTEMP_NO,PROJECT_NO,JOB
FROMworks_on
WHEREenter_date>any
(SELECTenter_date
FROMworks_on
)
例5.21获取为项目p1工作的所有职员的名和姓。
SELECTDISTINCTemp_fname,emp_lname
FROMemployee
WHEREemp_no=any
(SELECTemp_no
FROMworks_on
whereproject_no=p1
)
例5.22选择编号大于等于10000的所有职员的名字。
SELECTDISTINCTemp_fname,emp_lname
FROM(SELECT*
FROMemployee
WHEREemp_no>=10000)ASemp_no10000
例5.23使用项目编号和工种对所有职员分组。
SELECTproject_no,job
FROMworks_on
GROUPBYproject_no,job
例5.24看如下的查询例子,分析正确与否
SELECTemp_lname,MIN(emp_no)
FROMemployee
例5.25获取最小的职员编号
SELECTMIN(emp_no)min_employee_number
FROMemployee
例5.26获取最小的职员编号和姓
SELECTemp_no,emp_lname
FROMemployee
WHEREemp_no=
(SELECTMIN(emp_no)min_employee_number
FROMemployee)
例5.26获取表WORKS_ON中进入时间最晚的经理的职员编号
SELECTemp_no
FROMWORKS_ON
WHEREenter_date=
(SELECTMAX(enter_date)
FROMWORKS_ON
WHEREjob=Manager
)
例9.27计算所有项目预算的总和
SELECTSUM(BUDGET)SUM_OF_BUDGETS
FROMPROJECT
例5.28计算每个项目中不同工种的数目
SELECTproject_no,COUNT(DISTINCTjob)job_count
FROMworks_on
groupbyproject_no
例5.29每个项目中有多少职员为其工作
SELECTproject_no,COUNT(*)emp_count
FROMworks_on
groupbyproject_no
例5.30获取招募的总人数少于4个的项目
SELECTproject_no
FROMworks_on
groupbyproject_no
havingcount(*)4
例5.31获取职员的名字和职员编号,以职员编号升序排列
SELECTemp_no,emp_fname,emp_lname
FROMemployee
ORDERBYemp_noasc;//desc表示降序,asc表示升序。
Groupby默认使用升序
5.32获取编号小于2000的职员所在的部门和其编号,并以姓和名升序排列
SELECTemp_fname,emp_lname,dept_no
FROMemployee
whereemp_no20000
ORDERBYemp_fname,emp_lname
5.33对于每个项目编号,取得其所有的项目编号以及职员数量,以职员数量降序排列。
SELECTproject_no,COUNT(*)emp_quantity
FROMworks_on
groupbyproject_no
ORDERBY2DESC
5.34获取属于部门D1或者参加项目的时间早于1998年1月1日的所有职员的编号,并以升序排列。
SELECTemp_noFROMemployeewheredept_no=d1
UNION
SELECTemp_noFROMworks_onWHEREenter_date01.01.1998
ORDERBY1
--建库与建表
/*Department(dept_no,dept_name,location)
Employee(emp_no,emp_fname,emp_lname,dept_no)
Project(project_no,project_name,budget)
Works_on(emp_no,project_no,job,enter_date)*/
CREATEDATABASEBranch
ONPRIMARY(
NAME=Branch,
FILENAME=D:
\Web信息系统2\database\branch.mdf,
SIZE=100MB,MAXSIZE=200,FILEGROWTH=20)
LOGON(
NAME=branchlog1,
FILENAME=D:
\Web信息系统2\database\branchlog.ldf,
SIZE=100MB,MAXSIZE=200,FILEGROWTH=20)
useBranch
go
CREATETABLEDepartment(
dept_namevarchar(50)NOTNULL,
dept_novarchar(8)NOTNULL,
locationvarchar(20),
CONSTRAINTprim_DepartmentPRIMARYKEY(dept_no),
)
CREATETABLEEmployee(
emp_fnamevarchar(50)NOTNULL,
emp_lnamevarchar(50)NOTNULL,
emp_novarchar(8)NOTNULL,
dept_novarchar(8)NOTNULL,
CONSTRAINTprim_EmployeePRIMARYKEY(emp_no),
CONSTRAINTforeign_DepartmentFOREIGNKEY(dept_no)REFERENCESDepartment(dept_no)
)
CREATETABLEProject(
project_namechar(50)NOTNULL,
project_nochar(8)NOTNULL,
citychar(20),
budgetfloat,
CONSTRAINTprim_ProjectPRIMARYKEY(project_no),
CONSTRAINTC_NAMECHECK(budget>=0)
篇二:
数据库查询操作详解
一、数据查询-----单表查询
(1)查询语句格式
Select[all|distinct]目标列表达式>[,目标列表达式>]?
?
From表名或视图>[,表名或视图>]?
?
[where条件表达式>]
[groupby列名1>[having条件表达式>]]
[orderby列名2>[asc|desc]];
注:
[all|distinct]中all为缺省值,取消结果中的重复列则用distinct;
[asc|desc]中asc为缺省值,表示按照升序排列。
对于空值,若按照升序排,则含空值的元组显示在最后面;若按降序排,则空值的元组最先显示。
(2)查询指定列
a)查询部门表dept中所有部门的详细信息,并且列名用汉字表示。
selectDNO,DNAME,ADDR
fromdept;
b)查询部门表dept中人力资源部的部门编号。
selectDNO
fromdept
whereDNAME=人力资源部;
目标列表达式>中各个列的先后顺序可以与表中的顺序不一致.
(3)查询全部列
查询全体学生的详细记录
Select*
FromStudent;
(4)将查询结果的列名用别名显示
查询部门表dept中所有部门的详细信息,并且列名用汉字表示。
selectDNO部门编号,DNAME部门名称,ADDR部门地址
fromdept;(5)在查询的结果中插入新的一列用来显示指定的内容
SelectSnameNAME,’YearofBirth:
’BIRTH,SbirthBIRTHDAY,SdeptDEPARTMENT
FromStuent;
则显示的结果中,每个元组的第二列均为”YearofBirth:
”,此列在原数据库中是不存在的.
(6)查询经过计算的值
Select子句的目标列表达式>不仅可以是表中的属性列,也可以是表达式。
例:
查询全体学生的姓名及其出生年月
SelectSname,2022–Sage/*当时年份减去年龄为出生年月
FromStufent;(7)设置查询显示的字母全为大写(或小写)
SelectSname,’YearofBirth:
’,2022–Sage,LOWER(Sdept)
FromStudent;
此时Sdept显示的结果全为小写
SelectSname,’YearofBirth:
’,2022–Sage,UPPER(Sdept)
FromStudent;
注:
要设置查询表中的属性列名的大小写可以用LOWER,UPPER。
(8)消除取值重复的行
a)查询雇员表empl中出现的所有部门编号,要求无重复。
selectdistinctDNO
fromEMPL;
b)查询项目表proj中所有项目名称。
selectPNAME
fromPROJ
等价于selectallPNAME
fromPROJ
(9)查询满足条件的元组
注:
Between后是范围的下限,and后是范围的上限.查询结果中包含上下限的结果.a)查询成绩不及格的学生的学号
SelectdistinctSno
FromSC
WhereGrade60;
b)查询年龄在20到30(包含20及30)之间的学生的姓名、系别和年龄
SelectSname,Sdept,Sage
FromStudent
WhereSagebetween20and30;
c)查询计算科学系(CS),数学系(MA),信息系(IS)学生的姓名和性别
SelectSname,Ssex
FromStudent
WhereSdeptin(‘CS’,’MA’,’IS’);(10)含通配符”%”的查询
%(百分号):
代表任意长度(长度可以为0)的字符串,例如a%b代表以a开头且以b结尾的任意长度的字符串,acb,afdsagasdsab,ab都满足。
例:
查询雇员表empl中姓名以“伟“字结尾的员工信息。
select*
fromEMPL
whereENAMElike%伟;(11)含通配符”_”的查询
_(下划线):
代表任意单个字符,例a_b代表以a开头且以b结尾的长度为3的字符串。
例:
查询姓“欧阳”且全名3个汉字的学生的姓名
SelectSname
FromStudent
WhereSnamelike‘欧阳__’;
注:
一个汉字占两个字符的位置(12)字符串本身含通配符的查询
使用使用escape‘换码字符>’。
查询以”DB_”开头,且倒数第三个字符为i的课程的详细情况。
Select*
FromStudent
WhereCnamelike‘DB\_%i__’escape‘\’;
注:
escape‘\’表示”\”为换码字符,则第一个”_”是普通的字符,后两个”_”表示通配符。
(13)涉及空值的查询
例:
查询所有有成绩的学生的学号
SelectSno
FromSC
WhereGradeISNULL;
注:
此处“IS”不能用”=”替代
(14)带排序的查询
查询工作表job中的工作信息,结果按工作天数升序排列。
select*
fromJOB
orderbyDAYSasc;
等价于
select*
fromJOB
orderbyDAYSasc;
查询雇员表empl中所有员工的详细信息,结果按员工姓名降序排列。
select*
fromEMPL
orderbyENAMEdesc;(15)含聚集函数的查询
聚集函数主要有:
Count([distinct|all]*)
Count([distinct|all]列名>)
Sum([distinct|all]列名>)
Avg([distinct|all]列名>)
Max([distinct|all]列名>)
Min([distinct|all]列名>)//统计元组个数//统计一列中值的个数//计算一列值的总和(此列必须是数值型)//计算一列值的平均值(此列必须是数值型)//求一列值中的最大值//求一列值中的最小值
注:
[distinct|all]缺省时为all.
在聚集函数遇到空值时,除count(*)外,都跳过空值而只处理非空值.
例:
查询1号课程的学生的最高分数
Selectmax(Grade)
FromSC
WhereCno=‘1’;(16)到GROUPBY子句的查询
a)求各个课程号及相应的选课人数
selectCno,count(Sno)
fromSC
groupbyCno;
b)查询选修了3们以以上的课程的学生的学号
selectSno
fromSC
croupbySno
havingcount(*)>3;
注:
where子句与having子句短语的区别在于作用对象不同。
Where子句作用于基本表或视图,从中选择满足条件的元组;having子句作用与组,从中选择满足条件的组。
二、数据查询-----连接查询
若一个查询同时设计两个以上的表,则称之为连接查询。
(1)等值与非等值连接查询
格式如下:
[表名1>.]列名1>比较运算符>[表名2>.]列名2>
其中主要的比较运算符有:
=,>,,>=,=,!
=(或>)等.
此外连接谓词还可以有如下的形式:
[表名1>.]列名1>between[表名2>.]列名2>and[表名2>.]列名2>
当连接运算符为=时,称为等值连接,否则称为非等值连接。
注:
当属性列在查询的所有表中是唯一的时候则可以去掉前面的表名,否则必须加上表名。
例:
查询每个学生及其选修课程的情况.
SelectStudent.*,SC.*
FromStudent,SC
WhereStudent.Sno=SC.Sno;
(2)自身连接
例:
查询每一门课程的间接先修课(即先修课的先修课)
分析:
此时为Course表的自身连接,故要为Course表去两个别名,一个是first,一个是second。
Selectfirst.Cno,second.Cno
FromCoursefirst,Coursesecond
Wherefirst.Cpno=second.Cno;
(3)外连接
在上例中,没有显示202215123和202215125两个学生的信息,原因在于他们没有选课。
有时想以Student表为主体列出每个学生的基本情况及其选课情况,则需要使用外连接。
用外连接做上面的例题:
SelectStudent.Sno,Sname,Ssex,Sage,Sdept,Cno,Cgrade
FromStudentLEFTJOINSCON(Student.Sno=Sc.Sno);
/*也可以用USING来去掉上面结果中的重复值:
FromStudentLEFTJOINSCUSING(Sno);*/
注:
做链