数据库(database)是一个按照结构来组织存储和管理数据的仓库一般由软件,数据库和管理员组成。
数据模型:数据库由层次,网状,关系,面向对象,NOSQL五个模型组成
数据库系统:一般由软件,数据库和管理员组成。
当前主流的数据库:
MySQL,Oracle,SQL Server,PostgreSQL,MongoDB,Redis当前使用较多是MySQL,版 本为5.7 MySQL的特点:运行速度快,易用性,SQL支持,功能性,连接性与安全性,可移植性可用性和成本,公开发行和源代码。 启动服务并登录MySQL数据库,启动:
1.在windows运行对话框中输入cmd命令打开操作界面,输入net start mysql57回车启动mysql 输入net stop mysql57回车关闭mysql 。
2.使用windows服务管理器进行管理。 第一种:点击开始,找到控制面板,找到管理工具 点击服务,进入服务管理器 第二种:在运行中输入services.msc直接打开服务管理器在服务管理器中找到MySQL服务名称,双击打开属性对 话框,在对话框进行启动,停止,暂停,恢复操作
登录:
1.在windows命令行窗口界面,输入mysql -h hostname -u username - p,链接MySQL,然后输入mysql -h localhost -u root -p登录, mysql为登录命令,-h后的参数是服务器的主机地址,在同一机器上可以输入, localhost或ip地址127.0.0.1,如需访问远程服务器,则需输入对方ip地址访问,-u后为登录数据库的用户名,目前直接出root用户,所以后面直接跟root,-p后是用户登录密码 2.在开始中所有程序中找到MySQL,打开MySQL Server5.7的开MySQL Command line Client即可。 使用MySQL数据库的第一步。
建立数据库:
1.在命令行输入:information_schema此数据库提供了访问数据库元数据的方式 元数据是关于数据的数据,如database name或table name,列的数据类型或访问权限等,有些时候表述数据词典和系统目录。
2.performance_schema此数据库为数据库性能优化提供重要的参考信
3.MYSQL该数据库也是核心数据
4.Sys这个是MYSQL在5.7版本之后才有的数据库
5.SAKLIA,MYSQL提供的示例数据库
1.主要内容:
(1):定义:实体就是数据库中所要表示的客观世界中存在的事物。
(2):约束是作用于数据表中列上的规则,用于限制表中数据的类型来得证是数据库中的精确与可靠性有序的表级分类。
(3):实体完整性将定义为特定表的唯一实体,实体完整性在表中的约束体现为:主键(primary key)约束,唯一(unique)约束。
(3.1):primary key:主键是表中一列或多列数据,用来唯一标识一行数据。
(3.2):unique:可以用来确保在非主键列中不存在重复值,列值可以为null。
(4):域完整性的约束:外键(foreign key)约束,默认值(Default)约束,非空(not null)约束。
(4.1):foreign key:一个表中的foreign key 指向另一个表中的主键。
(4.2):default:用于向列中插入默认值。
(4.3):not null :用于强制该列不许为null.
2.主键与外键
一般而言,一个实体不能既无主键又无外键。在E—R图中,处于叶子部位的实体,可以定义主键,也可以不定义主键(因为它无子孙),但必须要有外键(因为它有父亲)。
主键与外键的设计,在全局数据库的设计中,占有重要地位。当全局数据库的设计完成以后,有个美国数据库设计专家说:“键,到处都是键,除了键之外,什么也没有”,这就是他的数据库设计经验之谈,也反映了他对信息系统核心(数据模型)的高度抽象思想。因为:主键是实体的高度抽象,主键与外键的配对,表示实体之间的连接。
(1):使用主键约束:
<1>:公式:列名数据类型 primary key[默认值] 定义年级表,主键为id; 示例:create table grade ( id int(11) primary key,-- 年级编号主键。 GradeName VARCHAR(20);--年级名称 Major varchar(20)-- 所属专业 ); 2:[CONSTRAINT 约束名]PRIMARY KEY(列名); 3:PRIMARY KEY([列名1,列名2,列名3,.....N]) <2>:在定义完所有列时设置主键:: 定义年级表,主键为id: 示例:create table grade ( id int(11) ,-- 年级编号 Major varchar(20),-- 所属专业 primary key(id) ); <3>:设置多个字段为主键 示例:定义学生表studentinfo,假设表中没有主键id,为了确定一个学生唯一,可以把name(姓名)和studentno(身份证号)作为联合主键: create table studentinfo( name varchar(10),-- 学生姓名 studentno varchar(18),-- 身份证号 age int(4),-- 学生年 classid int(4),--学生所在班级的学生编号 primary key(name,studentno) -- 设置联合主键 );
*注意:varchar必须定义长度。***
(2):设置字段为自动增长:auto_increment,
<1>:一个表中只能有一个字段使用auto_increment. <2>:auto_increment必须主键的一个部分,不可单独使用。 <3>:auto_increment字段数据类型必须为整数类型。
(2.1):语法:列名数据类型 auto_increment primary key。
定义年级表,主键为id; 示例:create table grade ( id int(11) primary key auto_primary key,-- 年级编号主键。 Major varchar(20)-- 所属专业 );
(3):使用外键约束:包括主表(父表)和从表(子表);
(3.1):语法:[constraint 外键名] foreign key 字段名1[,字段名2,....]
references 主表名主键列1[,主键2,....]
示例:创建班级表和年级表, 让其建立主外键关系,让class表中的classid列值关联到grade表中的主键gid. create table grade( gid int(11) auto_increment primary key -- 年级id自增主键 major varchar(30), -- 专业名称 gradename int(4)-- 年级名称 ); create table class( id int(11) auto_increment primary key -- 班级id自增主键 classid int(4),--学生所在班级的学生编号 major varchar(30), -- 专业名称 foreign key (classid) references grade(gid) -- 关联);
(4):使用非空约束:
语法:字段名称类型 not null
示例: create table grade(
gid int(11) auto_increment primary key -- 年级id自增主键 major varchar(30) not null, -- 专业名称 不为空。 gradename int(4)-- 年级名称 );
(5):使用默认约束:
语法:字段名数据类型 default 默认值
示例:
create table grade( gid int(11) auto_increment primary key -- 年级id自增主键 major varchar(30) not null, -- 专业名称 不为空。 gender varchar(2) default '男');
(6):使用唯一约束:
语法:字段数据类型 unique.
示例:
create table grade( gid int(11) auto_increment primary key -- 年级id自增主键 major varchar(30) not null, -- 专业名称 不为空。 gradename int(4),-- 年级名称 StudentNO varchar(18)not null UNIQUE;----学员唯一 );
(7):E-R图:
主要内容:E-R图也称实体-联系图,是一种提供了表示实体类型、属性和联系的方法,用来描述现实世界的概念模型。它是描述现实世界关系概念模型的有效方法。是表示概念关系模型的一种方式。通俗点讲就是,当我们理解了实际问题的需求之后,需要用一种方法来表示这种需求,概念模型就是用来描述这种需求。
1.实体
实际问题中客观存在的并且可以相互区别的事物称为实体。实体是现实世界中的对象,可以具体到人,事,物。可以是学生,教师,图书馆的书籍。
2.属性
实体所具有的某一个特性称为属性,在E-R图中属性用来描述实体。比如:可以用“姓名”“姓名”“出生日期”来描述人。
3.联系
世界上任何事物都不是孤立存在的,事物内部和事物之间都有联系的,实体之间的联系通常有3种类型:一对一联系,一对多联系,多对多联系。
(8):数据库设置的步骤
(1)了解功能需求
在设计数据库之前,设计人员必须要先了解系统的功能需求。这里可以通过阅读产品需求规格说明书,与项目相关人员(比如项目经理、客户等)进行充分沟通。
(2)定义实体
了解系统功能需求之后,设计人员通过分析系统功能定义出系统有哪些实体。比如:到酒店开房。这里应该至少包含两个实体:客人和房间。
在定义出实体以后,我们还要定义实体的属性。例如:
客人:姓名、性别、手机号码、证件号码、证件类型(身份证、驾驶证、通行证等等)…
房间:房号、房间类型(单人房、双人房、豪华房等等)、入住时间、离开时间、房间状态(已入住、未入住)…
(3)绘制E-R图
定义好实体之后,接下来我们应该根据实体以及实体之间的关系绘制出E-R图。
长方形代表实体,椭圆形代表实体的属性,菱形代表实体之间的关系。
(4)把E-R图转换成模型
绘制出E-R图之后,我们需要根据它来构建物理模型。构建物理模型可以使用一些工具,比如目前比较流行的PowerDesigner。
(5)检查模型
完成模型设计后,我们还要检查模型是否满足第三范式的要求。如果不满足就需要重新对模型进行修正,直到满足第三范式的要求为止。
比如说,上面的模型并没有满足第三范式的要求。因为customer和room这两个表都存在一些与该表没有直接关系的字段。如果要满足第三范式要求,就需要把模型修改为:
上面模型增加了三个表,分别是identity_type(证件类型表)、register(入住登记表)、room_type(房间类型表),经过对模型的修正后,已经满足第三范式的要求。
(5)根据模型定义数据库
不同数据库的SQL命令可能会有小小差别。比如我们这里使用了MySQL数据库。
定义数据库的命令:DDL
3.2.1表达式
在数据库中的表达式一般由常量、变量、函数和运算符组成。单个常量、变量和函数亦可称作表达式。
SQL语句中包括三中表达式:
<表名>后跟<字段名表达式>;
SELECT语句后的<目标表达式>;
WHERE语句后的<条件表达式>。
3.2.2比较运算符
运算符 | 含义 |
---|---|
> | 大于 |
>= | 大于等于 |
< | 小于 |
<= | 小于等于 |
= | 等于 |
!=或<> | 不等于 |
IS NULL | 是否为空 |
IS NOT NULL | 是否不为空 |
IN | 判断一个值是IN列表中的任意一个值 |
NOT IN | 判断一个值不是IN列表中的任意一个值 |
LIKE | 通配符匹配 |
BETWEEN AND | 判断一个值是否在两个值之间 |
3.2.3逻辑运算符
AND(或者&&)、OR(或者||)、NOT(或者!)
3.3.1 插入一条数据
语法:insert into 表名(字段名1,字段名2,字段名3.......)values(值1,值2,值3......);
例子:insert into studentinfo (stuname,age,gender)values('张三',18,'男');
3.3.2插入多条数据:
语法:insert into 表名(字段名1,字段名2,字段名3.......)
values(值1,值2,值3........),
(值1,值2,值3........),
(值1,值2,值3........);
例子:insert into studentinfo (stuname,age,gender)
values('张三',18,'男'),
('李四',17,'男'),
('王五',19,'男');
注意:
添加记录但不指定所有字段值及字段时,该字段必须是允许为空。
主键列、唯一约束列的值不能重复。
值与字段名必须一一匹配,但可以不按照表中字段顺序指定。
语法:update 表名 set 字段名1=新值,字段名2=新值 [WHERE条件表达式];
3.4.1修改表中全部数据
例子:update studentinfor set age=age+1;(所有学生的年龄加1.)
3.4.2根据条件修改表中数据
例子:update studentinfo set stuname='小明' where stuid=211114;(将学号为211114的学生姓名改为小明.)
3.5.1使用DELETE
语法:delete 字段名1,字段名2 from 表名 where 筛选条件;
例子:delete from studentinfo;(删除表中所有信息.)
delect stuname,age from studentinfo where stuid=211114;(将学号为211114的学生姓名和年龄删除)
3.5.2使用TRUNCATE
语法:truncate table 表名;
复制表(结构、数据):creat table authorcopy select * from author;
DELETE和TRUNCATE的区别:
DETELE语句执行操作是记录在日志文件中的,虽然能够删除表中的所有数据,但如果数据标的数据量过大,删除速度会变慢而且DELETE删除数据后,表所占用的空间并没有被收回。TRUNCATE不记录日志操作,其速度比DELETE快,而且释放分配空间。
——4.3.1-基本语法
*主要内容 :SELECT命令在SQL语句中使用频率最高的。本章学习如排列(ORDER BY),条件查询(WHERE),分组(GROUP BY)等。
*基本语法 : SELECT
FROM
[WHERE]
[ORDER BY]
[LIMIT]
*易错点 :注意语法拼写,代码中语法的位置 。
*总结 : SELECT select_list
FROM table_name
[WHERE search_condition]
[ORDER BY orider_expression[ASC][DESC]]
[LIMIT [offset]rowcount]
——4.3.2-基本应用
*主要内容 :可以使用语法查看当前表内的所有内容
*基本语法 : SELECT全表查询
SELECT选择列查询
*易错点 : 需要注意 * 号的使用,不当的使用会影响查询结果的不同
*总结 : 需要根据自身的查询需求使用不同的 * 号
——4.3.3-查询中的别名
*主要内容 : 本章讲解如何使用语法更改表中的数据
*基本语法 : 字段名1 别名, 字段名2
*易错点 : 注意表名和需要更改的字符段的别名
*总结 : 使用AS关键字别名 SELECT 字符段 1 AS 别名, 字符名2 AS 别名 ....FROM 表名
使用空格为字段定名 SELECT 字符名1 别名 ,字符名2 别名.....FROM 表明
——4.4.1使用Where子句限制查询结果
*主要内容 : 可以根据自己的查找需求来精准查询,可以减少使用大量的内存和系统资源
*基本语法 :单条件查询 比较运算符 [WHERE]
多条符合查询 使用逻辑运算符 [NOT AND OR]
*易错点 : 注意查询的信息条件,还有查询语法的使用
*总结 : SELECT 字段名 ,表名,Gender,age FROM 表名 WHERE Age>21;
SELECT 字段名 ,表名,Gender,age FROM 表名 WHERE 表名 字符段<>1;
——4.4.2使用Distinct消除重复列
*主要内容: 查询过程中有重复的数据用来消除重复行
*基本语法 :select语句中的[Distinct]
*易错点 :注意字符位置,还有拼写
*总结 :SELECT DISTINCT 字符段 FROM 表名:
——4.4.3使用LIMIT限定查询返回行
*主要内容 : 当表中数据比较多时,使用关键字可以限制返回的查询结构的行数
*基本语法 :LIMIT[位置偏移量]
*易错点 :limit语句是mysql特有功能。Oracle,sql server 限定查询返回行使用的是其他语句
*总结 :用于指示mysql从哪一行开始显示,是一个可选参数,如果不指定该参数,将会从结果集的第一条记录开始
——4.4.4处理NuII值
*主要内容 :myqsl表中常有null。是特殊情况无法直接通过sql查询,需要用is null 和is not null
*基本语法 :is NULL
is not NULL
*易错点 :主要使用位置
*总结 :用字段名=NULL和字符名!=NULL判断结果是错误的
——4.5.1单列排序
*主要内容 : 按照表中的某个列进行排序,即ORDER BY后只有一个列名
*基本语法 :升序排列查询[ASC]
降序排序查询[DESC]
*易错点 :注意使用查询升降序
*总结 :数据库默认升序排序,所有asc可以省略不写,在数据中,null值比所有值都要小
字符串函数
日期函数:
获取日期、时间指定部分的函数:month(date)、dayname(date);
计算日期和时间的函数:now()\
数学函数
系统函数
5.1.1.like运算符:
语法:
select 字段名 from 表名 where like 匹配内容;
知识点:
①通配符定义:
用来模糊搜索文件。当查找文件夹时,可以使用它来代替一个或多个真正字符;
当不知道真正字符或者懒得输入完整名字时,常常使用通配符代替一个或多个真正的字符。
②like查询的通配符有:
“%”(表示任意0~n个字符),
“_”(表示单个任意字符),
“[ ]”(可以匹配一组单个字符,或者是匹配用连字符(“-”)指定的某一范围内的字符。)。
③可运用的数据类型:char,varchar,text
【例子1】
-- 1)在表studentifo
中查询stuname
的第二个字是康的学生信息: SELECT * FROM studentinfo WHERE stuname LIKE '_康%';
-- 2)在表studentifo
中查询stuname
中包含康字的学生信息:
SELECT * FROM studentinfo WHERE stuname LIKE '%康%';
注意:
通配符%可以匹配任意字符,但是不能匹配NULL。
语法:
select 聚合函数(字段名) from 表名 where 查询条件;
知识点:
①聚合函数类型:
sum
(用于对一组数据求总和,且在计算中会忽略该组数据中的null值)
max/min
(用于求一组数据的最大值/最小值)
avg
(用于求一组数据中的平均值)
count
(用于统计查询结果中的记录条数)
1)且有两种方式:
1.count(*)
可以统计出表中包含的所有记录行数,
2.count(字段名)
可以统计出行数但是忽略记录中null值的所在行;
【例子2】
-- 1)在exam
表中查询课程编号是2的最高成绩、最低成绩和平均分,平均分保留两位小数; SELECT ROUND(AVG(exam),2),MAX(exam),MIN(exam) FROM exam WHERE subjectid=2;
-- 2)查询studentinfo
表中一共有多少个学生; SELECT count(*) 总人数 FROM studentinfo;
5.3.1使用Group By进行数据分组查询:
语法:
select 字段名 from 表名 group by 分组依据(字段名);
知识点:
group by
从英文里理解就是分组,与“聚合函数”配合使用,使用时至少需要一个分组标志字段。
【例子3】
-- 1)在学生信息表中查询男、女生的人数各是多少; SELECT gender,count(*) FROM studentinfo GROUP BY gender;
5.3.2多列分组查询:
顾名思义就是按照多个字段进行分组查询。
【例子4】
-- 1)在学生信息表中查询每个班级的男、女生人数; SELECT gender,cid,count(*) FROM studentinfo GROUP BY cid,gender;
5.3.3 Having字句-分组查询的条件筛选:
语法:
select 字段名 from 表名 group by 分组依据(字段名)Having 筛选条件;
知识点:
Having与where
子句的作用类似都是作为条件出现的但是两者的运行顺序不同。
【例子5】
-- 1)在学生信息表中查询每个班级的学生人数并筛选出cid
为1的班级人数; SELECT cid,count(*) FROM studentinfo GROUP BY cid HAVING cid=1
;
注意:
在查询语句中WHERE, GROUP BY ,HAVING
子句和聚合函数的执行顺序如下:
1.WHERW
筛选出需要的数据
2.GROUP BY
对筛选出的数据进行分组
3.HAVING
筛选掉那些分组后不符合要求的
4.聚合函数进行运算
知识点(理论知识):
1.定义:在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在一个表中。
当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带来很大的灵活性,
他们可以在任何时候增加新的数据类型。为不同实体创建新的表,通过连接运算符可以实现多个表查询。
2.常用的连接有:
内连接(两个常用的连接查询之一,即运用比较符对表之间的公共字段进行比较得出与连接条件相匹配的数据行并合成新的结果集。),
外连接(两种常用的连接查询之一,与内连接作用相似但是不同的是他的结果集中包括左外连接,右外连接或者是全外连接的所有记录行),
交叉连接(笛卡尔乘积连接)(数据行没有WHERE子句将多张表中的数据行 一 一对应连接在一起相当于多张表行数乘积后的结果)
语法:
select 表名1.字段名,表名2.字段名,... from 表名1 别名,表名2 别名 ,...where 取消冗余的条件;
【例子1】
-- 显示考试学生姓名、课程名和成绩,如果不及格则不显示;
分析:
首先对三张表所需要的字段进行连接查询
用where子句筛选出及格的人
SELECT s.stuname,e.exam,sb.subname
FROM studentinfo s,exam e,subject sb
WHERE exam>=60 ;
语法:
select ... from 表1 [inner] join 表 2 on <表达式>;
【例子2】
-- 在查询出学生姓名、课程名称和考试成绩;并且考试成绩在80以上,结果集按照成绩降序排列;
分析:
首先对三张表进行连接查询
加上大于八十的筛选选条件
进行降序排列
SELECT s.stuname,e.exam,sb.subname
FROM studentinfo s
INNER JOIN exam e ON s.stuid=e.stuid
INNER JOIN subject sb ON e.subjectid=sb.subjectid
WHERE exam>80 ORDER BY exam DESC;
6.4.1左外连接:
语法:
select ... from 表1 left [outer] join 表2 on<表达式>;
知识点:
左外连接的结果集包括left
指定左表的所有行以及右表的匹配行,如果左表的某行在右表中没有匹配行则在结果集中右表的选择列为空值。
【例子3】
-- 查询所有老师姓名和所带的课程名称,没有带课的老师姓名也要显示;
分析:
需要对teacher
表以及subject
表进行连接并且teacher
表为左连接中的左表
并且两个表的连接条件是tid
SELECT t.teachername,s.subname FROM teacher t LEFT JOIN subject s ON t.tid=s.tid;
6.4.2右外连接:
语法:
select ... from 表1 right [outer] join 表2 on<表达式>;
知识点:
右外连接是左外连接的反向连接,如果右表的某行在左表中没有匹配行则在结果集中左表的选择列为空值。
【例子4】
-- 5)查询所有学生的姓名和考试成绩,包括没有参加考试的学生;
分析:
需要对studentinfo表以及exam表进行连接并且studentinfo表为左连接中的左表
两个表的连接条件是stuid
`SELECT s.stuname,e.exam,e.subjectid FROM exam e right JOIN studentinfo s on s.stuid=e.stuid;
6.4.3全外连接:
语法:
select ... from 表1 full join 表2 on<表达式>;
知识点:
全外连接又称完整外连接,他除了匹配行之外还包括左右表中不匹配的数据行。
注意:
MySQL
不支持全外连接。
SQL
高级子查询主要内容:
子查询是一个嵌套在 SELECT.INSERT.UPDATE或DELETE语句或其他子查询中的查询。
基本的子查询分为三类:
(1)通过IN.ANY.ALL修改的比较运算符引入的列表上操作的子查询;
(2)通过未修改的比较运算符引入且必须返回单个值的子查询;
(3)通过EXISTS的存在测试的子查询
注意:
任何允许使用表达式的东西都可以使用子查询
主要内容:
使用简单子查询,实现
语法:
SELECT 字符名 FROM 列表名 WHERE 条件 比较运算符(子查询);
子查询语法:
SELECT 字符名 FROM 列表名 WHERE 条件
【例子1】
查询出学生“karry”
的同班同学
分析:(1)首先查询出学生“karry”的班级编号
语法:
SELECT classid (班级编号字段名)
FROM Studentinfo (列表名)
WHERE stuname (查询条件字段名) = ‘karry’;
(2)根据‘karry’
的班级编号在studentinfo
学生表中查
出和‘karry’
班级编号相同的学生编号、姓名和班级编号
语法:
SELECT stuid,stuname,classid(各个字段名)
FROM Studentinfo(列表名)
WHERE classid = karry的班级编号
合并:
SELECT stuid,stuname,classid
FROM Studentinfo
WHERE classid =
(SELECT classid (班级编号字段名)
FROM Studentinfo (列表名)
WHERE stuname (查询条件字段名) = ‘karry’ );
【例子2】
查询《JAVA面向对象程序设计》考试成绩刚好等于88分的学生名单
分析:
本题可以使用表连接inner join实现也可以根据子查询实现
使用子查询:
(1)先查询出课程名为《JAVA面向对象程序设计》的课程名
语法:
SELECT subjectID
FROM Subject
WHERE subjectname= ‘JAVA面向对象程序设计’;
(2)之后根据查出的课程编号和成绩等于88分的条件查询出符合条件的学号
语法:
SELECT StudentID FROM Exam = 88
AND SubjectID = (课程名为JAVA面向对象程序设计)
(3)最后根据符合条件的学号查出成绩等于88分学生的姓名
语法:
SELECT StudentName FROM StudentInfo
WHERE ID = (成绩等于88并且课程编号为JAVA面向对象程序设计 =(课程名为JAVA面向对象程序设计));
合并:
SELECT StudentName FROM StudentInfo
WHERE ID = (SELECT StudentID FROM Exam = 88
AND SubjectID=(SELECT subjectID
FROM Subject
WHERE subjectname= ‘JAVA面向对象程序设计’));
7.3 在UPDATE.DELETE.INSERT语句中使用子查询
*主要内容:
在UPDATE.DELETE.INSERT语句中完成复杂的更新.删除.插入、功能
【例子3】
在UPDATE语句中使用子查询
更新‘roy’
的‘音乐盛典’成绩为99
分析:
(1)先查出‘roy’
的编号以及‘音乐盛典’的成绩编号
语句:
SELECT ID FROM movie WHERE name =‘roy’
AND movieID = (SELECT ID FROM subject WHERE subjectname = ‘音乐盛典’)
(2)将以上的查询作为update的查询条件
语法:
UPDATE exam SET exam = 99
WHERE movie = ( SELECT ID FROM movie WHERE name =‘roy’)
AND movieID = (SELECT ID FROM subject WHERE subjectname =‘音乐盛典’);
2.删除‘Jackson’的学生编号
分析:先查出Jackson的学生编号,之后作为delete语句的条件
语法:
DELETE FROM exam WHERE stuid = (
SELECT ID FROM Studentinfo WHERE Stuname=‘Jackson’);
3.在insertinto
语句中使用子查询
语法:
INSERTINTO 表名 SELECT 字段列表 FROM 表名;
*主要内容:
通过IN或NOT IN关键字引入的子查询也返回一列零值或更多值
【例子1】
查询《高职英语》考试成绩刚好等于66的学生名单
分析:
(1)先查‘高职英语’课程的课程号和成绩正好等于66
SELECT StudentID FROM exam WHERE exam =66
AND SubjectID= (SELECT subjectID FROM Subject
WHERE Subjectname = ‘高职英语’);
(2) 根据以上查出的课号作为查询条件
语法:
SELECT StudentName FROM Studentinfo WHERE ID IN (
SELECT StudentID FROM exam WHERE exam =66
AND SubjectID= (SELECT subjectID FROM Subject
WHERE Subjectname = ‘高职英语’);
如果查询没有参加此课程的学生名单只需要用NOT IN实现即可
同时去掉成绩
【例子2】
SELECT StudentName FROM Studentinfo WHERE ID NOT IN (
SELECT StudentID FROM exam
WHERE SubjectID= (SELECT subjectID FROM Subject
WHERE Subjectname = ‘高职英语’);
主要内容:
EXISTS关键字后面的参数是一个任意的子查询,系统对子查询进行运算以
判断它是否返回行,如果至少返回一行,那么EXISTS的结果是TRUE,外层查询语句将进行查询,如果子查询没有返回行,那么EXISTS的结果为FALSE,外层语句不进行查询。
【例子3】
查询成绩表中科目编号为2的考试成绩中是否存在不及格学生,如果存在不及格的学生就将参与此编号的所有学生编号和成绩显示出来
语句:
SELECT StudentID,examFROM exam WHERE SubjectID = 2 AND EXISTS(
SELECT StudentID FROM EXAM WHERE examw<60);
注意:
NOT EXISTS与EXISTS使用方法一样,返回结果相反。
主要内容:
all在查询前,通过比较运算符将一个表达式的值或列值与子查询返回的一列值中的每一行进行比较。
【例子4】
查询科目编号为‘1’的这门课程的所有成绩都大的学生考试信息
语法:
SELECT *FROM EXAM WHERE >ALL (SELECT EXAM FROM WHERE Subjectid =1);
注意:some/ any作用相同
易错点:
1.习惯上,外面的查询称为父查询,括号里面称为子查询,SQL在执行时,先执行子查询后执行父查询
注意子查询和比较运算符联合使用,必须保证子查询返回的值是一个,不能多于一个值
2.注意拼写错误
总结:
1.查询过程中,子查询先于父查询执行(因为我们是要对以及查询出来的结果进行再次查询,
那么我们最先的就是要得到我们第一次查询的结果)。子查询语句按照其出现的位置可以分为:
①select后面 ②from后面 ③where/having后面 ④exits后面
2.连接查询的性能优于子查询
*定义:*
索引是对数据库中一列或多列的值进行排序的一种结构。
特点:
索引是存储引擎中实现的,因此,每种存储引擎的索引不一定完全相同,并且每种存储引擎也不一定支持所有索引类型。MylSAM和INNODB
存储引擎只支持B树结构的的索引。
分类:
1 普通索引 2 唯一索引 3 主键索引 4 全文索引 5 全文索引 6 空间索引 7 外键索引
注意:MYSQL在定义表时,对主键约束、唯一约束、外键约束的字段自动创建主键索引、唯一索引和外键索引。
设计原则:
索引并非越多越好;
避免对经常更新的列使用索引;
数据量小的表最好不要使用索引;
在不同值较少的字段上不必要建立索引;
在频繁进行排序或分组的列上建立索引。
创建索引:
create index 索引名 on 表名(字段)
alter table 表名 add index 索引名(字段名(长度))
概念:
它包含了一组数据库的操作命令,这组命令要么都执行要么都不执行,所以事务是一个不可分割的逻辑工作单元。
特点:
原子性,一致性,隔离性,持久性,简称ACID**
隔离级别:
未提交读,已提交读,重复读,可串行化
操作步骤:
1.开始事务:BEGIN或START TANSACTION
2.提交事务:COMMIT
3.回滚(撤销)事务:ROLLBACK
查看自动提交事务的变量值:show variables like "autocommit";
关闭自动提交事务:set autocommit="off"
查看默认隔离级别:select @@ tx ___islation;