2.2.3 DML语句(下)

DML操作是对数据库中表记录的操作,主要包括表记录的插入(insert)、更新(update)、删除(delete)和查询(select)

4.查询记录

语法:mysql>SELECT * FROM tablename[WHERE CONDITION]

如:mysql>select * from r720;

mysql>select * from r720 where id<10 and cpu=45;

(5)表连接

当需要同时显示多个表的字段时,可以通过表连接来实现此功能。从大类上分,表连接可以分为内连接外连接

它们之间最主要的区别是:内连接仅选出两张表中互相匹配的记录而外连接会选出其他不匹配的记录

我们最常用的是内连接。

mysql>select * from emp;

mysql>select * from dept;

mysql>select ename,deptname from emp,dept where emp.deptno=dept.deptno;

【缺图,下次补上】

外连接又分为左连接和右连接,具体定义如下:

※左连接:包含所有的左边表中的记录甚至是右边表中没有和它匹配的记录。

※右连接:包含所有的右边表中的记录甚至是左边表中没有和它匹配的记录。

(6)子查询

某些情况下,当进行查询的时候,需要的条件是另外一个select语句的结果,这个时候就需要用到子查询。用于子查询的关键字主要包括in、not in、=、!=、exists、not exists等。

(7)记录联合

某些情况下,将两个表的数据按照一定的查询条件查询出来后,将结果合并一起显示出来,此时,就需要union和union all关键字来实现这样的功能。具体语法如下:

SELECT * FROM t1

UNION\UNION ALL

SELECT * FROM t2

...

UNION\UNION ALL

SELECT * FROM tn;

【注】UNION和UNION ALL的区别在于:UNION ALL是把结果集直接合并在一起,而UNION是将UNION ALL后的结果进行一次DISTINCT,去除重复记录后的结果。

如:

mysql>select cpu from r720;

mysql>select cpu from nr720;

mysql>select cpu from r720

mysql>union all

mysql>select cpu from nr720;

mysql>select cpu from r720

mysql>union

mysql>select cpu from nr720;

以下内容转自:http://www.cnblogs.com/smyhvae/p/4042303.html

点击打开链接

本章主要内容:

一、外键:

1、什么是外键:

主键:是唯一标识一条记录,不能有重复的,不允许为空,用来保证数据完整性

外键:是另一表的主键, 外键可以有重复的, 可以是空值,用来和其他表建立联系用的。所以说,如果谈到了外键,一定是至少涉及到两张表。例如下面这两张表:

上面有两张表:部门表(dept)、员工表(emp)。Id=Dept_id,而Dept_id就是员工表中的外键:因为员工表中的员工需要知道自己属于哪个部门,就可以通过外键Dept_id找到对应的部门,然后才能找到部门表里的各种字段信息,从而让二者相关联。所以说,外键一定是在从表中创建,从而找到与主表之间的联系;从表负责维护二者之间的关系。

我们先通过如下命令把部门表和职工表创建好,方便后面的举例:

create table department(id int primary key auto_increment,name varchar(20) not null,description varchar(100)
);
create table employee(id int primary key auto_increment,name varchar(10) not null,gender varchar(2) not null,salary float(10,2),age int(2),gmr int,dept_id int
);

然后把两张表的数据填好,显示效果如下:

部门表:

员工表:

2、外键的使用需要满足下列的条件:(这里涉及到了InnoDB的概念)

1. 两张表必须都是InnoDB表,并且它们没有临时表。

注:InnoDB是数据库的引擎。MySQL常见引擎有两种:InnoDB和MyISAM,后者不支持外键。

2. 建立外键关系的对应列必须具有相似的InnoDB内部数据类型。

3. 建立外键关系的对应列必须建立了索引。

4. 假如显式的给出了CONSTRAINT symbol,那symbol在数据库中必须是唯一的。假如没有显式的给出,InnoDB会自动的创建。

面试题:你的数据库用什么存储引擎?区别是?

答案:常见的有MyISAM和InnoDB。

MyISAM:不支持外键约束。不支持事务。对数据大批量导入时,它会边插入数据边建索引,所以为了提高执行效率,应该先禁用索引,在完全导入后再开启索引。

InnoDB:支持外键约束,支持事务。对索引都是单独处理的,无需引用索引。

3、添加外键的语法:

有两种方式:

【方式一】在创建表的时候进行添加

[CONSTRAINT symbol] FOREIGN KEY [id] (从表的字段1)REFERENCES tbl_name (主表的字段2)[ON DELETE {RESTRICT | CASCADE | SET NULL | NO ACTION}][ON UPDATE {RESTRICT | CASCADE | SET NULL | NO ACTION} 

上面的代码是同一行,中括号里的内容是可选项。

解释如下:

CONSTRAINT symbol:可以给这个外键约束起一个名字,有了名字,以后找到它就很方便了。如果不加此参数的话,系统会自动分配一个名字。

FOREIGN KEY:将从表中的字段1作为外键的字段。

REFERENCES:映射到主表的字段2。

ON DELETE后面的四个参数:代表的是当删除主表的记录时,所做的约定。

注:一般是RESTRICT和CASCADE用的最多。

【方式二】表已经创建好了,继续修改表的结构来添加外键。

我们在第一段中内容中已经将表建好了,数据也填充完了,现在来给从表(员工表)添加外键,让它与主表(部门表)相关联。代码举例如下:

ALTER TABLE employee ADD FOREIGN KEY(dept_id) REFERENCES department(id); 

代码解释:

ALTER TABLE employee:在从表employee中进行操作;

ADD FOREIGN KEY(dept_id):将从表的字段dept_id添加为外键;

REFERENCES department(id):映射到主表department当中为id的字段。

运行上方代码后,我们通过navicat来看一下外键有没有添加成功:

上图中,选中表employee,单击红框部分的“设计表”按钮,界面如下:

上图中就可以看到我们新建的外键了,而且系统默认给这个外键起了个名字:employee_ibfk_1。默认规则是RESTRICT。紧接着来给外键设置值:

上图中,我们打开员工表,然后给外键设置值,1代表宣传部,2代表秘书部。

然后我们回到主表(部门表),此时如果想删除id为1的宣传部,会弹出如下提示:(因为外键的默认规则为RESTRICT)

4、删除外键:(通过sql语句的方式)

我们在navicat中可以通过图形界面的方式删除外键,也可以通过sql语句来删除。

(1)获取外键名:

如果在命令行中不知道外键的名字,可以通过查看表的定义找出外键的名称:

show create table emp;

运行效果如下:

其实我们在表的信息中也可以看到:(注意书写命令的格式)

(2)删除外键:

alter table emp drop foreign key 外键名; 

二、表连接(join)

我们以下面的两张表举例:作为本段内容的例子

department部门表:

employee员工表:

其中,外键对应关系为:employee.dept_id=department.id。employee.leader中的数字的含义为:生命壹号的leader是生命二号,生命二号没有leader,生命叁号的leader是生命壹号。

1、内连接:只列出匹配的记录

语法:

SELECT … FROM join_table
[INNER] JOIN join_table2
[ON join_condition]
WHERE where_definition

解释:只列出这些连接表中与连接条件相匹配的数据行。INNER可以不写,则默认为内连接。[ON join_condition]里面写的是连接的条件。

举例:

select e.name,d.name from employee e inner join department d on e.dept_id=d.id; 

等价于:

select e.name,d.name from employee e,department d where e.dept_id=d.id; 

运行效果:

2、外连接:

外连接分类:

语法:

SELECT … FROM join_table1(LEFT | RIGHT | FULL) [OUTER] JOIN join_table2ON join_conditionWHERE where_definition 

解释:

不仅列出与连接条件(on)相匹配的行,还列出左表table1(左外连接)、或右表table2(右外连接)、或两个表(全外连接)中所有符合WHERE过滤条件的数据行。一般都是用左连接或者外连接。

其中,[OUTER]部分可以不写,(LEFT | RIGHT | FULL)部分要写其中一个。

2、1左外连接:左表列出全部,右表只列出匹配的记录。

举例:

2、2右外连接:右表列出全部,左表只列出匹配的记录。

举例:

3、交叉连接:

语法:

SELECT … FROM join_table1 CROSS JOIN join_table2; 

没有ON子句和WHERE子句,它返回的是连接表中所有数据行的笛卡尔积。

笛卡尔积举例:假设集合A={a,b},集合B={0,1,2},则两个集合的笛卡尔积为{(a,0),(a,1),(a,2),(b,0),(b,1), (b,2)}

其结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。

等价于:(荐)

SELECT … FROM table1, table2; 

举例:

4、自连接:参与连接的表都是同一张表。(通过给表取别名虚拟出两张表)

注:非常重要,在JavaWeb中的目录树中用的特别多。

举例:查询出员工姓名和其leader的姓名(类似于求节点及其父节点)

我们来详细解释一下上面的代码。对于同一张employee表,我们把e1作为员工表,e2作为领导表。首先把全部的员工列出来(基于左外连接),然后找到我们所需要的条件:员工的经理id(e1.leader)等于经理表的id(e2.id)。

举例:查询出所有leader的姓名。

分析的道理同上。

其实,上面的两个查询结果都是下面这个查询结果的一部分:

三、子查询:

作用:某些情况下,当进行查询的时候,需要的条件是另外一个select 语句的结果,这个时候,就要用到子查询。

定义:为了给主查询(外部查询)提供数据而首先执行的查询(内部查询)被叫做子查询。也就是说,先执行子查询,根据子查询的结果,再执行主查询。

关键字:用于子查询的关键字主要包括 IN、NOT IN、EXIST、NOT EXIST、=、<>等(符号“<>”的意思是:不等于)。

备注:MySQL从4.1开始才支持SQL的子查询。一般说子查询的效率低于连接查询(因为子查询至少需要查询两次,即至少两个select语句。子查询嵌套也多,性能越低)。表连接都可以用子查询替换,但反过来说却不一定。

我们一下面的这张员工表举例:

1、举例:查询月薪最高的员工的名字

上面的例子中,我们就是先通过聚合函数查出最高的月薪,然后根据这个值查出对应员工的名字。

2、举例:查询出每个部门的平均月薪

上面的例子中,先将部门进行分类(前提是部门不能为空),然后分别单独求出各类中的薪水平均值。

注:这里我们没有用到子查询,因为比较麻烦。

3、举例:查询月薪比平均月薪高的员工的名字(我们知道,整体的平均工资是250)

疑问:如果要查询比部门平均工资高的员工,该怎么写呢?下面的这种写法是错误的:

四、索引

主要内容如下:

关于索引,推荐的学习链接:

http://www.cnblogs.com/hustcat/archive/2009/10/28/1591648.html(大牛)

http://blog.csdn.net/cuidiwhere/article/details/8452997

http://www.cnblogs.com/cq-home/p/3482101.html

1、索引的概念:

索引是数据库中用来提高查询性能的最常用工具。

所有MySQL列类型都可以被索引,对相关列使用索引是提高SELECT操作性能的最佳途径。索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存。

在使用以下操作符时,都会用到相关列上的索引:

注:索引的值因为不断改变,所以是它需要维护的。如果数据量较少,建议不用索引。

2、normal普通索引(第一种索引)

语法:

CREATE INDEX 索引名 ON 表名(列名[(length)]…); 

举例:

然后,我们在表中可以看到新创建的索引:(我们可以在这个navicat的可视化界面中修改索引类型)

语法:

ALTER TABLE 表名 ADD INDEX [索引名] (列名[(length)]…); 
CREATE TABLE 表名 ( 表名 ([...],INDEX [索引名] (列名[(length)]…); 

注意:如果要创建索引的列的类型是CHAR、VARCHAR类型,length可以小于字段实际长度;如果是BLOB和TEXT类型,必须指定length。

3、unique 唯一索引:(第二种索引)

这种索引和前面的“普通索引”基本相同,但有一个区别:索引列的所有值都必须唯一。例如可以将身份证号作为索引。

创建方式和上方的普通索引类似。即:将普通索引的“index”改为“unique index”。

4、主键索引(一种特殊的唯一索引)

主键是一种特殊的唯一索引,一般在创建表的时候指定。在 MYSQL 中,当你建立主键时,主键索引同时也已经建立起来了,不必重复设置。

记住:一个表只能有一个主键,也即只有一个主键索引。

5、FULLTEXT全文索引:(第三种索引)

MySQL从3.2版开始支持全文索引和全文检索。在MySQL中,全文索引的索引类型为FULLTEXT。

MySQL5.0版本只有MyISAM存储引擎支持FULLTEXT,并且只限于CHAR、VARCHAR和TEXT类型的列上创建。

注:全文索引维护起来很吃力,所以了解即可。

创建方式和上方的普通索引类似。即:将普通索引的“index”改为“fulltext index”。

6、删除、禁用索引:

一般使用“删除”,不使用“禁用”。

删除索引:

语法:

DROP INDEX 索引名 ON 表名 

对于MyISAM表在做数据大批量导入时,它会边插入数据边建索引。所以为了提高执行效率,应该先禁用索引,在完全导入后,再开启索引。而InnoDB表对索引都是单独处理的,无需禁用索引。

禁用索引:

ALTER TABLE 表名 DISABLE KEYS; 

打开索引:

ALTER TABLE 表名 ENABLE KEYS;

7、设计索引的原则:

如:CREATE INDEX part_of_name ON employees(name(10));  这个句子中指定的length长度为10,就是使用短索引,也就是说取name的前十个字符。

MySQL(4)-----DML数据库操作(下)相关推荐

  1. mysql写下拉树_PHP+mysql实现从数据库获取下拉树功能的方法

    这篇文章主要介绍了PHP+mysql实现从数据库获取下拉树功能,结合实例形式分析了php+mysql数据库查询及select下拉框输出查询结果的实现技巧,需要的朋友可以参考下 本文实例讲述了PHP+m ...

  2. Node.js 连接 MySQL 并进行数据库操作 –node.js 开发指南

    Node.js是一套用来编写高性能网络服务器的JavaScript工具包 通常在NodeJS开发中我们经常涉及到操作数据库,尤其是 MySQL ,作为应用最为广泛的开源数据库则成为我们的首选,本篇就来 ...

  3. linux如何mysql实现导出数据库,Linux下MySQL导入导出数据库

    linux下 一.导出数据库用mysqldump命令(注意mysql的安装路径,即此命令的路径): 1.导出数据和表结构: mysqldump -u用户名 -p密码 数据库名 > 数据库名.sq ...

  4. ThinkPHP6之数据库操作下

    ThinkPHP6之数据库操作下 前言 一,查询表达式 1.1 where 1.2table和name 1.3field 1.4limit 1.5page 1.6 order 二, 聚合查询 三,分页 ...

  5. 【MySQL】DML常见操作

    文章目录 DML常见操作 一.插⼊操作 1.插⼊单⾏2种⽅式 ⽅式1 ⽅式2 2.批量插⼊2种⽅式 ⽅式1 ⽅式2 3.测试 二.数据更新 1.单表更新 2.多表更新 三.删除数据操作 1.使⽤del ...

  6. mormot mysql,mORMot 数据库操作

    mORMot 数据库操作 1 使用Access数据库, 引用SynCommons, SynDB,SynOleDb三个单元. var gProps: TSQLDBConnectionProperties ...

  7. emlog mysql文件,emlog数据库操作类

    /** * 数据库操作类 * * @copyright (c) Emlog All Rights Reserved */ /** * MYSQL数据操方法封装类 */ class MySql { /* ...

  8. MySQL DML数据库操作

    DML是指数据操作语言,英文全称是Data Manipulation Language,用来对数据库中表的数据记录进行更新. 关键字: 插入insert 删除delete 更新update 思维图: ...

  9. nodec mysql_Node.js 连接 MySQL 并进行数据库操作 –node.js 开发指南

    Node.js是一套用来编写高性能网络服务器的JavaScript工具包 通常在NodeJS开发中我们经常涉及到操作数据库,尤其是 MySQL ,作为应用最为广泛的开源数据库则成为我们的首选,本篇就来 ...

  10. MYSQL DDL DML代码操作

    MYSQL理论 数据库是一个将数据按照一定的数据结构进行组织 ,存储 和 管理的仓库. 关系型数据库指的就是将数据按照一定的关系模组来进行组织的数据库管理系统. 非关系型数据库-NOSQL就是将数据按 ...

最新文章

  1. addEventListener()与removeEventListener()
  2. 随想_8_Windows_XP_Explorer_错误
  3. 爱耳日腾讯天籁行动再升级 助力100位青年听障人才打破“屏障”
  4. java贪吃蛇不能回头,儿时回忆!泪流满面,Java 实现贪吃蛇游戏的示例(附代码)...
  5. P1681 最大正方形 Iand II
  6. 1.eclipse怎么样新建web项目,eclipse新建web项目
  7. 键盘压缩背景,ios滚动不流畅,禁止遮罩层下面内容滚动
  8. FileBeats安装
  9. 微信小程序报thirdScriptError Cannot read property 'setData' of undefined
  10. Python分析一下双色球,中大奖指日可待!
  11. HTML窗口与对话框
  12. mysql ndb 命令_Mysql入门基础命令
  13. python学而思和猿辅导哪个好_学而思和猿辅导哪个好,说说我的评价
  14. html编辑个人信息页面,编辑个人信息.html
  15. JAVA计算机毕业设计林家餐厅自助点餐管理系统(附源码、数据库)
  16. android 闪光灯程序,如何在Android中以编程方式打开前闪光灯?
  17. nodejs项目mysql使用sequelize支持存储emoji
  18. 负数在计算机中的存储和表示
  19. usaco 奶牛集会 奶牛抗议
  20. MacBookPro硬盘升级记

热门文章

  1. 手动构建Docker镜像
  2. LeetCode之Rectangle Overlap(Kotlin)
  3. live555 rtsp直播卡顿马赛克优化
  4. WCF系列教程之客户端异步调用服务
  5. Linux--进程组 作业 会话 守护(精灵)进程
  6. 《C语言及程序设计》程序阅读——数组与指针
  7. 王方月 - 《君王2》与cocos2d-x的邂逅
  8. 荣之联:生物云仅仅是开始
  9. 自己常用js方法(DOM操作)
  10. 数组模拟栈解决括号匹配