《传智播客-韩顺平-Mysql数据库.ppt》由会员分享,可在线阅读,更多相关《传智播客-韩顺平-Mysql数据库.ppt(150页珍藏版)》请在三一办公上搜索。
1、北京传智播客教育,php数据库(mysql)编程,讲师:韩顺平,主讲 韩顺平,php 培训日志 从入门到精通,主讲:韩顺平,email:,本章节的讲解:参考视频jdbc详解关于mysql数据库部分!,主讲 韩顺平,php进阶-内容介绍,(一)项目演示(二)php数据库编程-mysql2.1 mysql数据库-基础部分2.2 mysql数据库-加强部分1-mysql表类型和存储引擎-mysql中事务处理2.3 mysql数据库-加强部分2-mysql表的基本查询加强-mysql表的复杂查询-维护数据的完整性约束-mysql内连接、外连接2.4 mysql数据库-加强部分3-维护数据的完整性约束-
2、mysql表自增-mysql索引,主讲 韩顺平,php进阶-雇员管理系统演示,主讲 韩顺平,php进阶-oa(办公自动化)系统演示,主讲 韩顺平,php数据库编程-mysql,1.数据库的基本概念2.mysql数据库的基本操作3.mysql的curd操作4.mysql常用函数5.php如何操作mysql数据库,主讲 韩顺平,学习目标,1.mysql基本操作2.mysql简单的crud操作3.php操作mysql,主讲 韩顺平,一个问题,淘宝网,天涯网,校友网,雇员管理系统,留言本.都有各自的功能,那么当我们关闭系统的时候,下次再访问这些网站时,为什么他们各自的信息还存在?再比如c/s的软件,比
3、如网游、qq、他们又是怎样保存数据的?a.游戏积分 b.qq聊天记录.,主讲 韩顺平,解决之道-文件、数据库,我们刚学习过文件,大家可能回答用文件就可以保存数据嘛!没有错,可以如果用文件保存数据存在几个缺点:(1)文件的安全性问题(2)文件不利于查询和对数据的管理(3)文件不利于存放海量数据(4)文件在程序中控制不方便,主讲 韩顺平,解决之道-文件、数据库,为了解决上述问题,专家们设计出更加利于管理数据的东东-数据库,它能更有效的管理数据。数据库是衡量一个程序员水平的重要指标。举一个生活化的案例说明如果说 图书馆是保存书籍的,那么数据库就是保存数据的。,主讲 韩顺平,数据库简介 SQL Ser
4、ver、Oracle、MySQL、DB2、SyBase*对当前主流数据库做一个比较介绍 MySQL数据库的安装和配置 使用命令行窗口连接MYSQL数据库 mysql h 主机名 u用户名 p密码,启动mysql数据库的常用方式:服务方式启动(界面)net stop mysql服务名 net start mysql服务名,主讲 韩顺平,数据库服务器、数据库和表的关系,MySQLdbms,DB,DB,数据对象(表),数据对象(表),数据对象(表),Client,所谓安装数据库服务器,只是在机器上装了一个数据库管理程序,这个管理程序可以管理多个数据库,一般开发人员会针对每一个应用创建一个数据库。为保
5、存应用中实体的数据,一般会在数据库创建多个表,以保存程序中实体的数据。数据库服务器、数据库和表的关系如图所示:,主讲 韩顺平,数据在数据库中的存储方式,雇员表(employee),行(row),列(column),表的一行称之为一条记录表中一条记录对应一个php对象的数据,主讲 韩顺平,SQL语句分类,DDL:数据定义语句(create alter drop)DML:数据操作语句(insert update delete)DQL:数据查询语句(select)DCL:数据控制语句(grant revoke commit rollback),小面试题:mysql数据库的sql语句分几类?,主讲 韩
6、顺平,创建数据库,CREATE DATABASE IF NOT EXISTS db_name create_specification,create_specification.create_specification:DEFAULT CHARACTER SET charset_name|DEFAULT COLLATE collation_name,CHARACTER SET:指定数据库采用的字符集 COLLATE:指定数据库字符集的比较方式,练习:创建一个名称为db1的数据库。创建一个使用utf-8字符集的db2数据库。创建一个使用utf-8字符集,并带校对规则的mydb3数据库,主讲 韩顺
7、平,查看、删除数据库,显示数据库语句:SHOW DATABASES显示数据库创建语句:SHOW CREATE DATABASE db_name 数据库删除语句:DROP DATABASE IF EXISTS db_name,练习:查看当前数据库服务器中的所有数据库 查看前面创建的db2数据库的定义信息 删除前面创建的db1数据库,主讲 韩顺平,修改、备份、恢复数据库,ALTER DATABASE IF EXISTS db_name alter_specification,alter_specification.alter_specification:DEFAULT CHARACTER SET
8、charset_name|DEFAULT COLLATE collation_name|ENGINE|TYPE=engine_name/表存储引擎再事务是再讲解,备份数据库表中的数据mysqldump-u 用户名-p 数据库名 文件名.sql 恢复数据库Source 文件名.sql,练习1 查看服务器中的数据库,并把其中某一个库的字符集修改为utf8;2 备份test库中的数据,并恢复,主讲 韩顺平,体验Mysql-安装ecshop,安装的时候,可能在创建管理员会报错误,解决方法如下:重新设置date.timezone=PRC,需要重新启动apache才能生效.Date;Defines the
9、 default timezone used by the date functions;http:/=PRC,主讲 韩顺平,创建表(基本语句),CREATE TABLE table_name(field1 datatype,field2 datatype,field3 datatype,)character set 字符集 collate 校对规则 engine 存储引擎方式field:指定列名datatype:指定列类型,注意:创建表时,要根据需保存的数据创建相应的列,并根据数据的类型定义相应的列类型。例:user表id 整形 name 字符串password 字符串birthday 日期
10、,主讲 韩顺平,mysql 常用的数据类型,VARCHAR、BLOB和TEXT类是变长类型。每个类型的存储需求取决于列值的实际长度。,主讲 韩顺平,mysql 常用的数据类型,主讲 韩顺平,mysql 字符集和校验规则,查询的乱码出现原因:character_set_clinet 设置和客户端实际发出的不一致.charset_set_results 设置和客户端实际需要的编码不一致.,主讲 韩顺平,mysql 字符集和校验规则,collate:校对规则指:在对某个字段排序时,按照怎样的规则来排序这里我们先简单举一个案例,大家了解即可.请查看Mysql关于校对规则手册,主讲 韩顺平,创建表练习,
11、创建一个员工表,主讲 韩顺平,修改表,使用 ALTER TABLE 语句追加,修改,或删除列的语法.,ALTER TABLE tablenameADD(column datatype DEFAULT expr,column datatype.);,ALTER TABLE tablenameMODIFY(column datatype DEFAULT expr,column datatype.);,ALTER TABLE tablenameDROP(column);,修改表的名称:Rename table 表名 to 新表名修改表的字符集:alter table student characte
12、r set utf8;,主讲 韩顺平,修改表,练习 在上面员工表的基本上增加一个image列。修改job列,使其长度为60。删除sex列。表名改为user。修改表的字符集为utf-8 列名name修改为usernamealter table user change column name username varchar(20);,主讲 韩顺平,帮助命令的使用,在mysql使用中,我们可能忘记一个mysql命令的使用,我们可以通过 帮助命令?来查看相关命令的使用方式1.?create 方式2?create table,提示:控制台给出的都是英文说明,如果英文不好,还是用mysql中文手册吧!,
13、主讲 韩顺平,数据库CRUD语句,Insert语句(增加数据)Update语句(更新数据)Delete语句(删除数据)Select语句(查找数据),主讲 韩顺平,Insert语句,INSERT INTOtablename(column,column.)VALUES(value,value.);,使用 INSERT 语句向表中插入数据。,注意事项插入的数据应与字段的数据类型相同。数据的大小应在列的规定范围内,例如:不能将一个长度为80的字符串加入到长度为40的列中。在values中列出的数据位置必须与被加入的列的排列位置相对应。字符和日期型数据应包含在单引号中。插入空值,不指定或insert i
14、nto table value(null),主讲 韩顺平,Insert语句练习,注意:字符和日期要包含在单引号中。show variables like character%;set character_set_results=gbk;,练习:使用insert语句向表中插入三个员工的信息。,主讲 韩顺平,update语句,UPDATE tbl_name SET col_name1=expr1,col_name2=expr2.WHERE where_definition,使用 update语句修改表中数据。,注意事项:UPDATE语法可以用新值更新原有表行中的各列。SET子句指示要修改哪些列和要
15、给予哪些值。WHERE子句指定应更新哪些行。如没有WHERE子句,则更新所有的行。,主讲 韩顺平,update语句练习,练习:在上面创建的employee表中修改表中的纪录。,要求将所有员工薪水修改为5000元。将姓名为zs的员工薪水修改为3000元。将wu的薪水在原有基础上增加1000元。,主讲 韩顺平,delete语句,delete from tbl_name WHERE where_definition,使用 delete语句删除表中数据。,注意事项:如果不使用where子句,将删除表中所有数据。Delete语句不能删除某一列的值(可使用update)使用delete语句仅删除记录,不删
16、除表本身。如要删除表,使用drop table语句。同insert和update一样,从一个表中删除记录将引起其它表的参照完整性问题,在修改数据库数据时,头脑中应该始终不要忘记这个潜在的问题。删除表中数据也可使用TRUNCATE TABLE 语句,它和delete有所不同,参看mysql文档。,主讲 韩顺平,delete语句练习,删除表中名称为zs的记录。删除表中所有记录。使用truncate删除表中记录。,主讲 韩顺平,Select语句(1),SELECT DISTINCT*|column1,column2.column3.FROMtablename;,注意事项(需要创建新的学生表)Sele
17、ct 指定查询哪些列的数据。column指定列名。*号代表查询所有列。From指定查询哪张表。DISTINCT可选,指显示结果时,是否剔除重复数据,基本select语句,主讲 韩顺平,Select语句(1),练习:查询表中所有学生的信息。查询表中所有学生的姓名和对应的英语成绩。过滤表中重复数据。,主讲 韩顺平,Select语句(2),SELECT*|column1expression,column2expression,.FROMtablename;,在select语句中可使用表达式对查询的列进行运算,在select语句中可使用as语句,SELECT columnname as 别名 from
18、 表名;,主讲 韩顺平,Select语句(2),练习在所有学生分数上加10分特长分(即查询所有学生总分再加10分)。统计每个学生的总分。使用别名表示学生分数。,主讲 韩顺平,Select语句(3),使用where子句,进行过滤查询。练习:查询姓名为wu的学生成绩查询英语成绩大于90分的同学查询总分大于200分的所有同学,主讲 韩顺平,Select语句(4),在where子句中经常使用的运算符,Like语句中,%代表零个或多个任意字符,_ 代表一个字符,例first_name like _a%;,主讲 韩顺平,Select语句(4),查询英语分数在 8090之间的同学。查询数学分数为89,90,
19、91的同学。查询所有姓李的学生成绩。查询数学分80,语文分80的同学。,主讲 韩顺平,Select语句(5),SELECT column1,column2.column3.FROMtable;order by column asc|desc,使用order by 子句排序查询结果。,Order by 指定排序的列,排序的列即可是表中的列名,也可以是select 语句后指定的列名。Asc 升序、Desc 降序 ORDER BY 子句应位于SELECT语句的结尾。练习:对数学成绩排序后输出。对总分排序后输出,然后再按从高到低的顺序输出对姓李的学生成绩排序输出,主讲 韩顺平,合计函数count,Se
20、lect count(*)|count(列名)from tablenameWHERE where_definition,练习:统计一个班级共有多少学生?统计数学成绩大于90的学生有多少个?统计总分大于250的人数有多少?,Count(列名)返回某一列,行的总数,主讲 韩顺平,合计函数sum,Select sum(列名),sum(列名)from tablenameWHERE where_definition,练习:统计一个班级数学总成绩?统计一个班级语文、英语、数学各科的总成绩统计一个班级语文、英语、数学的成绩总和统计一个班级语文成绩平均分注意:sum仅对数值起作用,否则会报错。注意:对多列求和
21、,“,”号不能少。,Sum函数返回满足where条件的行的和,主讲 韩顺平,合计函数avg,Select sum(列名),sum(列名)from tablenameWHERE where_definition,练习:求一个班级数学平均分?求一个班级总分平均分,AVG函数返回满足where条件的一列的平均值,主讲 韩顺平,合计函数max/min,Select max(列名)from tablenameWHERE where_definition,练习:求班级最高分和最低分(数值范围在统计中特别有用),Max/min函数返回满足where条件的一列的最大/最小值,主讲 韩顺平,Select语句(6
22、),SELECT column1,column2.column3.FROMtable group by column,练习:对订单表中商品归类后,显示每一类商品的总价,使用group by 子句对列进行分组,SELECT column1,column2.column3.FROMtable group by column having.,使用having 子句过滤,练习:查询购买了几类商品,并且每类总价大于100的商品,Having和where均可实现过滤,但在having可以使用合计函数,having通常跟在group by后,它作用于组。,主讲 韩顺平,时间日期相关函数,示例:select
23、date_add(entry_date,INTERVAL 2 year)from student;增加两年,*特别注意date_add()date_sub()datediff()timediff()参与运算的可以是date/datetime/timestamp均可*查看 mysql 的帮助文档即可知道 d_type有哪些,主讲 韩顺平,字符串相关函数,主讲 韩顺平,数学相关函数,rand()返回一个随机浮点值 v,范围在 0 到1 之间(即,其范围为 0 v 1.0)。若已指定一个整数参数 N,则它被用作种子值,用来产生重复序列。,主讲 韩顺平,流程控制函数,随机设计案例,比如emp表的案例.
24、来想一想吧!(根据职位不同来加薪的案例!),主讲 韩顺平,其它函数,主讲 韩顺平,mysql中文乱码,mysql有六处使用了字符集,分别为:client、connection、database、results、server、system。client是客户端使用的字符集。connection是连接数据库的字符集设置类型,如果程序没有指明连接数据库使用的字符集类型就按照服务器端默认的字符集设置。database是数据库服务器中某个库使用的字符集设定,如果建库时没有指明,将使用服务器安装时指定的字符集设置。results是数据库给客户端返回时使用的字符集设定,如果没有指明,使用服务器默认的字符集。
25、server是服务器安装时指定的默认字符集设定。system是数据库系统使用的字符集设定。,主讲 韩顺平,php操作mysql数据库实例,/1.对mysql完成查询,得到连接$conn=mysql_connect(localhost,root,root);/选择数据mysql_select_db(hspdb1,$conn);/查询数据,返回结果$res=mysql_query(select*from users,$conn);/得到查询到多少记录$recs=mysql_num_rows($res);echo 共.$recs.条记录;/取出记录.while($row=mysql_fetch_ar
26、ray($res)/打印echo 编号:.$row0.名称.$row1.邮件.$row2.;/添加记录/mysql_query(insert into users(name,email)values(abc1,beijing),$conn)/修改/mysql_query(update users set email=where id=4,$conn);/删除mysql_query(delete from users where id=4,$conn);echo 执行ok!;,主讲 韩顺平,php数据库编程(2)-mysql,1.mysql表类型和存储引擎2.mysql中事务处理,主讲 韩顺平,
27、mysql表类型和存储引擎,介绍:MySQL的表类型由存储引擎(Storage Engines)决定,类型包括MyISAM、innoDB、BDB等。,MySQL 数据表主要支持六种类型,分别是:BDB、HEAP、ISAM、MERGE、MYISAM、InnoBDB。(参考mysql文档.)这六种又分为两类,一类是”事务安全型”(transaction-safe),包括BDB和InnoDB;其余都属于第二类,称为”非事务安全 型”(non-transaction-safe)。,显示当前数据库支持的存储引擎:show engines;,主讲 韩顺平,mysql表类型和存储引擎,主讲 韩顺平,mysq
28、l表类型和存储引擎,我这里重点给大家介绍三种:MyISAM、InnoDB、MEMORY(Heap),MyISAM不支持事务、也不支持外键,但其访问速度快,对事 务完整性没有要求 InnoDB存储引擎提供了具有提交、回滚和崩溃恢复能力的事 务安全。但是比起MyISAM存储引擎,InnoDB写的处理效率差一些并且会占用更多的磁盘空间以保留数据和索引。MEMORY存储引擎使用存在内存中的内容来创建表。每个MEMORY表只实际对应一个磁盘文件。MEMORY类型的表访问非常得快,因为它的数据是放在内存中的,并且默认使用HASH索引。但是一旦服务关闭,表中的数据就会丢失掉。,主讲 韩顺平,mysql表类型
29、和存储引擎,案例说明:,对前面我们提到的三种存储引擎,我们举例说明:,如何选择表的存储引擎,如果你的应用是不需要事务,处理的只是基本的CRUD操作,那么MyISAM是不二选择一般来说,如果需要事务支持,并且有较高的并发读写 频率,InnoDB是不错的选择。Heap 存储引擎就是将数据存储在内存中,由于没有磁盘I./O的等待,速度极快。但由于是内存存储引擎,所做的任何修改在服务器重启后都将消失。(经典用法 用户的在线状态.),主讲 韩顺平,mysql表类型和存储引擎,修改存储引擎,ALTER TABLE 表名 ENGINE=储存引擎;,主讲 韩顺平,mysql中事务处理,什么是事务事务用于保证数
30、据的一致性,它由一组相关的dml语句组成,该组的dml语句要么全部成功,要么全部失败。如:网上转账就是典型的要用事务来处理,用以保证数据的一致性。,当执使用commit语句可以提交事务.当执行了commit语句子后,会确认事务的变化、结束事务、删除保存点、释放锁,当使用commit语句结束事务子后,其它会话将可以查看到事务变化后的新数据,提交事务,当执行事务操作时(dml语句),mysql会在被作用的表上加锁,防止其它用户改表表的结构.这里对我们用户来讲是非常重要的。,事务和锁,主讲 韩顺平,mysql中事务处理,回退事务在介绍回退事务前,我们先介绍一下保存点(savepoint)的概念和作用
31、.保存点是事务中的一点.用于取消部分事务,当结束事务时,会自动的删除该事务所定义的所有保存点.当执行rollback时,通过指定保存点可以回退到指定的点,这里我们作图说明 mysql 数据库控制台事务的几个重要操作0)start transaction/开始一个事务 1)savepoint 保存点名/设置保存点2)rollback to 保存点名/取消部分事务3)rollback/取消全部事务4)commit/提交事务.,主讲 韩顺平,php程序中事务处理,php程序中如何使用事务在php操作数据库时,为了保证数据的一致性,比如转帐操作(图):(1)从一个帐户减掉10$(2)在另一个帐户上加入
32、10$,我们看看如何使用事务?,主讲 韩顺平,mysql事务处理事务隔离级别,多个线程开启各自事务操作数据库中数据时,数据库系统要负责隔离操作,以保证各个线程在获取数据时的准确性。如果不考虑隔离性,可能会引发如下问题:1.脏读2.不可重复读3.幻读(虚读),主讲 韩顺平,mysql事务处理事务隔离级别,事务隔离级别概念:隔离级别定义了事务与事务之间的隔离程度。ANSI/ISO SQL92标准定义了一些数据库操作的隔离级别(这是国际标准化组织定义的一个标准而已,不同的数据库在实现时有所不同):,V 可能出现 x 不会出现,主讲 韩顺平,mysql事务处理事务隔离级别,事务隔离级别,我们待会举例一
33、个案例来说明mysql的事务隔离级别.以对account表的操作来说明上面的几种情况.,脏读(dirty read):当一个事务读取另一个事务尚未提交的修改时,产生脏读。不可重复读(nonrepeatable read):同一查询在同一事务中多次进行,由于其他提交事务所做的修改或删除,每次返回不同的结果集,此时发生非重复读。幻读(phantom read):同一查询在同一事务中多次进行,由于其他提交事务所做的插入操作,每次返回不同的结果集,此时发生幻读。,主讲 韩顺平,mysql事务处理事务隔离级别,1.查看当前会话隔离级别select tx_isolation;2.查看系统当前隔离级别sel
34、ect global.tx_isolation;3.设置当前会话隔离级别set session transaction isolation level repeatable read;4.设置系统当前隔离级别set global transaction isolation level repeatable read;5.mysql 默认的事务隔离级别是 repeatable read,一般情况下,没有特殊要求,没有必要修改(因为该级别可以满足绝大部分项目需求),主讲 韩顺平,mysql事务处理事务隔离级别,mysql的事务隔离级-案例,我们举例一个案例来说明mysql的事务隔离级别.以对acc
35、ount表进行操作为例。,mysql控制台,mysql控制台,主讲 韩顺平,mysql事务处理事务隔离级别,mysql的事务隔离级在php程序中如何使用没有完成测试:connection.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);特别说明:java程序中Connection.XXXXXX有五个,但不是所有的数据库对有对应的五个事务隔离级别实现。在实际工作中,我们极少去修改各个数据库默认的隔离级别。,主讲 韩顺平,mysql中事务处理事务的acid特性,原子性(Atomicity)原子性是指事务是一个不可分割的工
36、作单位,事务中的操作要么都发生,要么都不发生。一致性(Consistency)事务必须使数据库从一个一致性状态变换到另外一个一致性状态。隔离性(Isolation)事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。持久性(Durability)持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响,主讲 韩顺平,php数据库编程(3)-mysql,1.mysql表的基本查询加强2.mysql表的复杂查询3.维护数据的完整性约束,主讲 韩顺平,mysql表的基
37、本查询-加强,介绍,-公欲善其事,必先利其器,在前面我们讲过mysql表的基本查询,但是都是对一张表进行的查询,这在实际的软件开发中,还远远的不够。下面我们讲解的过程中,将模拟一个简单的公司管理系统,创建 三张表(emp,dept,salgrade)为大家演示如何进行多表查询,select语句在软件编程中非常的有用,希望大家好好的掌握。,主讲 韩顺平,介绍主键和外键,mysql表的基本查询-加强,主讲 韩顺平,查看表结构 查询所有列 查询指定列 如何取消重复行?查询SMITH 的薪水,工作,所在部门,mysql表的基本查询-加强,主讲 韩顺平,使用算数表达式?显示每个雇员的年工资 使用列的别名
38、select ename 姓名,sal*12 as 年收入 from emp;,mysql表的基本查询-加强,主讲 韩顺平,使用where子句?如何显示工资高于3000的员工?如何查找后入职的员工?如何显示工资在2000到2500的员工情况 如何使用like操作符%:表示0到多个字符 _:表示单个字符?如何显示首字符为S的员工姓名和工资?如何显示第三个字符为大写O的所有员工的姓名和工资 在where条件中使用in?如何显示empno为 123,345,800.的雇员情况 使用is null的操作符?如何显示没有上级的雇员的情况,mysql表的基本查询-加强,主讲 韩顺平,使用逻辑操作符号?查询
39、工资高于500或是岗位为MANAGER的雇员,同时还要满足他们的姓名首写字母为大写的J 使用order by字句?如何按照工资的从低到高的顺序显示雇员的信息?按照部门号升序而雇员的工资降序排列 使用列的别名排序 select ename,sal*12 年薪 from emp order by 年薪 asc;别名需要使用“号圈中,mysql表的基本查询-加强,主讲 韩顺平,分页查询 按雇员的id号升序取出,mysql表的基本查询-加强,主讲 韩顺平,mysql表的复杂查询,说明在实际应用中经常需要执行复杂的数据统计,经常需要显示多张表的数据,现在我们给大家介绍较为复杂的select语句 数据分组
40、-max,min,avg,sum,count?如何显示所有员工中最高工资和最低工资?显示所有员工的平均工资和工资总和?计算共有多少员工扩展要求:?请显示工资最高的员工的名字,工作岗位?请显示工资高于平均工资的员工信息,主讲 韩顺平,mysql表的复杂查询,group by 和 having子句group by用于对查询的结果分组统计,having子句用于限制分组显示结果.?如何显示每个部门的平均工资和最高工资?显示每个部门的每种岗位的平均工资和最低工资?显示平均工资低于2000的部门号和它的平均工资扩展要求:,主讲 韩顺平,mysql表的复杂查询,对数据分组的总结,1.分组函数只能出现在选择列
41、表、having、order by子句种2.如果在select 语句种同时包含有group by,having,order by 那么他们的顺序是group by,having,order by3.在选择列种如果有列、表达式、和分组函数,那么这些列和表达式应当有一个出现在group by 子句中。如select deptno,avg(sal),max(sal)from emp group by deptno having avg(sal)2000;这里deptno就应当要出现在 group by 中,主讲 韩顺平,mysql表的复杂查询多表查询,问题的引出,后面,要求大家能够完成!,主讲 韩顺
42、平,mysql表的复杂查询多表查询,说明,思考题:显示雇员名,雇员工资及所在部门的名字,并按部门排序.,多表查询是指基于两个和两个以上的表或是视图的查询.在实际应用中,查询单个表可能不能满足你的需求,(如显示sales部门位置和其员工的姓名),这种情况下需要使用到(dept表和emp表)?显示雇员名,雇员工资及所在部门的名字【笛卡尔集】规定:多表查询的条件是 至少不能少于 表的个数-1?如何显示部门号为10的部门名、员工名和工资?显示各个员工的姓名,工资,及其工资的级别,主讲 韩顺平,mysql表的复杂查询多表查询,自连接自连接是指在同一张表的连接查询。?显示某个员工的上级领导的姓名比如显示F
43、ORD的上级.思考题:显示公司每个员工和它的上级的名字,主讲 韩顺平,mysql表的复杂查询子查询,什么是子查询 子查询是指嵌入在其它sql语句中的select语句,也叫嵌套查询 单行子查询 单行子查询是指只返回一行数据的子查询语句 请思考:如何显示与SMITH同一部门的所有员工?多行子查询 多行子查询指返回多行数据的子查询 请思考:如何查询和部门10的工作相同的雇员的名字、岗位、工资、部门号,主讲 韩顺平,mysql表的复杂查询子查询,上机练习题查询ecshop中各个类别中,价格最高的商品.,主讲 韩顺平,mysql表的复杂查询子查询,在多行子查询中使用all操作符请思考:如何显示工资比部门
44、30的所有员工的工资高的员工的姓名、工资和部门号select ename,sal,deptno from emp where salall(select sal from emp where deptno=30);扩展要求:大家想想还有没有别的查询方法.Select ename,sal,deptno from emp where sal(select max(sal)from emp where deptno=30);,主讲 韩顺平,mysql表的复杂查询子查询,在多行子查询中使用any操作符请思考:如何显示工资比部门30的任意一个员工的工资高的员工的姓名、工资和部门号select ename
45、,sal,deptno from emp where sal any(select sal from emp where deptno=30)扩展要求:大家想想还有没有别的查询方法.select ename,sal,deptno from emp where sal(select min(sal)from emp where deptno=30),主讲 韩顺平,mysql表的复杂查询子查询,多列子查询单行子查询是指子查询只返回单列、单行数据,多行子查询是指返回单列多行数据,都是针对单列而言的,而多列子查序则是指查询返回多个列数据的子查询语句请思考如何查询与smith的部门和岗位完全相同的所有雇
46、员,主讲 韩顺平,mysql表的复杂查询子查询,好好琢磨琢磨吧,在from子句中使用子查询请思考:如何显示高于自己部门平均工资的员工的信息这里要用到数据查询的小技巧,把一个子查询当作一个临时表使用解法select e1.*,e2.myavg from emp e1,(select avg(sal)myavg,deptno from emp group by deptno)e2 where e1.deptno=e2.deptno and e1.sale2.myavg解法select e1.*from emp e1 where e1.sal(select avg(sal)from emp wher
47、e deptno=e1.deptno),主讲 韩顺平,mysql表的复杂查询子查询,好好琢磨琢磨吧,在from子句中使用子查询请思考:查找每个部门工资最高的人的详细资料解法解法思路:得到所有的员工,进行筛选,每拿到一个员工,判断该员工的工资是否是他们部门的最高工资。select*from emp e where sal=(select max(sal)from emp where deptno=e.deptno);,主讲 韩顺平,mysql表的复杂查询子查询,好好琢磨琢磨吧,在from子句中使用子查询课堂小练习请思考:显示每个部门的信息和人员数量,我们一起完成.,主讲 韩顺平,mysql表的复
48、杂查询子查询,在from子句中使用子查询这里需要说明的当在from子句中使用子查询时,该子查询会被作为一个视图来对待,因此也叫作内嵌视图,当在from子句中使用子查询时,必须给子查询指定别名.,总结一下,主讲 韩顺平,mysql表的复杂查询子查询,自我复制数据(蠕虫复制)有时,为了对某个sql语句进行效率测试,我们需要海量数据时,可以使用此法为表创建海量数据。insert into mytable(id,name,sal,job,deptno)select empno,ename,sal,job,deptno from emp;思考题:如何删除掉一张表重复记录 temp_table 是一张临时
49、表 aa:是你要处理表(有重复行的.)select distinct*into temp_table from aa delete from aa insert into aa select*from temp_table drop table temp_table,主讲 韩顺平,mysql表的复杂查询合并查询,合并查询有时在实际应用中,为了合并多个select语句的结果,可以使用集合操作符号 union,union all,intersect,minus1)union 该操作符用于取得两个结果集的并集。当使用该操作符时,会自动去掉结果集中重复行。select ename,sal,job fr
50、om emp where sal2500 union select ename,sal,job from emp where job=MANAGER;,主讲 韩顺平,mysql表的复杂查询合并查询,2)union all该操作赋与union相似,但是它不会取消重复行,而且不会排序。select ename,sal,job from emp where sal2500 union all select ename,sal,job from emp where job=manager;3)intersectmysql测试没有成功!使用该操作符用于取得两个结果集的交集。select ename,sa