MySQL数据库

一、简述

1.SQL的概述
Structure Query Language(结构化查询语言)简称SQL,它被美国国家标准局(ANSI)确定为关系型数据库语言的美国标准,后被国际化标准组织(ISO)采纳为关系数据库语言的国际标准。数据库管理系统可以通过SQL管理数据库;定义和操作数据,维护数据的完整性和安全性。

2.SQL的优点
1、简单易学,具有很强的操作性
2、绝大多数重要的数据库管理系统均支持SQL
3、高度非过程化;用SQL操作数据库时大部分的工作由DBMS自动完成

3.SQL的分类

  1. DDL(Data Definition Language) 数据定义语言,用来操作数据库、表、列等;
    常用语句:CREATE(新建)、 ALTER(修改)、DROP(删除)
  2. DML(Data Manipulation Language)
    数据操作语言,用来操作数据库中表里的数据;常用语句:INSERT(增)、 UPDATE(改)、 DELETE(删)
  3. DCL(Data Control Language) 数据控制语言,用来操作访问权限和安全级别;
    常用语句:GRANT(授权)、DENY()
  4. DQL(Data Query Language) 数据查询语言,用来查询数据 常用语句:SELECT

4:数据库,数据库管理系统与SQL的关系
1、数据库
DataBase简称DB,按照一定格式存储数据的一些文件的组合。
2、数据库管理系统
DataBaseManagement简称DBMS,是专门用来管理数据库中的数据,可以对数据库当中的数据进行增删改查。
常见的数据库管理系统MySQL,Oracle,MS,SqlServer,DB2等
3、SQL结构化查询语言
程序员需要学习SQL语句,通过编写SQL语句,然后DBMS负责执行SQL语句,最终完成数据库增删改查的操作。

DBMS—执行–>SQL—操作–> DB

二、常用命令

1、启动进入: mysql -uroot -p(密码)
2、退出: exit
3、查看所有数据库:show databases;
4、创建数据库后查看该数据库基本信息:show create database db1;
5、删除数据库:drop database db1;
6、查看表的字段信息:desc student;
7、修改表名 :alter table student rename to stu;
8、删除表字段:alter table stu drop address;
9、删除数据表:drop table stu;
10、使用某个数据库: use sys;
11、创建数据库: create dtest;
12、查看某个数据库中的表: show tables;
13、查看版本号: select version();
14、查看当前是那个数据库: select database();
15、\c用来终止输入
16、查询表中所有数据:select * from student;
17、要创建一个名为users的表,其中包含id列(整数类型,自动递增)、name列(字符串类型)和age列(整数类型),可以使用以下语句:create table users (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(50),age INT);

注意:以上的命令不区分大小写,并且必须以分号结尾,不见分号不执行。

三、数据类型

使用MySQL数据库存储数据时,不同的数据类型决定了 MySQL存储数据方式的不同。为此,MySQL数据库提供了多种数据类型,其中包括整数类型、浮点数类型、定点 数类型、日期和时间类型、字符串类型、二进制…等等数据类型。

1.整数类型
根据数值取值范围的不同MySQL 中的整数类型可分为5种,分别是TINYINT、SMALUNT、MEDIUMINT、INT和 BIGINT。下图列举了 MySQL不同整数类型所对应的字节大小和取值范围而最常用的为INT类型的,

数据类型字节数无符号数的取值范围有符号数的取值范围
TINYINT10~255-128~127
SMALLINT20~65535-32768~32768
MEDIUMINT30~16777215-8388608~8388608
INT40~4294967295-2147483648~ 2147483648
BIGINT80~18446744073709551615-9223372036854775808~9223372036854775808

2.浮点数类型和定点数类型
在MySQL数据库中使用浮点数和定点数来存储小数。浮点数的类型有两种:单精度浮点数类型(FLOAT)和双精度浮点数类型(DOUBLE)。而定点数类型只有一种即DECIMAL类型。下图列举了 MySQL中浮点数和定点数类型所对应的字节大小及其取值范围:

数据类型字节数有符号数的取值范围无符号数的取值范围
FLOAT4-3.402823466E+38~-1.175494351E-380和1.175494351E-38~3.402823466E+38
DOUBLE8-1.7976931348623157E+308~2.2250738585072014E-3080和2.2250738585072014E-308~1.7976931348623157E+308
DECIMAL(M,D)M+2-1.7976931348623157E+308~2.2250738585072014E-3080和2.2250738585072014E-308~1.7976931348623157E+308

从上图中可以看出:DECIMAL类型的取值范围与DOUBLE类型相同。但是,请注意:DECIMAL类型的有效取值范围是由M和D决定的。其中,M表示的是数据的长 度,D表示的是小数点后的长度。比如,将数据类型为DECIMAL(6,2)的数据6.5243 插人数据库后显示的结果为6.52

3.字符串类型
在MySQL中常用CHAR 和 VARCHAR 表示字符串。两者不同的是:VARCHAR存储可变长度的字符串。
当数据为CHAR(M)类型时,不管插入值的长度是实际是多少它所占用的存储空间都是M个字节;而VARCHAR(M)所对应的数据所占用的字节数为实际长度加1

插入值CHAR(3)存储需求VARCHAR(3)存储需求
‘’‘’3个字节‘’1个字节
‘a’‘a’3个字节‘a’2个字节
‘ab’‘ab’3个字节‘ab’3个字节
‘abc’‘ab’3个字节‘abc’4个字节
‘abcd’‘ab’3个字节‘abc’4字节

4.文本类型
文本类型用于表示大文本数据,例如,文章内容、评论、详情等,它的类型分为如下4种:

数据类型储存范围
TINYTEXT0~255字节
TEXT0~65535字节
MEDIUMTEXT0~16777215字节
LONGTEXT0~4294967295字节

5.日期与时间类型
MySQL提供的表示日期和时间的数据类型分别是 :YEAR、DATE、TIME、DATETIME 和 TIMESTAMP。下图列举了日期和时间数据类型所对应的字节数、取值范围、日期格式以及零值:

数据类型字节数取值范围日期格式零值
YEAR11901~2155YYYY0000
DATE41000-01-01~9999-12-31YYYY-MM-DD0000-00-00
TIME3-838:59:59~ 838:59:59HH:MM:SS00:00:00
DATETIME81000-01-01 00:00:00~9999-12-31 23:59:59YYYY-MM-DD HH:MM:SS0000-00-00 00:00:00
TIMESTAMP41970-01-01 00:00:01~2038-01-19 03:14:07YYYY-MM-DD HH:MM:SS0000-00-00 00:00:00

5.1 YEAR类型
YEAR类型用于表示年份,在MySQL中,可以使用以下三种格式指定YEAR类型 的值。
1、使用4位字符串或数字表示,范围为’1901’—'2155’或1901—2155。例如,输人 ‘2019’或2019插人到数据库中的值均为2019。
2、使用两位字符串表示,范围为’00’—‘99’。其中,‘00’—'69’范围的值会被转换为 2000—2069范围的YEAR值,‘70’—'99’范围的值会被转换为1970—1999范围的YEAR 值。例如,输人’19’插人到数据库中的值为2019。
3、使用两位数字表示,范围为1—99。其中,1—69范围的值会被转换为2001— 2069范围的YEAR值,70—99范围的值会被转换为1970—1999范围的YEAR值。例 如,输人19插入到数据库中的值为2019。
请注意:当使用YEAR类型时,一定要区分’0’和0。因为字符串格式的’0’表示的YEAR值是2000而数字格式的0表示的YEAR值是0000。

5.2 TIME类型
TIME类型用于表示时间值,它的显示形式一般为HH:MM:SS,其中,HH表示小时, MM表示分,SS表示秒。在MySQL中,可以使用以下3种格式指定TIME类型的值。
1、以’D HH:MM:SS’字符串格式表示。其中,D表示日可取0—34之间的值, 插人数据时,小时的值等于(DX24+HH)。例如,输入’2 11:30:50’插人数据库中的日期为59:30:50。
2、以’HHMMSS’字符串格式或者HHMMSS数字格式表示。 例如,输人’115454’或115454,插入数据库中的日期为11:54:54
3、使用CURRENT_TIME或NOW()输人当前系统时间。

5.3 DATETIME类型
DATETIME类型用于表示日期和时间,它的显示形式为’YYYY-MM-DD HH: MM:SS’,其中,YYYY表示年,MM表示月,DD表示日,HH表示小时,MM表示分,SS 表示秒。在MySQL中,可以使用以下4种格式指定DATETIME类型的值。
以’YYYY-MM-DD HH:MM:SS’或者’YYYYMMDDHHMMSS’字符串格式表示的日期和时间,取值范围为’1000-01-01 00:00:00’—‘9999-12-3 23:59:59’。例如,输人’2019-01-22 09:01:23’或 ‘20140122_0_90123’插人数据库中的 DATETIME 值都为 2019-01-22 09:01:23。
1、以’YY-MM-DD HH:MM:SS’或者’YYMMDDHHMMSS’字符串格式表示的日期和时间,其中YY表示年,取值范围为’00’—‘99’。与DATE类型中的YY相同,‘00’— '69’范围的值会被转换为2000—2069范围的值,‘70’—'99’范围的值会被转换为1970—1999范围的值。
2、以YYYYMMDDHHMMSS或者YYMMDDHHMMSS数字格式表示的日期 和时间。例如,插入20190122090123或者190122090123,插人数据库中的DATETIME值都 为 2019-01-22 09:01:23。
3、使用NOW来输人当前系统的日期和时间。

5.4 TIMESTAMP类型
TIMESTAMP类型用于表示日期和时间,它的显示形式与DATETIME相同但取值范围比DATETIME小。在此,介绍几种TIMESTAMP类型与DATATIME类型不同的形式:
1、使用CURRENT_TIMESTAMP输人系统当前日期和时间。
2、输人NULL时系统会输人系统当前日期和时间。
3、无任何输人时系统会输入系统当前日期和时间。

6.二进制类型
在MySQL中常用BLOB存储二进制类型的数据,例如:图片、PDF文档等。BLOB类型分为如下四种:

数据类型储存范围
TINYBLOB0~255字节
BLOB0~65535字节
MEDIUMBLOB0~16777215字节
LONGBLOB0~4294967295字节

四、数据库中最基本的单元 – 表

数据库中是以表的形式表示数据的,因为表比较直观
任何一张表都有行和列
行(row): 被称为数据/字段
列(column): 被称为字段
数据表插入数据:INSERT INTO 表名(字段名1,字段名2,…) VALUES (值 1,值 2,…);
数据表更新数据:UPDATE 表名 SET 字段名1=值1[,字段名2 =值2,…] [WHERE 条件表达式];
更新全部数据:update student set age=18;
删除数据:DELETE FROM 表名 [WHERE 条件表达式];

五、数据表的约束

为防止错误的数据被插入到数据表,MySQL中定义了一些维护数据库完整性的规则;这些规则常称为表的约束。常见约束如下

约束条件 说明

  • PRIMARY KEY 主键约束用于唯一标识对应的记录
  • FOREIGN KEY 外键约束
  • NOT NULL 非空约束
  • UNIQUE 唯一性约束
  • DEFAULT 默认值约束,用于设置字段的默认值

以上五种约束条件针对表中字段进行限制从而保证数据表中数据的正确性和唯一性。换句话说,表的约束实际上就是表中数据的限制条件。

1.主键约束
主键约束即primary key用于唯一的标识表中的每一行。被标识为主键的数据在表中是唯一的且其值不能为空。这点类似于我们每个人都有一个身份证号,并且这个身份证号是唯一的。
主键约束基本语法:
字段名 数据类型 primary key;

2.非空约束
非空约束即 NOT NULL指的是字段的值不能为空,基本的语法格式如下所示:

字段名 数据类型 NOT NULL;

3.默认值约束
默认值约束即DEFAULT用于给数据表中的字段指定默认值,即当在表中插入一条新记录时若未给该字段赋值,那么,数据库系统会自动为这个字段插人默认值;其基本的语法格式如下所示:
字段名 数据类型 DEFAULT 默认值;

5.唯一性约束
唯一性约束即UNIQUE用于保证数据表中字段的唯一性,即表中字段的值不能重复出现,其基本的语法格式如下所示:
字段名 数据类型 UNIQUE;

6.外键约束
外键约束即FOREIGN KEY常用于多张表之间的约束。基本语法如下:
– 在创建数据表时语法如下:
CONSTRAINT 外键名 FOREIGN KEY (从表外键字段) REFERENCES 主表 (主键字段)
– 将创建数据表创号后语法如下:
ALTER TABLE 从表名 ADD CONSTRAINT 外键名 FOREIGN KEY (从表外键字段) REFERENCES 主表 (主键字段);

六、条件查询

不是将表中所有的数据都查出来,而是查询出来符合条件的。
语法格式:
select
字段1,字段2,字段3.。。。。。
form
表名
where
条件

1.使用关系运算符查询

查询年龄等于或大于17的学生的信息 MySQL命令:

select * from student where age>=17;

2.使用IN关键字查询
IN关键字用于判断某个字段的值是否在指定集合中。如果字段的值恰好在指定的集合中,则将字段所在的记录将査询出来。

in与exists

  • in()适合B表比A表数据小的情况
  • exists()适合B表比A表数据大的情况
  • 当A表数据与B表数据一样大时,in与exists效率差不多,可任选一个使用.

查询sid为S_1002和S_1003的学生信息 MySQL命令:

select * from student where sid in(‘S_1002’,‘S_1003’);

查询sid为S_1001以外的学生的信息 MySQL命令:

select * from student where sid not in(‘S_1001’);

3.使用BETWEEN AND关键字查询

查询15到18岁的学生信息 MySQL命令:

select * from student where age between 15 and18;

查询不是15到18岁的学生信息 MySQL命令:

select * from student where age not between 15 and 18;

4.使用空值查询

查询sname不为空值的学生信息 MySQL命令:

select * from student where sname is not null;

5.使用AND关键字查询

查询年纪大于15且性别为male的学生信息 MySQL命令:

select * from student where age>15 and gender=‘male’;

6.使用OR关键字查询
查询年纪大于15或者性别为male的学生信息 MySQL命令:

select * from student where age>15 or gender=‘male’;

7.使用LIKE关键字查询
MySQL中可使用LIKE关键字可以判断两个字符串是否相匹配
7.1 普通字符串
查询sname中与wang匹配的学生信息 MySQL命令:

select * from student where sname like ‘wang’;

7.2 含有%通配的字符串
%用于匹配任意长度的字符串。例如,字符串“a%”匹配以字符a开始任意长度的字符串
查询学生姓名以li开始的记录 MySQL命令:

select * from student where sname like ‘li%’;

查询学生姓名以g结尾的记录 MySQL命令:

select * from student where sname like ‘%g’;

查询学生姓名包含s的记录 MySQL命令:

select * from student where sname like ‘%s%’;

7.3 含有_通配的字符串
下划线通配符只匹配单个字符,如果要匹配多个字符,需要连续使用多个下划线通配符。例如,字符串“ab_”匹配以字符串“ab”开始长度为3的字符串,如abc、abp等等;字符串“a__d”匹配在字符“a”和“d”之间包含两个字符的字符串,如"abcd"、"atud"等等。

查询学生姓名以zx开头且长度为4的记录 MySQL命令:

select * from student where sname like ‘zx__’;

查询学生姓名以g结尾且长度为4的记录 MySQL命令:

select * from student where sname like ‘___g’;

8.使用LIMIT限制查询结果的数量
当执行查询数据时可能会返回很多条记录,而用户需要的数据可能只是其中的一条或者几条

查询学生表中年纪最小的3位同学 MySQL命令:

select * from student order by age asc limit 3;

9.使用GROUP BY进行分组查询
GROUP BY 子句可像切蛋糕一样将表中的数据进行分组,再进行查询等操作。换言之,可通俗地理解为:通过GROUP BY将原来的表拆分成了几张小表。

10.使用ORDER BY对查询结果排序
从表中査询出来的数据可能是无序的或者其排列顺序不是我们期望的。为此,我们可以使用ORDER BY对查询结果进行排序
其语法格式如下所示:
SELECT 字段名1,字段名2,…
FROM 表名
ORDER BY 字段名1 [ASC 丨 DESC],字段名2 [ASC | DESC];
在该语法中:字段名1、字段名2是查询结果排序的依据;参数 ASC表示按照升序排序,DESC表示按照降序排序;默认情况下,按照ASC方式排序。通常情况下,ORDER BY子句位于整个SELECT语句的末尾。

查询所有学生并按照年纪大小升序排列 MySQL命令:

select * from student order by age asc;

11.使用HAVING和WHERE查询
having字句可以让我们筛选成组后的各种数据,where字句在聚合前先筛选记录。

having与where的区别:

  • having是在分组后对数据进行过滤; where是在分组前对数据进行过滤。
  • having后面可以使用聚合函数; where后面不可以使用聚合。

在查询过程中执行顺序:from>where>group(含聚合)>having>order>select。

显示每个地区的总人口数和总面积.

select region, sum(population), sum(area) from bbc group by region;

显示每个地区的总人口数和总面积.仅显示那些面积超过1000000的地区。

select region, sum(population),
sum(area) from bbc group by region
having sum(area)>1000000;

不能用where来筛选超过1000000的地区,因为表中不存在这样一条记录。

七、函数

1.聚合函数
在开发中,我们常常有类似的需求:统计某个字段的最大值、最小值、 平均值等等。为此,MySQL中提供了聚合函数来实现这些功能。所谓聚合,就是将多行汇总成一行;其实,所有的聚合函数均如此——输入多行,输出一行。聚合函数具有自动滤空的功能,若某一个值为NULL,那么会自动将其过滤使其不参与运算。
聚合函数使用规则:
只有SELECT子句和HAVING子句、ORDER BY子句中能够使用聚合函数。例如,在WHERE子句中使用聚合函数是错误的。
接下来,我们学习常用聚合函数。

1.1、count()
统计表中数据的行数或者统计指定列其值不为NULL的数据个数

查询有多少该表中有多少人

select count(*) from student;

1.2、max()
计算指定列的最大值,如果指定列是字符串类型则使用字符串排序运算

查询该学生表中年纪最大的学生

select max(age) from student;

1.3、min()
计算指定列的最小值,如果指定列是字符串类型则使用字符串排序运算

查询该学生表中年纪最小的学生

select sname,min(age) from student;

1.4、sum()
计算指定列的数值和,如果指定列类型不是数值类型则计算结果为0

查询该学生表中年纪的总和

select sum(age) from student;

1.5、avg()
计算指定列的平均值,如果指定列类型不是数值类型则计算结果为

查询该学生表中年纪的平均数

select avg(age) from student;

2.其他常用函数
2.1、时间函数
SELECT NOW();
SELECT DAY (NOW());
SELECT DATE (NOW());
SELECT TIME (NOW());
SELECT YEAR (NOW());
SELECT MONTH (NOW());
SELECT CURRENT_DATE();
SELECT CURRENT_TIME();
SELECT CURRENT_TIMESTAMP();
SELECT ADDTIME(‘14:23:12’,‘01:02:01’);
SELECT DATE_ADD(NOW(),INTERVAL 1 DAY);
SELECT DATE_ADD(NOW(),INTERVAL 1 MONTH);
SELECT DATE_SUB(NOW(),INTERVAL 1 DAY);
SELECT DATE_SUB(NOW(),INTERVAL 1 MONTH);
SELECT DATEDIFF(‘2019-07-22’,‘2019-05-05’); 返回两个日期之间的天数。

2.2、字符串函数
–连接函数
SELECT CONCAT ()
–插入函数
SELECT INSTR ();
–统计长度
SELECT LENGTH();

2.3、数学函数
– 绝对值
SELECT ABS(-136);
– 向下取整
SELECT FLOOR(3.14);
– 向上取整
SELECT CEILING(3.14);

八、表的关联关系

在实际开发中数据表之间存在着各种关联关系。

  • 多对一
    多对一(亦称为一对多)是数据表中最常见的一种关系。例如:员工与部门之间的关系,一个部门可以有多个员工;而一个员工不能属于多个部门只属于某个部门。在多对一的表关系
    中,应将外键建在多的一方否则会造成数据的冗余。
  • 多对多
    多对多是数据表中常见的一种关系。例如:学生与老师之间的关系,一个学生可以有多个老师而且一个老师有多个学生。通常情况下,为了实现这种关系需要定义一张中间表(亦称为连接表)该表会存在两个外键分别参照老师表和学生表。
  • 一对一
    在开发过程中,一对一的关联关系在数据库中并不常见;因为以这种方式存储的信息通常会放在同一张表中。
DROP TABLE IF EXISTS student;
DROP TABLE IF EXISTS class;

-- 创建班级表
CREATE TABLE class(
    cid int(4) NOT NULL PRIMARY KEY,
    cname varchar(30) 
);

-- 创建学生表
CREATE TABLE student(
    sid int(8) NOT NULL PRIMARY KEY,
    sname varchar(30),
    classid int(8) NOT NULL
);

-- 为学生表添加外键约束
ALTER TABLE student ADD CONSTRAINT fk_student_classid FOREIGN KEY(classid) REFERENCES class(cid);
-- 向班级表插入数据
INSERT INTO class(cid,cname)VALUES(1,'Java');
INSERT INTO class(cid,cname)VALUES(2,'Python');

-- 向学生表插入数据
INSERT INTO student(sid,sname,classid)VALUES(1,'tome',1);
INSERT INTO student(sid,sname,classid)VALUES(2,'lucy',1);
INSERT INTO student(sid,sname,classid)VALUES(3,'lili',2);
INSERT INTO student(sid,sname,classid)VALUES(4,'domi',2);

1.关联查询
查询Java班的所有学生

select * from student where classid=(select cid from class where cname=‘Java’);

2.关于关联关系的删除数据
请从班级表中删除Java班级。在此,请注意:班级表和学生表之间存在关联关系;要删除Java班级,应该先删除学生表中与该班相关联的学生。否则,假若先删除Java班那么学生表中的cid就失去了关联
删除Java班 MySQL命令:

delete from student where classid=(select cid from class where cname=‘Java’);
delete from class where cname=‘Java’;

九、多表链接查询

1.交叉连接查询
交叉连接返回的结果是被连接的两个表中所有数据行的笛卡儿积;比如:集合A={a,b},集合B={0,1,2},则集合A和B的笛卡尔积为{(a,0),(a,1),(a,2),(b,0),(b,1),(b,2)}。所以,交叉连接也被称为笛卡尔连接,其语法格式如下:
SELECT * FROM 表1 CROSS JOIN 表2;
在该语法中:CROSS JOIN用于连接两个要查询的表,通过该语句可以查询两个表中所有的数据组合。

2.内连接查询
内连接(Inner Join)又称简单连接或自然连接,是一种非常常见的连接查询。内连接使用比较运算符对两个表中的数据进行比较并列出与连接条件匹配的数据行,组合成新的记录。也就是说在内连接查询中只有满足条件的记录才能出现在查询结果中。其语法格式如下:

SELECT 查询字段1,查询字段2, … FROM 表1 [INNER] JOIN 表2 ON 表1.关系字段=表2.关系字段

在该语法中:INNER JOIN用于连接两个表,ON来指定连接条件;其中INNER可以省略。

3.外连接查询
在使用内连接查询时我们发现:返回的结果只包含符合查询条件和连接条件的数据。但是,有时还需要在返回查询结果中不仅包含符合条件的数据,而且还包括左表、右表或两个表中的所有数据,此时我们就需要使用外连接查询。外连接又分为左(外)连接和右(外)连接。其语法格式如下:

SELECT 查询字段1,查询字段2, … FROM 表1 LEFT | RIGHT [OUTER] JOIN 表2 ON 表1.关系字段=表2.关系字段 WHERE 条件
1
由此可见,外连接的语法格式和内连接非常相似,只不过使用的是LEFT [OUTER] JOIN、RIGHT [OUTER] JOIN关键字。其中,关键字左边的表被称为左表,关键字右边的表被称为右表;OUTER可以省略。
在使用左(外)连接和右(外)连接查询时,查询结果是不一致的,具体如下:
1、LEFT [OUTER] JOIN 左(外)连接:返回包括左表中的所有记录和右表中符合连接条件的记录。
2、RIGHT [OUTER] JOIN 右(外)连接:返回包括右表中的所有记录和左表中符合连接条件的记录。

十、子查询

子查询是指一个查询语句嵌套在另一个查询语句内部的查询;该查询语句可以嵌套在一个 SELECT、SELECT…INTO、INSERT…INTO等语句中。在执行查询时,首先会执行子查询中的语句,再将返回的结果作为外层查询的过滤条件。在子査询中通常可以使用比较运算符和IN、EXISTS、ANY、ALL等关键字。

1.带比较运算符的子查询
比较运算符前面我们提到过得,就是>、<、=、>=、<=、!=等

查询张三同学所在班级的信息 MySQL命令:

select * from class where cid=(select classid from student where sname=‘张三’);

2.带EXISTS关键字的子查询
EXISTS关键字后面的参数可以是任意一个子查询, 它不产生任何数据只返回TRUE或FALSE。当返回值为TRUE时外层查询才会 执行

假如王五同学在学生表中则从班级表查询所有班级信息 MySQL命令:

select * from class where exists (select * from student where sname=‘王五’);

3.带ANY关键字的子查询
ANY关键字表示满足其中任意一个条件就返回一个结果作为外层查询条件。

查询比任一学生所属班级号还大的班级编号 MySQL命令:

select * from class where cid > any (select classid from student);

4.带ALL关键字的子查询
ALL关键字与ANY有点类似,只不过带ALL关键字的子査询返回的结果需同时满足所有内层査询条件。

查询比所有学生所属班级号还大的班级编号 MySQL命令:

select * from class where cid > all (select classid from student);

十一、层级结构

数据库系统的目标之一就是方便用户去使用数据库,然而数据库系统本身说到底是01序列,这显然不方便开发者开发和普通用户去使用。那么数据库系统就应该隐藏掉数据的存储和维护细节,提供数据的抽象视图,方便各类用户去使用。
  为了满足上述的目标,最终提出了数据库系统三层结构:物理层 、逻辑层、视图层(抽象层次逐步提高)。
1:物理层
物理层是最低级的抽象,它描述的是 数据是怎样存储的,比如数据的存储路径,数据的存储方式,数据的索引方式等等,这个层次仍然很复杂。
2:逻辑层
逻辑层是对物理层的进一步抽象,它描述的是数据库有什么数据、以及数据之间的关系。逻辑层相比物理层结构要更加简单,它很好地描述了整个数据库的全貌。数据库管理员和程序开发者通常都工作在这个层次上,而无需了解复杂的底层物理结构。
3:视图层
 视图层是对逻辑层进一步的抽象,它描述的是数据库的一部分。简单来说,就是普通用户没必要知道整个数据库,当然,处于安全性考虑,我们也不能让普通用户知道整个数据库。整个数据库相对于普通用户来说,仍然是复杂的,所以数据库系统只需提供普通用户所需要的相应的视图,方便用户使用即可。
4:三者关系
需要注意的是 ,物理层也被称作是内部层,逻辑层也被称作是概念层,视图层也被称作是外部层。
在这里插入图片描述
 最后,截取书上的例子来进一步说明个人的理解。下面的图定义了一个类型 instructor。
在这里插入图片描述

  • 物理层描述的是数据是怎样存储的。也就是说,物理层描述的是ID、name、dept_name、salary存储在哪里,怎样存储的(是数组还是链表)等等。
  • 逻辑层描述的是有什么数据、以及数据之间的关系。有什么数据说的是数据和其对应的类型,如name对应着char数组。数据之间的关系可以这样理解,除了有instructor类以外,不难想象有student类,以及course类,这三者之间必然存在联系。
  • 视图层描述的是数据库的一部分,不同的用户只需要看到他对应的视图即可。如学生就应该看到course 和student的全部,而不能看到instructor的全部信息(如salary)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

全栈游戏开发

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值