收藏 分销(赏)

MySQL数据库课件.pdf

上传人:快乐****生活 文档编号:4710576 上传时间:2024-10-10 格式:PDF 页数:87 大小:2.77MB
下载 相关 举报
MySQL数据库课件.pdf_第1页
第1页 / 共87页
MySQL数据库课件.pdf_第2页
第2页 / 共87页
点击查看更多>>
资源描述
第 1 章 数据库简介 1.数据库的概念 数据库(Database)是按照数据结构来组织、存储和管理数据的仓库,每个数据库都有一个或多个不同的 API 用于创建,访问,管理,搜索和复制所保存的数据。我们也可以将数据存储在文件中,但是在文件中读写数据速度相对较慢。所以,现在我们使用关系型数据库管理系统(RDBMS)来存储和管理的大数据量。所谓的关系型数据库,是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。RDBMS 即关系数据库管理系统(Relational Database Management System)的特点:1.数据以表格的形式出现2.每行为各种记录名称3.每列为记录名称所对应的数据域4.许多的行和列组成一张表单5.若干的表单组成 databaseRDBMS 术语在我们开始学习 My SQL 数据库前,让我们先了解下 RDBMS 的一些术语:数据库:数据库是一些关联表的集合。.数据表:表是数据的矩阵。在一个数据库中的表看起来像一个简单的电子表格。列:一列(数据元素)包含了相同的数据,例如邮政编码的数据。行:一行(=元组,或记录)是一组相关的数据,例如一条用户订阅的数据。冗余:存储两倍数据,冗余可以使系统速度更快。主键:主键是唯一的。一个数据表中只能包含一个主键。你可以使用主键来查询数据。外键:外键用于关联两个表。复合键:复合键(组合键)将多个列作为一个索引键,一般用于复合索引。索引:使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构。类似于书籍的目录。参照完整性:参照的完整性要求关系中不允许引用不存在的实体。与实体完整性是关系模型必须满足的完整性约束条件,目的是保证数据的一致性。My SQL 数据库My SQL 是一个关系型数据库管理系统,由瑞典 My SQL AB 公司开发,目前属于Oracle 公司。My SQL 是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。My SQL 是开源的,所以你不需要支付额外的费用。My SQL 支持大型的数据库。可以处理拥有上千万条记录的大型数据库。My SQL 使用标准的 SQL 数据语言形式。My SQL 可以允许于多个系统上,并且支持多种语言。这些编程语言包括C、C+、Python、Java、Perl、PHP、Eiffel、Ruby 和 TCL 等。My SQL 对 PHP 有很好的支持,PHP 是目前最流行的 Web 开发语言。My SQL 支持大型数据库,支持 5000 万条记录的数据仓库,32 位系统表文件最大可支持 4GB,64 位系统支持最大的表文件为 8TB。My SQL 是可以定制的,采用了 GPL 协议,你可以修改源码来开发自己的 My SQL 系统。第 2 章 My SQL 数据库的安装与配置1.所需 My SQL 安装包mysql-5.0.41_Setup.EXE2.安装方法步骤图解1运行安装程序下一步 2.选择“Custom”自定义安装,下一步 3.这里可以将不需要的安装删除,可以更改安装目录,下一步 4.单击“Install”按钮,开始安装 5.安装中,耐心等一会儿 6.这里是询问你是否要注册一个 My SQL.com 的账号,或是使用已有的账号登陆 My SQL.com,一般不需要了,点选“Skip Sign-Up”,按“Next”略过此步骤。7.安装完成出现如下界面 现在软件安装完成了,出现上面的界面,这里有一个很好的功能,My SQL 配置向导,不用向以前一样,自己手动乱七八糟的配置 my.INI 了,将“Configure the My SQL Server now”前面的勾打上,点“Finish”结束软件的安装并启动 My SQL 配置向导。8.进入配置过程 9.选择配置方式 选择配置方式,“Detailed Configuration(手动精确配置)”、“Standard Configuration(标准配置)”,我们选择“Detailed Configuration”,方便熟悉配置过程。10.选择服务器类型,“Developer Machine(开发测试类,My SQL 占用很少资源)”、“Server Machine(服务器类型,My SQL 占用较多资源)”、“Dedicated My SQL Server Machine(专门的数据库服务器,My SQL 占用所有可用资源)”,大家根据自己的类型选择了,一般选“Server Machine”,不会太少,也不会占满。11.选择 My SQL 数据库的大致用途,“MULTI functional Database(通用多功能型,好)”、“Tran Sac TIONAL Database Only(服务器类型,专注于事务处理,一般)”、“Non-Tran Sac TIONAL Database Only(非事务处理型,较简单,主要做一些监控、记数用,对 MYL SAM 数据类型的支持仅限于 Non-Tran Sac TIONAL),随自己的用途而选择了,我这里选择“Tran Sac TIONAL Database Only”,按“Next”继续。12.对 INNODB Table space 进行配置,就是为 INNODB 数据库文件选择一个存储空间,如果修改了,要记住位置,重装的时候要选择一样的地方,否则可能会造成数据库损坏,当然,对数据库做个备份就没问题了,这里不详述。我这里没有修改,使用用默认位置,直接按“Next”继续 13.选择您的网站的一般 My SQL 访问量,同时连接的数目,“Decision Support(DSS)/OLAP(20 个左右)”、“Online Transaction Processing(OLTP)(500 个左右)”、“Manual Setting(手动设置,自己输一个数)”,我这里选“Online Transaction Processing(OLTP)”,自己的服务器,应该够用了,按“Next”继续 14.是否启用 TCP/IP 连接,设定端口,如果不启用,就只能在自己的机器上访问 My SQL 数据库了,我这里启用,把前面的勾打上,Port Number:3306,在这个页面上,您还可以选择“启用标准模式”(Enable Strict Mode),这样 My SQL 就不会允许细小的语法错误。如果您还是个新手,我建议您取消标准模式以减少麻烦。但熟悉 My SQL 以后,尽量使用标准模式,因为它可以降低有害数据进入数据库的可能性。按“Next”继续 15.这个比较重要,就是对 My SQL 默认数据库语言编码进行设置,第一个是西文编码,第二个是多字节的通用 utf8 编码,都不是我们通用的编码,这里选择第三个,然后在 Character Set 那里选择或填入“GBK”,当然也可以用“gb2312”,区别就是 GBK 的字库容量大,包括了 gb2312 的所有汉字,并且加上了繁体字、和其它乱七八糟的字使用 My SQL 的时候,在执行数据操作命令之前运行一次“SET NAMES GBK;”(运行一次就行了,GBK 可以替换为其它值,视这里的设置而定),就可以正常的使用汉字(或其它文字)了,否则不能正常显示汉字。按“Next”继续。16.选择是否将 My SQL 安装为 windows 服务,还可以指定 Service Name(服务标识名称),是否将 My SQL 的 bin 目录加入到 Windows PATH(加入后,就可以直接使用 bin 下的文件,而不用指出目录名,比如连接,“My SQL.EXE-UUSER Name-PPASS word;”就可以了,不用指出 My SQL.EXE 的完整地址,很方便),我这里全部打上了勾,Service Name 不变。按“Next”17 这一步询问是否要修改默认 root 用户(超级管理)的密码(默认为空),“New root password”如果要修改,就在此填入新密码(如果是重装,并且之前已经设置了密码,在这里更改密码可能会出错,请留空,并将“Modify Security Settings”前面的勾去掉,安装配置完成后另行修改密码),“Confirm(再输一遍)”内再填一次,防止输错。“Enable root access from remote machines(是否允许 root 用户在其它的机器上登陆,如果要安全,就不要勾上,如果要方便,就勾上它)”。最后“Create An Anonymous Account(新建一个匿名用户,匿名用户可以连接数据库,不能操作数据,包括查询)”,一般就不用勾了,设置完毕,按“Next”继续。18.确认设置无误,如果有误,按“Back”返回检查。按“Execute”使设置生效。19.设置完毕,按“Finish”结束 My SQL 的安装与配置这里有一个比较常见的错误,就是不能“Start service”,一般出现在以前有安装 My SQL 的服务器上,解决的办法,先保证以前安装的 My SQL 服务器彻底卸载掉了;不行的话,检查是否按上面一步所说,之前的密码是否有修改,照上面的操作;如果依然不行,将 My SQL 安装目录下的 data 文件夹备份,然后删除,在安装完成后,将安装生成的 data 文件夹删除,备份的 data 文件夹移回来,再重启 My SQL 服务就可以了,这种情况下,可能需要将数据库检查一下,然后修复一次,防止数据出错。安装路径不要带有中文!也不能有空格括号之类的,否则就会遇到下图显示的错误 到此我们的 My SQL 安装配置完成,我们需要测试 My SQL 是否真的安装配置成功。在我们的 CMD 命令行下输入 net start My SQL看是否能启动服务;使用工具 NAVI cat Lite for My SQL看是否能够链接到 My SQL 数据库 第 3 章 数据库和表的操作1.SQL 语句分类 DQL(Data Query Language,数据查询语言)查询数据库中的数据 SELECT DML(Data Manipulation Language,数据操作语言)插入、删除和修改数据库中的数据;INSERT、UPDATE、DELETE 等;DCL(Data Control Language,数据控制语言)用来控制存取许可、存取权限等;GRANT、REVOKE 等;DDL(Data Definition Language,数据定义语言)用来建立数据库、数据库对象和定义其列 CREATE、DROP 等事务控制语言(Tran Sac TIONAL Control Language,TCL)COMMIT、ROLLBACK2.SQL 语句书写规则 书写 SQL 语句应遵循以下规则:SQL 语句不区分大小写 字符值和日期值区分大小写 SQL 语句可以写成一行或多行 关键字不能简写或分割于多行 子句通常置于单独行这样更具可读性并便于编辑 Tab 和缩进的使用可以提高程序的可读性 关键字最好大写,其他词诸如表名、列名使用小写3.SQL 中的注释:SQL 标准:多行注释:/*/。单行注释:-My SQL:“#”4.数据库对象的命名规则 必须以字母开头 可包括数字和三个特殊字符(#_$)不要使用 My SQL 的保留字(保留字与关键字 My SQL 数据库系统的 用户只能使用,不能用它来定义 表的名称与字段名)同一 Schema 下的对象不能同名5.列类型 My SQL 支持多种列类型:数值类型、日期/时间类型、字符串(字符)类型My SQL 中的数值数据类型:数值数据类型-整数 数值数据类型-浮点数 日期/时间类型 字符串类型数据库的操作查看数据库:show databases;创建数据库:create database if not exists 数据库名;删除数据库:drop database 数据库名;使用数据库 use 数据库名表的操作显示当前数据库中已有的数据表的信息:show tables;查看数据表中各列的信息:DESCRIBE|DESC 表名 列名;查看表的详细结构:show create table 表名G;备注:如果不加”G”参数,显示的结果可能非常混乱;加上该参数可以使结果更加直观,易于查看。创建表:CREATE TABLE 表名(列名 列类型,列名 列类型);删除表:DROP TABLE 表名修改表结构:增加列ALTER TABLE 表名 ADD 列名 列类型;修改列类型ALTER TABLE 表名 MODIFY 列名 列类型;列改名ALTER TABLE 表名 CHANGE 旧列名 新列名 列类型;删除列ALTER TABLE 表名 DROP 列名;更改表名ALTER TABLE 表名 RENAME 新表名;RENAME TABLE 表名 TO 新表名;支持一次重命名多个表。RENAME TABLE old_table1 TO tmp_table,new_table TO old_table,tmp_table TO new_table;表的约束:约束约束用于确保数据库数据满足特定的商业规则。约束是表级的强制规定,约束可分为列级、表级约束两种:列级约束是字段定义的一部分,只能应用在一个列上表级约束是独立于列的定义定义约束的关键字 constraint。大部分数据库都支持以下五种约束:NOT NULL(非空)如果在列上定义了 not null,那么当插入数据时,必须为列提供数据。not null 约束只能定义在列级;UNIQUE(唯一):当定义了唯一约束后,该列值不能是重复的,但是可以为 null。被定义的唯一性约束,会自动建立一个唯一性的索引;UNIQUE 约束既可以定义在列级,也可以定义在表级;注意:如果字段定义为 UNIQUE 约束时,允许包含多个 NULL 值。PRIMARY KEY(主键)用于唯一的标识表行的数据,当定义主键约束后,该列不但不能重复而且不能为 null。需要说明的是:一张表最多只能有一个主键,但是可以有多个 unique 约束。My SQL 中会自动产生主键索引;主键约束既可以定义在列级,也可以定义在表级;FOREIGN KEY(外键)用于定义主表和从表之间的关系。外键约束要定义在从表上,主表则必须具有主键约束或是 unique 约束,当定义外键约束后,要求外键列数据必须在主表的主键列存在或是为null。一个表中可以定义多个外键约束;My SQL 中会自动产生外键键索引;外键约束既可以定义在列级,也可以定义在表级;CHECK(检查)检查性约束,检查输入的每一个数据,只有符合条件的数据才允许插入到 表中。check 表达式的结果必须是一个布尔值check 约束既可以定义在列级也可以定义在表级。所有的存储引擎均对 CHECK 子句进行分析,但是忽略 CHECK 子句。添加约束 可增加或删除约束,但不能直接修改;可使约束启用和禁用只要是可以使用表级约束语法来定义的约束,都可以通过 add constraint 来增加该约束。语法:ALTER TABLE tableADD CONSTRAINT constraint_name type(column);非空约束必须使用 MODIFY 子句增加ALTER TABLE table MODIFY column type not null;添加约束示例给学生表添加约束:1.将 sid 设为主键alter table stu add constraint pk_sid primary key(sid);2.为 sname 添加唯一约束alter table stu add constraint uq_sname unique(sname);3.性别默认为男alter table stu modify sex char(2)default 男;注意:默认值不是约束,要加默认值可以在建表时添加或修改表结构。4.性别为非空alter table stu modify sex char(2)not null;5.给 classId 添加外键alter table stu add constraint fk_classId foreign key(classId)references classes(classId);删除定义的约束删除定义的约束删除约束示例:删除主键约束 alter table stu drop primary key;注意:如果主键列有自增长列,必须先删除自增长,再删除主键:alter table stu change tno tno int(11);删除 not null 约束alter table stu modify sex char(2);删除唯一约束 alter table stu drop index uq_tname;删除外键约束alter table stu drop foreign key fk_stu_sc;表级约束和列级约束列级定义:是在定义列的同时定义约束如在 classes 表定义主键约束:create table classes(classId number(2)constraint pk_cid primary key,-给约束取名字cname varchar2(12);表级定义:是指在定义了所有列后,再定义约束。注意:not null 约束只能在列级上定义。以建立 stu 表时定义主键约束和外键约束为例:creat table stu(sid number(4),sname varchar2(20),classid number(2),constraint pk_sid primary key(sid),constraint uq_sname unique(sname);自动增长和默认值作业:创建数据库:school在其中创建表:stu,course,sc添加相应的约束信息。第 4 章 数据更新操作1 课程学习目标:数据的增加 数据的修改数据的删除2.插入数据 INSERT INSERT 语句用于完成各种向数据表中插入数据的功能,可以对列赋值一次插入一条记录,也可以根据 select 查询子句获得的结果记录集批量插入指定数据表。语法格式:1.所有字段都插入:INSERT INTO 表名 VALUES(value1,value2,value3.);2.插入部分字段:INSERT INTO 表名(column1,column2,column3,.)VALUES(value1,value2,value3,.);注意:1 插入空值可以用 null,默认值用 default。2 可以使用 last_insert_id()函数获取上一条 insert 命令生成的auto_increment 值。这是一个面向连接的函数,只对本次会话有效。、插入数据时的注意事项:注意事项 1:每次插入一行数据,不可能只插入半行或者几列数据,因此,插入的数据是否有效将按照整行的完整性的要求来检验;注意事项 2:每个数据值的数据类型、精度和小数位数必须与相应的列匹配;注意事项 3:如果在设计表的时候就指定了某列不允许为空,则必须插入数据;注意事项 4:插入的数据项,要求符合检查约束的要求注意事项 5:具有缺省值的列,可以使用 DEFAULT(缺省)关键字来代替插入的数值;允许为空值的列,可以使用 NULL 关键字来插入空值。修改数据 UPDATE UPDATE 语句用于修改表中一列或多列的值,使用 where 子句限制修改的行。语法格式:UPDATE 表名 SET column1=value1,column2=value2,.WHERE 条件;删除数据 DELETEDELETE 语句向用户提供了删除数据的功能,同 UPDATE 语句一样限定表中哪些行将被删除。语法格式:DELETE FROM 表名 WHERE 条件;TRUNCATE TABLE 表名;二者关系:TRUNCATE TABLE 在功能上与不带 WHERE 子句的 DELETE 语句相同,二者均删除表中的全部行。但 TRUNCATE TABLE 速度快,但不可以回滚;DELETE 速度慢,但可以回滚。第五章 数据库查询查询基本语法(单表查询):SELECT FROM WHERE ORDER BY ASC 或 DESC查询全部的行和列select*from stu;查询部分的列:select sid,sname,sex,age from stu;查询满足条件的行的部分列:select sid,sname,sex from stu where age=20;SQL 操作符算术运算符:+-*/%如:select sal*12 from emp;关系运算符:=!=或 between,in,like,is null,注意:字符类型不区分大小写,binary 类型区分大小写;如果字符串的后面有空白符,则会自动忽略。逻辑运算符:and or not,&,|,!基本查询怎样消除重复行:select distinct deptno,job from emp;使用别名:格式:列名 别名 或 列名 as 别名如:select empno,sal*12“年工资”from emp;或 select empno,sal*12 as“年工资”from emp;注意:1.如果别名中使用特殊字符,或者是强制大小写敏感,或有空格时,都可以通过为别名添加加双引号实现。2.where 子句中不能使用别名。null 值:空值是指不可用、未分配的值空值不等于零或空格任意类型都可以支持空值包括空值的任何算术表达式都等于空字符串和 null 进行连接运算,得到也是 null.如何查询 null 值:使用 is nullselect *from emp where comm is null;select *from emp where comm is not null;通配符使用通配符进行模糊查询:如:查询名字以 S 开头的员工:select*from emp where ename like S%;基本查询使用逻辑操作指定多个查询条件select empno,ename,job,sal from emp where ename=SMITH or ename=FORD;在 where 条件中使用 in:如:查询 SMITH,FORT,KING 的员工号、工作,薪水select empno,ename,job,sal from emp where ename in(SMITH,FORD,KING);在 where 条件中使用 between and:select empno,ename,job,sal from emp where sal between 1000 and 2000;注意:数据库执行 sql 语句时是从右到左的顺序,所以尽可能把最优化条件写右边。基本查询排序使用 order by 子句进行排序:排序的类型为两种升序 asc、降序 desc。数字、日期、字符串可以进行排序。NULL 认为是排序中的最大值。排序方式:按单个列排序select*from emp order by sal desc;按多列排序select*from emp order by sal desc,empno;按别名排序select ename,sal*12“年薪”from emp order by“年薪”asc;一次插入多条语句select into 语句语句形式为:create table table2 select vale1,value2 from table1;要求:目标表 table2 不存在,因为在插入时会自动创建表 table2,并将 table1 中指定字段数据复制到 table2 中。insert into select from 语句形式为:insert into table2(column1,column2)select col1,col2 from table1;要求:目标表 table2 已创建好,且从 table1 表查询出来的列类型应与 table2 中列的类型一致。nsert into select value union select value语句形式为:insert into table2(column1,column2)select value1_1,value1_2 union select value2_1,value2_1 union ;作用:将多行值一次性插入到表中。要求:目标表 table2 已创建好。常用的聚合函数:分组查询:GROUP BYSELECT 列名(条件),MAX(结果列名)AS 要求查询的结果显示列名FROM 表名GROUP BY 列名(条件)分组查询多列分组:SELECT 列名 1(条件),列名 2(条件),AVG(结果列名)AS 要求查询的结果显示列名FROM 表名GROUP BY 列名 1(条件),列名 2(条件)分组查询HAVING:HAVING 的使用 HAVING 通常是在 GROUP BY 的后面SELECT 列名 1(条件),列名 2(条件),AVG(结果列名)AS 平均成绩FROM 表名GROUP BY 列名 1(条件),列名 2(条件)HAVING avg(结果列名)10条件分组查询:WHERE 子句从数据源中去掉不符合其搜索条件的数据GROUP BY 子句搜集数据行到各个组中,统计函数为各个组计算统计值HAVING 子句去掉不符合其组搜索条件的各组数据行ORDER BY 排序使用顺序 先 WHERE 接着 1 GROUP BY 接着 2 HAVING 最后 ORDER BY with rollup如果 group by 子句里只有一个数据列,加上 with rollup 关键字的效果是将在查询结果的最后一行将自动添加一条总数统计记录。如果按多列分组,将会进行阶段性总和(相当于“小计”),最后再为全体记录统计一个最终的总和(相当于“总计”)。例:select sno,count(*),avg(score)from sc group by sno with rollup;统计函数的使用:SELECT 字段名,group_concat(DISTINCT 要连接的字段 Order BY ASC/DESC 排序字段 Separator 分隔符)多表联接查询内联:INNER JOIN外联:左外联接 (LEFT JOIN)右外联接 (RIGHT JOIN)完整外联接(FULL JOIN)-My SQL 5.0 暂不支持交叉联接(CROSS JOIN)内联查询:NNER JOIN 叫做等值连接(2 个表联接)SQL 语法:SELECT*FROM 表名 1 INNER JOIN 表名 2 ON 表名 1.与表名 2 相同的字段=表名 2.与表名 1 相同的字段 多表联接:SELECT*FROM(表 1 INNER JOIN 表 2 ON 表 1.字段号=表 2.字段号)INNER JOIN 表 3 ON 表 1.字段号=表 3.字段号 SELECT*FROM(表 1 INNER JOIN 表 2 ON 表 1.字段号=表 2.字段号)INNER JOIN 表 3 ON 表 1.字段号=表 3.字段号)INNER JOIN 表 4 ON Member.字段号=表 4.字段号SELECT*FROM(表 1 INNER JOIN 表 2 ON 表 1.字段号=表 2.字段号)INNER JOIN 表 3 ON 表 1.字段号=表 3.字段号)INNER JOIN 表 4 ON Member.字段号=表 4.字段号)INNER JOIN 表 5 ON Member.字段号=表 5.字段号 左外联接:显示左表 T1 中的所有行,并把右表 T2 中符合条件加到左表 T1 中;右表 T2 中不符合条件,就不用加入结果表中,并且 NULL 表示。SQL 语法:select*from T1 left outer join T2 on T1.userid=T2.userid右联(right outer join)。显示右表 T2 中的所有行,并把左表 T1 中符合条件加到右表 T2 中;左表 T1 中不符合条件,就不用加入结果表中,并且 NULL 表示SQL 语句:select*from T1 right outer join T2 on T1.userid=T2.userid第四:全联(full outer join)。显示左表 T1、右表 T2 两边中的所有行,即把左联结果表+右联结果表组合在一起,然后过滤掉重复的。SQL 语句:select*from T1 full outer join T2 on T1.userid=T2.userid更新关联数据表里的数据记录1.修改关联数据表里 的数据记录使用 updata 命令在一条 SQL 语句中对多个表中 的数据记录做出修改语法:UPDATE product p INNER JOIN productPrice pp ON p.productId=pp.productId SET pp.price=pp.price*0.8,p.dateUpdate=CURDATE()WHERE p.dateCreated ANY(SELECT s2 FROM table2)在子查询中,返回的是 table2 的所有 s2 列结果(5,12,20),然后将 table1 中的 s1 的值与之进行比较,只要大于 s2 的任何值即表示为 TRUE,符合查询条件。IN 是=ANY 的别名,二者相同,但 NOT IN 的别名却不是 ANY 而是 SOME。特殊情况特殊情况 如果 table2 为空表,则 ANY 后的结果为 FALSE;如果子查询返回如(NULL,NULL,NULL)列为空的结果,则 ANY 后的结果为 UNKNOWN。ALL 操作符:ALL 关键字必须接在一个比较操作符的后面,表示与子查询返回的所有值比较为 TRUE,则返回 TRUE例子:SELECT s1 FROM table1 WHERE s1 ALL(SELECT s2 FROM table2)该查询不会返回任何结果,因为 s1 中没有比 s2 所有值都大的值。当然在该例子查询中,返回了 s2 的所有值,您可以在该子查询中添加任何条件以限制返回的查询结果而无需全部返回。NOT IN 是 ALL 的别名,二者相同。特殊情况特殊情况 如果 table2 为空表,则 ALL 后的结果为 TRUE;如果子查询返回如(0,NULL,1)这种尽管 s1 比返回结果都大,但有空行的结果,则 ALL 后的结果为 UNKNOWN。行子查询:例子:FROM 子查询:FROM 子查询是指 FROM 的子句作为子查询语句,主查询再到子查询结果中获取需要的数据语法:SELECT.FROM(subquery)AS name.子查询会生成一个临时表,由于 FROM 子句中的每个表必须有一个名称,因此 AS name 是必须的。FROM 子查询也称为衍生数据表子查询。标量子查询标量子查询标量子查询是指子查询返回的是单一值的标量,如一个数字或一个字符串,也是子查询中最简单的返回形式一个标量子查询的例子如下:SELECT*FROM article WHERE uid=(SELECT uid FROM user WHERE status=1 ORDER BY uid DESC LIMIT 1)在该例子中,子查询语句:SELECT uid FROM user WHERE status=1 ORDER BY uid DESC LIMIT 1返回的是单一的数字(如 2),实际的查询语句为:SELECT*FROM article WHERE uid=2使用子查询进行比较使用子查询进行比较可以使用=这些操作符对子查询的标量结果进行比较,通常子查询的位置在比较式的右侧:SELECT*FROM t1 WHERE column1=(SELECT MAX(column2)FROM t2)提示提示 对于采用这些操作符之一进行的比较,子查询必须返回一个标量。唯一的例外是 可以和行子查询同时使用。子查询与表连接子查询与表连接在很多情况下,子查询的效果与 JOIN 表连接很类似,但一些特殊情况下,是必须用子查询而不能用表连接的,如:SELECT*FROM t1 WHERE column1=(SELECT MAX(column2)FROM t2)SELECT*FROM article AS t WHERE 2=(SELECT COUNT(*)FROM article WHERE article.uid=t.uid)EXISTSEXISTS 和和 NOTNOT EXISTSEXISTS 子查询子查询EXISTS 和 NOT EXISTS 子查询语法如下:SELECT.FROM table WHERE EXISTS(subquery)该语法可以理解为:将主查询的数据,放到子查询中做条件验证,根据验证结果(TRUE 或 FALSE)来决定主查询的数据结果是否得以保留。例子:从语句执行结果可以看出,article 表中第 4 条记录没有被保留,原因就是该条记录的数据在子查询中返回的结果是 FALSE。当上面的 SQL 使用 NOT EXISTS 时,查询的结果就是 article 表中 uid 不存在于 user 表中的数据记录。提示提示EXISTS(subquery)只返回 TRUE 或 FALSE,因此子查询中的 SELECT*也可以是 SELECT 1 或其他,官方说法是实际执行时会忽略 SELECT 清单,因此没有区别。EXISTS 子查询的实际执行过程可能经过了优化而不是我们理解上的逐条对比,如果担忧效率问题,可进行实际检验以确定是否有效率问题。EXISTS 子查询往往也可以用条件表达式、其他子查询或者 JOIN 来替代,何种最优需要具体问题具体分析。关联子查询:关联子查询是指一个包含对表的引用的子查询,该表也显示在外部查询中。通俗一点来讲,就是子查询引用到了主查询的数据数据。以一个实际的例子来理解关联子查询:将该例 SQL 与如下语句比较更能看出关联子查询与普通子查询的区别:SELECT*FROM article WHERE uid IN(SELECT uid FROM user)在本实例中,虽然两个 SQL 执行后的返回结果都一样,但它们的实现过程是完全不一样的。后者(普通子查询)实际被执行为:SELECT*FROM article WHERE uid IN(1,2,3)但在关联子查询中,是无法单独执行子查询语句的。其实际流程大致为:1.先做外部主查询;2.将主查询的值传入子查询并执行;3.子查询再将查询结果返回主查询,主查询根据返回结果完成最终的查询。这个执行流程类似于 EXISTS 子查询,实际上某些情况下 MySQL 就是将关联子查询重写为 EXISTS 子查询来执行的。关联子查询效率关联子查询效率很明显,一般情况下关联子查询的效率是比较低下的,实际上本例中的关联子查询例子也仅是为了演示关联子查询的原理及用法。如果可以的话,关联子查询尽量使用 JOIN 或其他查询来代替。如本例中,使用 INNER JOIN 来替换的 SQL 为:SELECT article.*FROM article INNER JOIN user ON article.uid=user.uid注意:此处只是为了演示用 INNER JOIN 替换关联子查询的样例,并非表名这种处理是最优处理。第 6 章 索引、视图、事务索引的概念:索引是一种特殊的文件(InnoDB 数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。更通俗的说,数据库索引好比是一 本书前面的目录,能加快数据库的查询速度。上述 SQL 语句
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传
相似文档                                   自信AI助手自信AI助手

当前位置:首页 > 通信科技 > 数据库/数据算法

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服