一、课程介绍
《数据库的原理和应用》是一个前导课程,也是一个基础课程。是《应用程序开发》类的课程的基础课程。
二、数据库产品介绍
目前主流的数据库有:
Oracle(美国甲骨文公司),大中型应用程序。(java+Oracle)
SQL Server(美国微软公司),.NET应用程序。(C#+SQL Server)
MySQL(美国甲骨文公司),中小型网站。(Java+MySQL,PHP+MySQL)
三、MySQL基础
1、创建数据库
数据库是一个容器,里面有表、视图、存储过程等。
格式:create database <数据库名>;
查看数据库:show databases;
使用数据库:use <数据库名>;
2、创建表
表是用来存储数据,表是数据库中最重要的一个对象。
格式:create table <表名>(
<字段名> <字段类型>(宽度) ,
...
);
auto_increment:
auto_increment表示自增,即自动编号,只有整型字段才可以设置,一个表只能有一个自增字段。
示例:
create table product(
id int auto_increment primary key, --auto_increment表示自增,primary key表示主键。
name varchar(50),
price float,
image varchar(255)
);
查看表结构:
desc <表名>
查看表数据(查询):
select * from <表名>
插入数据:
insert into <表名>(<字段名1>,<字段名2>,...) values(<值1>,<值2>,...)
一、查询语句(select)
1、基本格式:select <字段列表> from <表名>
说明:
*表示所有字段。
如果查部分字段,需要指定,字段间用逗号隔开。
指定标题使用as,如:select id as '编号', name as '名称' from product;
去重的关键字:distinct
例如:select distinct teamid from player where chinesename like '%杰克逊%'
2、条件子句where
格式:where <条件>
说明:条件是一个逻辑表达式。
(1)比较运算符:> < >= <= !=
(2)逻辑运算符:not and or
(3)范围运算符:<字段> between <值1> and <值2>
(4)in运算符:<字段> in (<值1>,<值2>,...)
(5)like运算符:like '含通配符的字符串',主要作模糊查询
mysql的通配符:
%表示任意个字符(0~n)
_表示任意1个字符(0~1)
[]表示范围
(6)is null运算符:<字段> is [not] null
3、排序子句
格式:order by <字段> [desc | asc]
说明: desc表示降序(值由大到小),asc表示升序(值由小到大),默认为升序。
4、limit子句
格式:limit([偏移量],<记录个数>)
说明:如果省略偏移量,则表示从第1条开始取,
如:limit 10 --从开始取前10条。
如:limit 20,10 --则表示从第20+1条开始取10条,即(21~30)。
5、分组子句
格式:group by <字段> [having <条件>]
说明:having <条件>表示限定分组,即对分组后的结果进行筛选。
聚合函数(统计函数):
count(<字段>):记录个数
sum(<数值字段>):求和
avg(<数值字段>):求平均值
max(<数值字段>):求最大值
min(<数值字段>):求最小值
6、多表的连接查询
(1)全连接查询
格式:select <字段列表> from <表1>,<表2> where <表1>.<连接字段>=<表2>.<连接字段>
功能:从多张表查询数据
(2)join连接
a、内连接
格式:select <字段列表> from <表1> t1 inner join <表2> t2 on <表1>.<连接字段>=<表2>.<连接字段>
说明:格式中t1和t2分别表示表1和表2的别名;inner join也简写为join。
b、外连接
左外连接
格式:select <字段列表> from <表1>left join <表2> on <表1>.<连接字段>=<表2>.<连接字段>
说明:左表中所有的记录都显示
右外连接
格式:select <字段列表> from <表1>right join <表2> on <表1>.<连接字段>=<表2>.<连接字段>
说明:右表中所有的记录都显示
c、交叉连接
格式:select <字段列表> from <表1>cross join <表2>
7、子查询
概念:子查询就是一个SQL语句中嵌套的一个select语句。
(1)比较子查询
格式:select <字段列表> from <表名> where <字段> <比较运算符> <子查询>
说明:此时子查询的结果必须是单值。
举例:查询身高最高的球员的中文名和身高。
查询超过平均身高的球员的中文名和身高。
(2)in子查询
格式:select <字段列表> from <表名> where <字段> in <子查询>
说明:该子查询结果应是一个单列的结果集。
(3)exists子查询
格式:select <字段列表> from <表名> where exists <子查询>
二、数据库的基本操作:增、删、改
1、增(insert)
格式:insert | replace into <表名>[(<字段列表>)] values(<值列表>)
说明:
replace into :表示如果有该主键的记录,则进行替换;没有的话,则和insert into相同,插入新的一条。
如果一次要插入多行,则数据行之间用","分隔。
2、删(delete)
格式:delete from <表名> where <条件>
说明:还可以加上order by 子句和limit子句
举例:delete from score order by maths limit 3; --删除成绩表中数学成绩最低的3行记录。
3、改(update)
格式:update <表名> set <字段1>=<值1>,...where <条件>
说明:可以加上order by 子句和limit子句
三、约束(constraint)
1、主键约束(Primary Key)
主键是用来唯一地表示一个实体,为了防止出现重复的记录。
一个表只能有一个主键。
例如:学生(学号,姓名,……)
(1)在创建表时候创建主键约束
create table <表名>(
<字段1> <类型1> primary key, --列的完整性约束
<字段2> <类型2> ,
...
)
create table <表名>(
<字段1> <类型1>
<字段2> <类型2> ,
primay key(<字段1>) --表的完整性约束
)
(2)在表创建后添加主键约束
alter table <表名> add primary key(<字段名>)
2、唯一约束(unique)
限制某个字段不要出现重复值
(1)在创建表时候创建唯一约束
create table <表名>(
<字段1> <类型1> unique, --列的完整性约束
<字段2> <类型2> ,
...
)
create table <表名>(
<字段1> <类型1>
<字段2> <类型2> ,
unique(<字段1>) --表的完整性约束
)
(2)在表创建后添加唯一约束
alter table <表名> add unique(<字段名>)
3、检查约束(check)
设置某个字段取值范围。
(1)在创建表时候创建检查约束
create table <表名>(
<字段1> <类型1> check(<条件>), --列的完整性约束
<字段2> <类型2> ,
...
)
(2)在表创建后添加检查约束
alter table <表名> add check(<条件>)
MySQL的存储引擎均能对check子句进行分析,但会忽略check子句,即check子句约束还不起作用。
4、外键约束(参照完整性约束Foreign key)
外键不是当前表的主键,是别的表的主键。
外键一定要取自于父表的主键。
(1)在创建表的时候定义外键约束
create table <表名>(
<字段1> <类型1> ,
<字段2> <类型2> ,
foreign key(<外键字段>) references <父表>(<主键字段>) --表的完整性约束
)
说明:外键的定义应放在所有字段定义的后面,不能放在某列的定义里面
(2)在表创建后添加外键约束
alter table <表名> add foreign key(<外键字段>) references <父表>(<主键字段>)
说明:
在外键的定义的最后可加上以下几种选项:
on update cascade --级联更新,即更新了父表的主键值,子表中对应的外键值也会随之更新。
on delete cascade --级联删除,即删除了父表中某主键对应的记录,那么子表中外键值和主键相同的记录也会随之删除。
on update ristrict --禁止更新,即如果父表中有和外键值相同的主键值,则禁止修改此外键值
on delete ristrict --禁止删除,即如果父表中有和外键值相同的主键值,则禁止删除该记录
5、默认值
default <值>
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
作业:
(一)导入数据
(1)下载study.sql文件。
链接: https://pan.baidu.com/s/1aAYSHZ-C32DsaLG3PeSJNw
提取码: wj5x
(2)将study.sql脚本文件复制到p盘。
(3)登录mysql服务器,进入mysql提示符状态。
提示:
(a)通过navicat修改root密码为123456
(b)找到mysql命令所在位置,如:C:\Program Files\MySQL\MySQL Server 5.7\bin,在此窗口空白处按下shift键的同时右键,选择“在此处打开命令窗口”,进入windows命令行。
(c)在windows命令行状态,输入:mysql -h localhost -P 3308 -u root -p123456
说明:因为机房修改了mysql的端口号为3308,如果采用默认端口3306,登录本机的话,只需要指定用户名和密码即可登录 ,即:mysql -u root -p123456
(4)mysql>create database study;
(5)mysql>use study;
(6)mysql>source p:/study.sql;
(7)mysql>show tables;
(8)mysql>select * from player;
(二)完成以下查询并截图
(1)查询身高(height)220以上的球员的编号(id),姓名(chinesename),身高(height)信息。
(2)使用between..and..运算符查询球龄(playAge)10~15之间(含10和15)的球员的编号(id),姓名(chinesename),球龄(playAge)信息。
(3)查询位置(position)是'中锋'的球员的编号(id),姓名(chinesename),位置(position)信息。
(4)使用in运算符查询球队编号(teamid)为13或15或17的球队的球员的编号(id),姓名(chinesename),球队编号(teamid)信息。
(5)从player表中查询中文姓名以"杰克逊"结尾的所有球员的编号(id),姓名(chinesename),英文名(englishname)。
(6)从player表查询英文名为"Chris Paul"的球员的编号(id),姓名(chinesename),英文名(englishname)。
(7)从player表中查询中文姓名含"詹姆斯"的所有球员的编号(id),姓名(chinesename),英文名(englishname)。
(8)如果以20条记录为1页对所有球员的记录进行分页,请查询第11页的球员的编号(id),姓名(chinesename),英文名(englishname)。
-------分组查询--------
(9)查询身高(height)由高到低的前10位球员的编号(id),姓名(chinesename),身高(height)信息。
(10)从球员表player中查询全联盟现役球员的年龄age最大值和最小的值。
(11)从球员表player中查询全联盟现役球员的平均身高。
(12)分别统计每个球队的球员数,结果字段有球队编号teamid和球员数。
(13)统计球员数大于或等于20的球队编号teamid和球员数。
------多表的连接查询-----
数据准备:
提示:先使用use study;切换数据库
(a)向球队表team中添加一支球队
insert into team(id,name) values(31,'啦啦队');
(b)向球员表player中添加一名球员
insert into player(id,chinesename) values(540,'周琦');
(c)分别对两表进行全连接、内连接、左外连接、右外连接和交叉连接查询,只查球员编号id,球员中文名chinesename和球队名name,并提交相应的结果截图(共5张)。
--------子查询---------
(1)查询球员中文名chinesename含“杰克逊”的球队的队名name。
(2)查询身高height最高的球员所在的球队的球队编号id和球队名称name。
(3)查询身高height高于全联盟平均身高的球员的球员编号id,球员中文名chinesename和身高height。
--------增、删、改-------
创建数据库和表:
(a)数据库sanguo
(b)国家表country
(c)武将表person
(d)添加记录
(e)删除姓名为空的记录
(f)将“关云长”的姓名改成“关羽”。
-----------约束-------------
(1)创建数据库:school
(2)创建班级表bj,班级编号cid作主键约束且自动编号, 班级名cname作唯一约束
(3)创建学生表xs,学生编号sid作主键约束且自动编号,学生姓名sname字符串,学生的年龄sage整型作检查约束,取值范围(10-99),班级编号cid作外键约束参照班级表的班级编号
(4)输入记录
班级表bj
学生表xs