数据库基础学习三 1. 更改列标题(重命名)——目的:隐藏表中字段名称,增加可读性 2. 去除重复值(distinct:取消重复的数据值;注意放置位置) 3. limit(注意关键字放置位置


目标

  • 数据的简单查询操作(select)
    • 选择数据列(所有列、部分列)
    • 改变列标题
    • 选择数据行
      • 去重
      • 返回指定的记录数
      • 比较运算符应用
      • 逻辑运算符应用
      • in子句
      • between子句
      • like子句
      • 空值与非空值
    • 排序
    • 聚合函数
    • 合并
  • 不同的插入数据
    • insert … select
    • create … select

一、数据的简单查询

    select  *  from  表名  where  主键字段名=;
    #在查询语句中,*代表的是表中所有字段,开发慎用(一般用在数据详		 
    细信息页面呈现所有数据)
    select  字段1,字段2,字段3,... from 表名
1. 更改列标题(重命名)——目的:隐藏表中字段名称,增加可读性

更改列标题方法:

a、oldName  as  newName   #建议使用此种方式
 b、		oldName  空格  newName
select cNo as '编号',cName '课程名称' from courses;

在这里插入图片描述
提问:

#教务处希望统计同学们选修了哪些课程?–具体的课程名称
/*分析:
1、执行的动作是查询----select
2、同学们选修了课程名称----课程必须在eLogs表中出现(课程编号)
3、通过第二步检索的课程编号作为条件值,再在Courses信息表中去查询对应课程名称
*/

在这里插入图片描述
在这里插入图片描述
将上边图中的“select cID from eLogs”替换另一条SQL语句中的“‘00001’,‘00002’,‘00002’”,得到如下:

在这里插入图片描述
上述操作涉及到子查询技术。

2. 去除重复值(distinct:取消重复的数据值;注意放置位置)

在这里插入图片描述

比较上边两图的区别!!!

#下边的语句是针对多个字段值组合来去重

select  distinct  cNo,cName  from Courses;
3. limit(注意关键字放置位置,可实现排行榜/分页效果)
#课程信息表中第一门课程信息
select  *  from Courses  limit 1;

#查询课程信息表中课程名称以字母I开头的第一门课程信息(模糊查询:%--0个或多个任意字符)
select * from Courses  where  cName like 'I%'  limit 1;

#limit还有其他用法:两个数据在后边
select  *  from Courses  limit 1,1;

#使用limit的语法:select * from 表名 [where 条件表达式] limit [m,]n;

#如果limit后边只有一个数字n,表示在满足条件的结果集内,返回前n条数据
#如果limit后边有两个数字,分别是m,n,表示在满足条件的结果集内,从序号为m(第m+1条数据)开始返回n条数据
#序号等同于索引,起始值是0

注意:limit常与排序技术(order by 字段名 desc/asc)一起使用!!!

select  *  from  eLogs  order  by  elNo  desc  limit  2;
#将选修记录信息表中数据按照elNo字段的值由大到小(降序)排序,返回前两条数据

得到结果是:在这里插入图片描述

4. in/not in----值列表(一个字段对应多个数据值)

in运算符允许确定一个指定字段的值是否在给定列表或子查询中。

#查询学号为20180101,20180102的两位同学的姓名
select  sName  from  students  where sNo  in('20180001','20180002');
#列表中的值必须用逗号(,)分隔
#上句还可借助逻辑或(or)实现同样效果:
select  sName  from  students  where sNo='20180001' or sNo='20180002';

可以使用not in来确定不匹配列表或子查询的任何值。

select * from students where sNo not in('20180001','20180002');

上句表示学号不为20180101,20180102的学生信息。

5. between…and…/not between…and…

between…and…判断某字段值是否在给定的范围内。

#查询在2019年1月1日至2019年3月31日进行选修课登记的同学有多少人?

select  count(*)  from  eLogs  where elDate between  '2019-1-1' and '2019-03-31';
#上边语句还可写成:
select  count(*)  from  eLogs  where elDate >='2019-1-1' and elDate <='2019-03-31';

#也就是说:between…and…包含边界值!!!

再应用多一些技术(去重、列重命名):
select  COUNT(distinct sID) as '人数'  from  eLogs  where elDate between  '2019-1-1' and '2019-03-31';
6、聚合函数/集合函数

#count()、 sum()、 avg()、 max()、 min()
#求数目 求总和 求平均值 求最大值 求最小值

示例:

select  COUNT(*),COUNT(1),COUNT(elNo),AVG(elScore),SUM(elScore),MAX(elScore),MIN(elScore)  from   eLogs;

执行,结果如下图:
在这里插入图片描述
原有表中数据如下所示:在这里插入图片描述

注意:统计表中复合条件的信息数量(多少条记录)常用:
count(*)、count(主键字段)、count(1)

聚合函数返回值均为一个统计结果;如果表中没有符合条件的数据,其返回值为0

select count(),elNo from eLogs;#不允许如此使用
上边语句count(
)返回一个统计结果,但elNo会返回表中所有选修记录的编号,但是实际结果如下图:(三条数据,但编号只有1个信息)

在这里插入图片描述

7. 结果集合并(union)

执行如下语句,会产生两个结果集:

select elNo from eLogs;
select elScore from eLogs;

现在使用union将上边两个结果集进行合并

现在使用union将上边两个结果集进行合并

#使用union的时候,会自动去除结果集内的重复值;如果业务无需去除重复行,则增加all,呈现原有结果集内容,且保证性能

select  elNo  from  eLogs
union  all
select  elScore  from  eLogs;

注意: SELECT 语句必须拥有相同数量的列,列也必须拥有相似的数据类型

  • 注意:上述where子句的应用在update、delete的操作中也可用!
    • 补充:
      • 比较运算符:=、>、<、>=、<=、<>,!=
      • 逻辑运算符:and、or、!/not
      • 算术运算符:+、-、*、/、%

二、补充点内容

1. 补充:级联操作

如果希望对主表数据进行修改、删除时,同时影响从表数据进行相应操作,这时候,就要用到级联操作。

	#首先对上边构建的TB表进行删除
	drop  table  TB;
	
	#再重新创建从表TB,并对外建字段设置级联操作
	create  table TB(
	   b int primary key,
	   bb int,
	   constraint fk_bb_a foreign key(bb) references TA(a) on delete cascade on update cascade
	   #级联操作在外键约束后面添加
	#on delete cascade:在删除父表中的数据的时候,级联删除子表中的数据;
	#on update cascade:在更新父表中的数据时候,级联更新子表中的数据;
	#级联删除与级联更新可组合设置,也可单独设置,根据业务需要安排
	);
	#再添加数据
	insert into TB values(1,1);

如此,只需要执行如下语句,主表、从表相应数据均会直接删除;更新操作一样。

delete  from  TA  where  a=1;update  TA  set  a=2  where  a=1;
2. 补充:数据值存在英文单引号的解决办法
#演示对表数据进行添加、修改操作的时候,数据值存在英文单引号的解决办法

#法一:使用转义字符"\" 
update  courses  set cName='I\'m' where cNo='00001';

#法二:一个单引号写成两个单引号
update  courses  set cName='I''am' where cNo='00002';

#查看数据
select * from courses;

3. 不一样的数据插入

有时根据业务需要,需要进行类似复制表的操作;此处讲解两种方式。
A、insert…select…

首先,参照课程信息表的编号字段构建一表T,只有一字段a(char(5))

create  table t(
  a CHAR(5)
);

#将courses中的cNo的值拷贝到表t字段a中

insert  into  t(a)  select  cNo from  courses;
#通过数据查询确认操作是否成功
select  *  from  courses;
select  *  from  t

#整理语法:insert into 表名(字段列表) select 字段列表 from 表名;

#注意:两处字段列表数量须一致,且数据类型能兼容

B、create…select…
上边的操作须先创建表,再进行数据的复制;接下来就根据指定表指定字段进行结构拷贝的同时,复制数据

create  table  newT  select  cNo  from  courses;
#通过数据查询确认操作是否成功
select  *  from newT;

#整理语法:create table 表名 select 字段列表 from 表名;

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值