实验5.MySQL数据库表数据的查询操作实验
1、实验目的
掌握SELECT语句的基本语法格式。
掌握SELECT语句的执行方法。
掌握SELECT语句的GROUPBY和ORDERBY子句的作用。
2、实验内容
在公司的部门员工管理数据库的bumen表和yuangong表上进行信息查询。bumen表和yuangong表的定义如:
#创建数据库chapter05
createdatabasechapter05;
#使用数据库chapter05
USEchapter05;
#创建bumen表
CREATETABLEbumen(
d_idINT(4)NOTNULL,
d_nameVARCHAR(20)NOTNULL,
functionVARCHAR(20)NULL,
addressVARCHAR(30)NULL,
PRIMARYKEY(d_id));
#查看bumen表结构
descbumen;
#创建yuangong表
CREATETABLEyuangong(
idINT(4)NOTNULL,
nameVARCHAR(20)NOTNULL,
sexVARCHAR(4)NOTNULL,
birthdayINT(4)NULL,
d_idVARCHAR(20)NOTNULL,
salaryFloatNULL,
addressVARCHAR(50)NULL,
PRIMARYKEY(id));
#查看yuangong表结构
descyuangong;
#在bumen表和yuangong表插入记录。
insertintobumenvalues(,人事部,人事管理,北京);
insertintobumenvalues(,科研部,研发产品,北京);
insertintobumenvalues(,生产部,产品生产,天津);
insertintobumenvalues(,销售部,产品销售,上海);
insertintoyuangongvalues(,韩鹏,男,25,,,北京市海淀区);
insertintoyuangongvalues(,张峰,男,26,,,北京市昌平区);
insertintoyuangongvalues(,欧阳,男,20,,,湖南省永州市);
insertintoyuangongvalues(,王武,男,30,,,北京市顺义区);
insertintoyuangongvalues(,欧阳宝贝,女,21,,,北京市昌平区);
insertintoyuangongvalues(,呼延,man,28,,,天津市南开区);
然后在bumen表和yuangong表查询记录。
(1)查询yuangong表的所有记录。SQL代码:
select*fromyuangong;
或者列出yuangong表的所有字段名称。SQL代码:
selectid,name,sex,birthday,d_id,salary,addressfromyuangong;
(2)查询yuangong表的第四条到第五条记录。
selectid,name,sex,birthday,d_id,salary,addressfromyuangonglimit3,2;
(3)从bumen表查询部门号(d_id)、部门名称(d_name)和部门职能(function)。SQL代码:
selectd_id,d_name,functionfrombumen;
(4)从yuangong表中查询人事部和科研部的员工的信息。先从bumen表查询出人事部和科研部的部门号。然后到yuangong表中去查询员工的信息。SQL代码:
select*fromyuangong
whered_id=any(
selectd_idfrombumen
whered_namein(人事部,科研部));
或者使用下面的代码。代码如下:
select*fromyuangong
whered_idin(
selectd_idfrombumen
whered_name=人事部ord_name=科研部);
(5)从yuangong表中查询年龄在25到30之间的员工的信息。可以通过两种方式来查询。
第一种方式的SQL代码:
select*fromyuangongwherebirthdaybetween25and30;
第二种方式的SQL代码:
select*fromyuangongwherebirthday=25andbirthday=30;
(6)查询每个部门有多少员工。先按部门号进行分组,然后用COUNT()函数来计算每组的人数。SQL代码:
selectd_id,count(id)fromyuangonggroupbyd_id;
或者给COUNT(id)取名为sum。其SQL代码为:
selectd_id,count(id)assumfromyuangonggroupbyd_id;
(7)查询每个部门的最高工资。先按部门号进行分组,然后用MAX()函数来计算最大值。SQL代码:
selectd_id,max(salary)fromyuangonggroupbyd_id;
(8)用左连接的方式查询bumen表和yuangong表。
使用LEFTJOINON来实现左连接。SQL代码:
selectbumen.d_id,d_name,function,bumen.address,id,name,birthday,sex,salary,yuangong.address
frombumenleftjoinyuangongonyuangong.d_id=bumen.d_id;
(9)计算每个部门的总工资。先按部门号进行分组,然后用SUM()函数来求和。SQL代码:
selectd_id,sum(salary)fromyuangonggroupbyd_id;
(10)查询yuangong表,按照工资从高到低的顺序排列。SQL代码:
select*fromyuangongorderbysalarydesc;
(11)查询家是北京市员工的姓名、年龄、家庭住址。这里使用LIKE关键字。SQL代码:
selectname,birthday,addressfromyuangongwhereaddresslike北京%;
3、观察与思考
(1)、LIKE的通配符有哪些?分别代表什么含义?
%(百分号):代表任意长度(长度可以为0)的字符串。
_(下横线):代表任意单个字符。
(2)、知道学生的出生日期,如何求出其年龄?
float(datadiff(year,birthday,getdata())/.25)
birthday=’xxxx-xx-xx’
getdata()=’xxxx-xx-xx’
(3)、IS能用“=”来代替吗?如何周全地考虑“空数据”的情况?
不能。该属性应该有一个值,但不知道具体值;该属性不应该有值;由于某种原因不便于填写。
(4)、关键字ALL和DISTINCT有什么不同的含义?关键字ALL是否可以省略不写?
all:返回所有的记录;distinct:去掉查询返回的记录中重复的记录。
all在select子句里省略,对结果无影响,在union子句里省略则表示剔除有重复的行,反之则保留所有记录行。
(5)、聚集函数能否直接使用在SELECT子句、HAVING子句、WHERE子句、GROUPBY子句中?
聚集函数只能用于select子句,groupby中的having子句,where子句是一个条件语句,在where后面跟的是条件。
6、WHERE子句与HAVING子句有何不同?
作用对象不同:where子句作用于基本表或视图,从中选择满足条件的元祖,having子句作用于组,从中选择满足条件的组。
7、count(*)、count(列名)、count(distinct列名)三者的区别是什么?通过一个实例说明。
count(*):明确的返回数据表中的元组数据个数,不会忽略值为null的字段
count(列名):返回数据表中的某列数据个数,不统计值为null的字段
count(disinct列名):返回数据表中某列不重复的数据个数,不统计值为null的字段
selectcount(distinctd_id)fromyuangong;
selectcount(d_id)fromyuangong;
selectcount(*)fromyuangong;
8、内连接与外连接有什么区别?
内连接:比较运算符根据每个表共有的列的值匹配两个表中的行(使用像=或之类的比较运算符)
外连接:当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值(使用left/right/fulljoin或left/right/fullouterjoin关键字)
9、“=”与IN在什么情况下作用相同?
当in的候选值只有一个时。