MySQL数据库课件.doc_第1页
MySQL数据库课件.doc_第2页
MySQL数据库课件.doc_第3页
MySQL数据库课件.doc_第4页
MySQL数据库课件.doc_第5页
已阅读5页,还剩75页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

_第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 ductId = ductId 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)EXISTS 和 NOT EXISTS 子查询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语句,在没有索引的情况下,数据库会遍历全部200条数据后选择符合条件的;而有了相应的索引之后, 数据库会直接在索引中查

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论