MySQL 数据库基础学习
目标
- 数据的简单查询操作(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 表名;