




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、-. z.数据库简介数据库的概念数据库Database是按照数据构造来组织、存储和管理数据的仓库,每个数据库都有一个或多个不同的API用于创立,访问,管理,搜索和复制所保存的数据。我们也可以将数据存储在文件中,但是在文件中读写数据速度相对较慢。所以,现在我们使用关系型数据库管理系统RDBMS来存储和管理的大数据量。所谓的关系型数据库,是建立在关系模型根底上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。RDBMS即关系数据库管理系统(Relational Database Management System)的特点:1.数据以表格的形式出现2.每行为各种记录名称3.每列为记录名称
2、所对应的数据域4.许多的行和列组成一*表单5.假设干的表单组成databaseRDBMS 术语在我们开场学习My SQL 数据库前,让我们先了解下RDBMS的一些术语:数据库:数据库是一些关联表的集合。.数据表:表是数据的矩阵。在一个数据库中的表看起来像一个简单的电子表格。列:一列(数据元素) 包含了一样的数据, 例如邮政编码的数据。行:一行=元组,或记录是一组相关的数据,例如一条用户订阅的数据。冗余:存储两倍数据,冗余可以使系统速度更快。主键:主键是唯一的。一个数据表中只能包含一个主键。你可以使用主键来查询数据。外键:外键用于关联两个表。复合键:复合键组合键将多个列作为一个索引键,一般用于复
3、合索引。索引:使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进展排序的一种构造。类似于书籍的目录。参照完整性:参照的完整性要求关系中不允许引用不存在的实体。与实体完整性是关系模型必须满足的完整性约束条件,目的是保证数据的一致性。My SQL数据库My SQL是一个关系型数据库管理系统,由瑞典My SQL AB公司开发,目前属于Oracle公司。My SQL是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。My SQL是开源的,所以你不需要支付额外的费用。My SQL支持大型的数据库。可以处理拥
4、有上千万条记录的大型数据库。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系统。-. z.My SQL数据库的安装与配置所需My SQL安装包mysql-5.0.41_
5、Setup. E*E安装方法步骤图解1运行安装程序下一步选择“Custom自定义安装,下一步这里可以将不需要的安装删除,可以更改安装目录,下一步单击“Install按钮,开场安装安装中,耐心等一会儿6.这里是询问你是否要注册一个My SQL.的账号,或是使用已有的账号登陆My SQL.,一般不需要了,点选“Skip Sign-Up,按“Ne*t略过此步骤。7.安装完成出现如下界面现在软件安装完成了,出现上面的界面,这里有一个很好的功能, My SQL配置向导,不用向以前一样,自己手动乱七八糟的配置my.INI了,将 “Configure the My SQL Server now前面的勾打上,
6、点“Finish完毕软件的安装并启动 My SQL配置向导。进入配置过程选择配置方式选择配置方式,“Detailed Configuration手动准确配置、“Standard Configuration标准配置,我们选择“Detailed Configuration,方便熟悉配置过程。10.选择效劳器类型,“Developer Machine开发测试类,My SQL占用很少资源、“Server Machine效劳器类型,My SQL占用较多资源、“Dedicated My SQL Server Machine专门的数据库效劳器,My SQL占用所有可用资源,大家根据自己的类型选择了,一般选“
7、Server Machine,不会太少,也不会占满。选择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,按“Ne*t继续。对INNODB Table space进
8、展配置,就是为INNODB 数据库文件选择一个存储空间,如果修改了,要记住位置,重装的时候要选择一样的地方,否则可能会造成数据库损坏,当然,对数据库做个备份就没问题了,这里不详述。我这里没有修改,使用用默认位置,直接按“Ne*t继续选择您的的一般My SQL访问量,同时连接的数目,“Decision Support(DSS)/OLAP20个左右、“Online Transaction Processing(OLTP)500个左右、“Manual Setting手动设置,自己输一个数,我这里选“Online Transaction Processing(OLTP),自己的效劳器,应该够用了,按“
9、Ne*t继续是否启用TCP/IP连接,设定端口,如果不启用,就只能在自己的机器上访问My SQL数据库了,我这里启用,把前面的勾打上,Port Number:3306,在这个页面上,您还可以选择“启用标准模式Enable Strict Mode,这样My SQL就不会允许细小的语法错误。如果您还是个新手,我建议您取消标准模式以减少麻烦。但熟悉My SQL以后,尽量使用标准模式,因为它可以降低有害数据进入数据库的可能性。按“Ne*t继续这个比拟重要,就是对My SQL默认数据库语言编码进展设置,第一个是西文编码,第二个是多字节的通用utf8编码,都不是我们通用的编码,这里选择第三个,然后在Cha
10、racter Set那里选择或填入“GBK,当然也可以用“gb2312,区别就是GBK的字库容量大,包括了gb2312的所有汉字,并且加上了繁体字、和其它乱七八糟的字使用My SQL的时候,在执行数据操作命令之前运行一次“SET NAMES GBK;运行一次就行了,GBK可以替换为其它值,视这里的设置而定,就可以正常的使用汉字或其它文字了,否则不能正常显示汉字。按 “Ne*t继续。选择是否将My SQL安装为windows效劳,还可以指定Service Name效劳标识名称,是否将My SQL的bin目录参加到Windows PATH参加后,就可以直接使用bin下的文件,而不用指出目录名,比方
11、连接,“My SQL.E*E -UUSER Name -PPASS word;就可以了,不用指出My SQL.E*E的完整地址,很方便,我这里全部打上了勾,Service Name不变。按“Ne*t17 这一步询问是否要修改默认root用户超级管理的密码默认为空,“New root password如果要修改,就在此填入新密码如果是重装,并且之前已经设置了密码,在这里更改密码可能会出错,请留空,并将“Modify Security Settings前面的勾去掉,安装配置完成后另行修改密码,“Confirm再输一遍内再填一次,防止输错。“Enable root access from remot
12、e machines是否允许root用户在其它的机器上登陆,如果要平安,就不要勾上,如果要方便,就勾上它。最后“Create An Anonymous Account新建一个匿名用户,匿名用户可以连接数据库,不能操作数据,包括查询,一般就不用勾了,设置完毕,按“Ne*t继续。18.确认设置无误,如果有误,按“Back返回检查。按“E*ecute使设置生效。设置完毕,按“Finish完毕My SQL的安装与配置这里有一个比拟常见的错误,就是不能“Start service,一般出现在以前有安装My SQL的效劳器上,解决的方法,先保证以前安装的My SQL效劳器彻底卸载掉了;不行的话,检查是否按
13、上面一步所说,之前的密码是否有修改,照上面的操作;如果依然不行,将My SQL安装目录下的data文件夹备份,然后删除,在安装完成后,将安装生成的 data文件夹删除,备份的data文件夹移回来,再重启My SQL效劳就可以了,这种情况下,可能需要将数据库检查一下,然后修复一次,防止数据出错。安装路径不要带有中文!也不能有空格括号之类的,否则就会遇到下列图显示的错误到此我们的My SQL安装配置完成,我们需要测试My SQL是否真的安装配置成功。在我们的CMD 命令行下输入 net start My SQL看是否能启动效劳;使用工具NAVI cat Lite for My SQL看是否能够到M
14、y SQL数据库-. z.数据库和表的操作SQL语句分类DQLData Query Language,数据查询语言 查询数据库中的数据 SELECT DMLData Manipulation Language,数据操作语言 插入、删除和修改数据库中的数据; INSERT、 UPDATE 、DELETE等; DCL Data Control Language,数据控制语言 用来控制存取许可、存取权限等; GRANT、REVOKE 等; DDL Data Definition Language,数据定义语言 用来建立数据库、数据库对象和定义其列 CREATE 、DROP 等事务控制语言Tran S
15、ac TIONAL Control Language, TCL MIT、ROLLBACKSQL语句书写规则书写SQL语句应遵循以下规则: SQL语句不区分大小写字符值和日期值区分大小写 SQL语句可以写成一行或多行关键字不能简写或分割于多行子句通常置于单独行这样更具可读性并便于编辑 Tab和缩进的使用可以提高程序的可读性关键字最好大写,其他词诸如表名、列名使用小写 SQL 中的注释: SQL标准:多行注释: /* */。单行注释: - My SQL:“#数据库对象的命名规则必须以字母开头可包括数字和三个特殊字符# _ $不要使用My SQL的保存字保存字与关键字My SQL 数据库系统的用户只
16、能使用,不能用它来定义表的名称与字段名同一Schema下的对象不能同名列类型 My SQL支持多种列类型:数值类型、日期/时间类型、字符串(字符)类型My SQL中的数值数据类型:数值数据类型-整数数值数据类型-浮点数日期/时间类型字符串类型数据库的操作查看数据库: show databases;创立数据库: create database if not e*ists 数据库名;删除数据库: drop database 数据库名;使用数据库 use 数据库名表的操作显示当前数据库中已有的数据表的信息:show tables;查看数据表中各列的信息:DESCRIBE|DESC 表名 列名;查看表
17、的详细构造: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 新表名;支
18、持一次重命名多个表。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唯一:当定义了唯一约束后,该
19、列值不能是重复的,但是可以为null。被定义的唯一性约束,会自动建立一个唯一性的索引;UNIQUE约束既可以定义在列级,也可以定义在表级;注意:如果字段定义为UNIQUE约束时,允许包含多个NULL值。PRIMARY KEY主键用于唯一的标识表行的数据,当定义主键约束后,该列不但不能重复而且不能为null。需要说明的是:一*表最多只能有一个主键,但是可以有多个unique约束。My SQL中会自动产生主键索引;主键约束既可以定义在列级,也可以定义在表级;FOREIGN KEY外键用于定义主表和从表之间的关系。外键约束要定义在从表上,主表则必须具有主键约束或是unique约束,当定义外键约束后,
20、要求外键列数据必须在主表的主键列存在或是为null。一个表中可以定义多个外键约束;My SQL中会自动产生外键键索引;外键约束既可以定义在列级,也可以定义在表级;CHECK检查检查性约束,检查输入的每一个数据,只有符合条件的数据才允许插入到表中。check表达式的结果必须是一个布尔值check约束既可以定义在列级也可以定义在表级。所有的存储引擎均对CHECK子句进展分析,但是忽略CHECK子句。添加约束可增加或删除约束,但不能直接修改;可使约束启用和禁用只要是可以使用表级约束语法来定义的约束,都可以通过add constraint来增加该约束。语法:ALTER TABLE tableADD C
21、ONSTRAINT 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 se* char(2) de
22、fault 男;注意:默认值不是约束,要加默认值可以在建表时添加或修改表构造。4. 性别为非空alter table stu modify se* 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
23、 stu change tno tno int(11);删除not null约束alter table stu modify se* char(2) ;删除唯一约束 alter table stu drop inde* uq_tname;删除外键约束alter table stu drop foreign key fk_stu_sc;表级约束和列级约束列级定义:是在定义列的同时定义约束如在classes表定义主键约束:create table classes(classId number(2) constraint pk_cid primary key, -给约束取名字ame varchar2
24、(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添加相应的约束信息。-. z.数据更新操作1课程学习目标:数据的增加数据的修改数据的删除插入
25、数据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命令生成的au
26、to_increment值。这是一个面向连接的函数,只对本次会话有效。、插入数据时的考前须知:考前须知1:每次插入一行数据,不可能只插入半行或者几列数据,因此,插入的数据是否有效将按照整行的完整性的要求来检验;考前须知2:每个数据值的数据类型、精度和小数位数必须与相应的列匹配;考前须知3:如果在设计表的时候就指定了*列不允许为空,则必须插入数据;考前须知4:插入的数据项,要求符合检查约束的要求考前须知5:具有缺省值的列,可以使用DEFAULT缺省关键字来代替插入的数值;允许为空值的列,可以使用NULL关键字来插入空值。修改数据UPDATE UPDATE语句用于修改表中一列或多列的值,使用whe
27、re子句限制修改的行。语法格式: UPDATE 表名 SET column1=value1,column2=value2,. WHERE 条件;删除数据DELETEDELETE语句向用户提供了删除数据的功能,同UPDATE语句一样限定表中哪些行将被删除。语法格式: DELETE FROM 表名 WHERE 条件; TRUNCATE TABLE 表名 ;二者关系:TRUNCATE TABLE 在功能上与不带 WHERE 子句的 DELETE 语句一样,二者均删除表中的全部行。但 TRUNCATE TABLE速度快,但不可以回滚;DELETE 速度慢,但可以回滚。-. z.第五章数据库查询查询根本
28、语法单表查询:SELECT FROM WHERE ORDER BY ASC或DESC查询全部的行和列select * from stu;查询局部的列:select sid, sname, se*, age from stu;查询满足条件的行的局部列:select sid, sname ,se* from stu where age=20;SQL操作符算术运算符:+ - * / % 如:select sal*12 from emp;关系运算符: = = = !=或 between, in, like, is null, 注意:字符类型不区分大小写,binary类型区分大小写;如果字符串的后面有空
29、白符,则会自动忽略。逻辑运算符: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值:空值是指不可用、未分配的值空值不等于零或空格任意类型都可以支持空值包括空值的任何算术
30、表达式都等于空字符串和null进展连接运算,得到也是null.如何查询null值:使用is nullselect * from emp where m is null;select * from emp where m 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
31、, 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认为是排序中的最大值。排序方式
32、:按单个列排序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
33、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;作用:将多行值一次性插入到表中。要求:目
34、标表table2已创立好。常用的聚合函数:分组查询: GROUP BYSELECT 列名条件, MA*(结果列名) 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条件分
35、组查询:WHERE子句从数据源中去掉不符合其搜索条件的数据GROUP BY子句搜集数据行到各个组中,统计函数为各个组计算统计值HAVING子句去掉不符合其组搜索条件的各组数据行ORDER BY排序使用顺序先 WHERE 接着1 GROUP BY 接着2 HAVING 最后 ORDER BY with rollup如果group by子句里只有一个数据列,加上with rollup关键字的效果是将在查询结果的最后一行将自动添加一条总数统计记录。如果按多列分组,将会进展阶段性总和相当于“小计,最后再为全体记录统计一个最终的总和相当于“总计。例: select sno, count(*),avg(s
36、core) 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.与表
37、名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.
38、字段号) 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 *
39、 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更新关联数据表里的数据记录修改关联数据表里的数据记录使用updata命令在一条SQL语句中对多个表中的数据记录做出修改语法:UPDATE product p INNER JOIN productPrice pp ON d
40、uctId = 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;如
41、果子查询返回如 (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 为空
42、表,则 ALL 后的结果为 TRUE;如果子查询返回如 (0,NULL,1) 这种尽管 s1 比返回结果都大,但有空行的结果,则 ALL 后的结果为 UNKNOWN 。行子查询:例子:FROM 子查询:FROM 子查询是指 FROM 的子句作为子查询语句,主查询再到子查询结果中获取需要的数据语法:SELECT . FROM (subquery) AS name .子查询会生成一个临时表,由于 FROM 子句中的每个表必须有一个名称,因此 AS name 是必须的。FROM 子查询也称为衍生数据表子查询。标量子查询标量子查询是指子查询返回的是单一值的标量,如一个数字或一个字符串,也是子查询中最简
43、单的返回形式一个标量子查询的例子如下: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使用子查询进展比拟可以使用 = = = 这些操作符对子查询的标量结果进展比拟,通常子查询的位置在比拟式的
44、右侧:SELECT * FROM t1 WHERE column1 = (SELECT MA*(column2) FROM t2)提示对于采用这些操作符之一进展的比拟,子查询必须返回一个标量。唯一的例外是可以和行子查询同时使用。子查询与表连接在很多情况下,子查询的效果与JOIN 表连接很类似,但一些特殊情况下,是必须用子查询而不能用表连接的,如:SELECT * FROM t1 WHERE column1 = (SELECT MA*(column2) FROM t2)SELECT * FROM article AS t WHERE 2 = (SELECT COUNT(*) FROM artic
45、le WHERE article.uid = t.uid)E*ISTS 和 NOT E*ISTS 子查询E*ISTS 和 NOT E*ISTS 子查询语法如下:SELECT . FROM table WHERE E*ISTS (subquery)该语法可以理解为:将主查询的数据,放到子查询中做条件验证,根据验证结果TRUE 或 FALSE来决定主查询的数据结果是否得以保存。例子:从语句执行结果可以看出,article 表中第 4 条记录没有被保存,原因就是该条记录的数据在子查询中返回的结果是 FALSE 。当上面的 SQL 使用 NOT E*ISTS 时,查询的结果就是 article 表中
46、uid 不存在于 user 表中的数据记录。提示E*ISTS (subquery) 只返回 TRUE 或 FALSE,因此子查询中的 SELECT * 也可以是 SELECT 1 或其他,官方说法是实际执行时会忽略 SELECT 清单,因此没有区别。E*ISTS 子查询的实际执行过程可能经过了优化而不是我们理解上的逐条比照,如果担忧效率问题,可进展实际检验以确定是否有效率问题。E*ISTS 子查询往往也可以用条件表达式、其他子查询或者JOIN来替代,何种最优需要具体问题具体分析。关联子查询:关联子查询是指一个包含对表的引用的子查询,该表也显示在外部查询中。通俗一点来讲,就是子查询引用到了主查询
47、的数据数据。以一个实际的例子来理解关联子查询:将该例 SQL 与如下语句比拟更能看出关联子查询与普通子查询的区别:SELECT * FROM article WHERE uid IN(SELECT uid FROM user)在本实例中,虽然两个 SQL 执行后的返回结果都一样,但它们的实现过程是完全不一样的。后者普通子查询实际被执行为:SELECT * FROM article WHERE uid IN(1,2,3)但在关联子查询中,是无法单独执行子查询语句的。其实际流程大致为:先做外部主查询;将主查询的值传入子查询并执行;子查询再将查询结果返回主查询,主查询根据返回结果完成最终的查询。这个
48、执行流程类似于E*ISTS 子查询,实际上*些情况下 MySQL 就是将关联子查询重写为 E*ISTS 子查询来执行的。关联子查询效率很明显,一般情况下关联子查询的效率是比拟低下的,实际上本例中的关联子查询例子也仅是为了演示关联子查询的原理及用法。如果可以的话,关联子查询尽量使用 JOIN 或其他查询来代替。如本例中,使用INNER JOIN来替换的 SQL 为:SELECT article.* FROM article INNER JOIN user ON article.uid = user.uid注意:此处只是为了演示用 INNER JOIN 替换关联子查询的样例,并非表名这种处理是最优
49、处理。-. z.索引、视图、事务索引的概念:索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成局部),它们包含着对数据表里所有记录的引用指针。更通俗的说,数据库索引好比是一本书前面的目录,能加快数据库的查询速度。上述SQL语句,在没有索引的情况下,数据库会遍历全部200条数据后选择符合条件的;而有了相应的索引之后,数据库会直接在索引中查找符合条件的选项。如果我们把SQL语句换成“SELECT * FROM article WHERE id=2000000,则你是希望数据库按照顺序读取完200万行数据以后给你结果还是直接在索引中定位呢?上面的两个图片鲜明的用时比照已经给出了答案注
50、:一般数据库默认都会为主键生成索引。索引分为聚簇索引和非聚簇索引两种,聚簇索引是按照数据存放的物理位置为顺序的,而非聚簇索引就不一样了;聚簇索引能提高多行检索的速度,而非聚簇索引对于单行的检索很快。索引的类型:1. 普通索引这是最根本的索引,它没有任何限制,MyIASM中默认的BTREE类型的索引,也是我们大多数情况下用到的索引。2. 唯一索引与普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值注意和主键不同。如果是组合索引,则列值的组合必须唯一,创立方法和普通索引类似。4. 单列索引、多列索引多个单列索引与单个多列索引的查询效果不同,因为执行查询时,MySQL只能使用一个索引,会从多
51、个索引中选择一个限制最为严格的索引。5. 组合索引最左前缀平时用的SQL查询语句一般都有比拟多的限制条件,所以为了进一步榨取MySQL的效率,就要考虑建立组合索引。例如上表中针对title和time建立一个组合索引:ALTER TABLE article ADD INDE* inde*_titme_time (title(50),time(10)。建立这样的组合索引,其实是相当于分别建立了下面两组组合索引:title,timetitle为什么没有time这样的组合索引呢?这是因为MySQL组合索引“最左前缀的结果。简单的理解就是只从最左面的开场组合。并不是只要包含这两列的查询都会用到该组合索引
52、,如下面的几个SQL所示:1使用到上面的索引2SELECT*FROMarticle WHREE title=测试ANDtime=1234567890;3SELECT*FROMarticle WHREE utitle=测试;4不使用上面的索引5SELECT*FROMarticle WHREEtime=1234567890;索引的优化:上面都在说使用索引的好处,但过多的使用索引将会造成滥用。因此索引也会有它的缺点:虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进展 INSERT、UPDATE和DELETE。因为更新表时,My SQL不仅要保存数据,还要保存一下索引文件。建立索引会占用
53、磁盘空间的索引文件。一般情况这个问题不太严重,但如果你在一个大表上创立了多种组合索引,索引文件的会膨胀很快。索引只是提高效率的一个因素,如果你的My SQL有大数据量的表,就需要花时间研究建立最优秀的索引,或优化查询语句。下面是一些总结以及收藏的My SQL索引的考前须知和优化方法。2. 索引不会包含有NULL值的列只要列中包含有NULL值都将不会被包含在索引中,复合索引中只要有一列含有NULL值,则这一列对于此复合索引就是无效的。所以我们在数据库设计时不要让字段的默认值为NULL。3. 使用短索引对串列进展索引,如果可能应该指定一个前缀长度。例如,如果有一个CHAR(255)的列,如果在前1
54、0个或20个字符内,多数值是惟一的,则就不要对整个列进展索引。短索引不仅可以提高查询速度而且可以节省磁盘空间和I/O操作。4. 索引列排序MySQL查询只使用一个索引,因此如果where子句中已经使用了索引的话,则order by中的列是不会使用索引的。因此数据库默认排序可以符合要求的情况下不要使用排序操作;尽量不要包含多个列的排序,如果需要最好给这些列创立复合索引。5. like语句操作一般情况下不鼓励使用like操作,如果非使用不可,如何使用也是一个问题。like “%aaa% 不会使用索引而like “aaa%可以使用索引。6. 不要在列上进展运算例如:select * from use
55、rs where YEAR(adddate)2007,将在每个行上进展运算,这将导致索引失效而进展全表扫描,因此我们可以改成:select * from users where adddate2007-01-01。关于这一点可以围观:一个单引号引发的MYSQL性能损失。最后总结一下,MySQL只对一下操作符才使用索引:,=,between,in,以及*些时候的 like(不以通配符%或_开头的情形)。而理论上每*表里面最多可创立16个索引,不过除非是数据量真的很多,否则过多的使用索引也不是则好玩的,比方我刚刚针对te*t类型的字段创立索引的时候,系统差点就卡死了。视图:视图就是一个存在于数据库
56、中的虚拟表。视图本身没有数据,只是通过执行相应的select语句完成获得相应的数据。视图和表的区别表需要占用磁盘空间,视图不需要;视图不能添加索引视图的作用:使用视图可以简化复杂查询视图有利于提高平安性,比方不同用户查看不同的视图逻辑数据独立性,可以帮助用户屏蔽真实表构造变化带来的影响。创立视图:CREATE OR REPLACE ALGORITHM = UNDEFINED | MERGE | TEMPTABLE VIEW view_name (column_list) AS select_statementWITH CASCADED | LOCAL CHECK OPTION例句:mysql
57、create view v_emp as select empno,ename,job from emp;Query OK, 0 rows affected (0.00 sec)删除视图:Drop view view_name;查询视图跟普通表一样查询即可 select * from 视图名称通过以下方式可以查看视图的根本信息:1. describe 视图名;查看视图的字段定义、字段数据类型、是否为空,是否为主/外键、默认值和额外信息。2. show table status like 视图名G查看视图的存储引擎、创立时间等,ment的值为View表示视图。3. show create vie
58、w 视图名G;查看视图的详细定义,包括名称、创立视图的语句等信息。4. select * from information_schema.views;在MySQL中,information_schema数据库下的views表中存储了所有视图的定义,通过该查询,可以查看数据库中所有视图的详细信息。修改视图例子:mysql alter view v_emp as select empno,ename,job,deptno from emp;Query OK, 0 rows affected (0.01 sec)修改视图构造,即修改所使用的字段的名称可以隐含基表的字段名称:mysql alter v
59、iew v_emp(v1,v2,v3,v4) as select empno,ename,job,deptno from emp;Query OK, 0 rows affected (0.00 sec)视图缩减业务逻辑视图用来隐藏复杂的业务逻辑,从join连接查询产生一个view。先使用视图完成一定的逻辑,再在视图的根底上完成另外的逻辑。通常,视图完成的逻辑都是相比照拟根底的逻辑。视图的执行算法:存在两种执行算法:1、Merge:合并的执行方式,每当执行的时候,先将我们视图的sql语句与外部查询视图的sql语句,混合在一起,最终执行;2、Temptable:临时表模式,每当查询的时候,将视图所
60、使用的select语句生成一个结果的临时表,再在当前的临时表内进展查询。指的是一个视图是在什么时候执行,依据哪些方式执行;对于MERGE,会将引用视图的语句的文本与视图定义合并起来,使得视图定义的*一局部取代语句的对应局部。对于TEMPTABLE,视图的结果将被置于临时表中,然后使用它执行语句。对于UNDEFINED,MySQL将选择所要使用的算法。如果可能,它倾向于MERGE而不是TEMPTABLE,这是因为MERGE通常更有效,而且如果使用了临时表,视图是不可更新当用户创立视图时,mysql默认使用一种undefine的处理算法,就是会自动在合并和临时表内进展选择。注意:1、尽量使用视图完
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 供水人员健康管理制度
- 供水公司日常管理制度
- 供水安全作业管理制度
- 供水行业卫生管理制度
- 供热公司客服管理制度
- 供电公司动火管理制度
- 供电公司薪酬管理制度
- 便携仪器领用管理制度
- 保卫夜间巡更管理制度
- 保安公司中层管理制度
- 手术室患者体位管理课件
- +四川省内江市2023-2024学年八年级下学期期末考试英语试题
- 江西省2024年中考数学试卷(含答案)
- 榆神矿区郭家滩煤矿(700 万吨-年)项目环评
- 2024年高一生物学考模拟卷01
- 北京市丰台区2023-2024学年五年级下学期期末英语试题
- 合同订立规范情况
- 2024年中国南水北调集团水网智慧科技限公司秋季公开招聘高频考题难、易错点模拟试题(共500题)附带答案详解
- 优化校本作业设计,提高校本作业实效
- JJG 705-2014液相色谱仪行业标准
- 第四届全国电信和互联网行业职业技能竞赛考试题库及答案
评论
0/150
提交评论