十九:插入数据

1:insert语句用来将行插入数据表中,可以插入完整的行、行的一部分、插入多行、插入某些查询的结果。

2:不指定列名,可以这样插入:

insert into customers

values(null,

'pep e. lapew',

'100 main street',

'los angeles',

'ca',

'90046',

'usa',

null,

null);

这种形式中,每个列必须提供一个值,如果某个列没有值,则使用null。每个列按照他们在表中定义中出现的次序填充。因为cust_id可以自动增加,所以可以为null。

这种形式虽然简单,但是不安全,并且高度依赖于表中列的定义次序,所以要避免使用。

3:更安全的使用insert的方法是:

insert into customers(cust_name,

cust_address,

cust_city,

cust_state,

cust_zip,

cust_country,

cust_contact,

cust_email)

values('pope lapew',

'100 main street',

'los angels',

'ca',

'90046',

'usa',

null,

null);

表名后面的括号中,明确给出了列名,在插入行时,mysql将用values列表中的相应值填入列表中的对应项。values必须以指定的次序匹配指定的列名。指定列名后,必须在values中给出每个列的值。

使用这种语法,还可以省略某些列,比如上例中cust_id就省略了。省略的列必须满足两个条件中的一个:该列定义时允许NULL值;在表定义中给出默认值。

4:insert操作可能很耗时,特别是有许多索引需要更新时,而且他还可能降低select的性能。如果一系列操作中,select操作很重要,则可以使用low_priority关键字,指示mysql降低insert语句的优先级,比如:insert low_priority into 表名...

5:如果需要插入多个行,可以使用多条insert语句。也可以使用一条insert语句,比如:

insert into customers(cust_name,

cust_address,

cust_city,

cust_state,

cust_zip,

cust_country)

values('pop e lapew',

'100 main street',

'los angels',

'ca',

'90046',

'usa'),

(

'm martian',

'42 galaxy way',

'new york',

'ny',

'11213',

'usa');

这样处理,可以提高数据库处理的性能,使用一条insert语句进行多行插入比多条insert语句更快。

6:insert还可以将一条select语句的结果插入表中,也就是insert select语句,比如:

insert into customers(cust_id,

cust_contact,

cust_email,

cust_name,

cust_address,

cust_city,

cust_state,

cust_zip,

cust_country)

select cust_id,

cust_contact,

cust_email,

cust_name,

cust_address,

cust_city,

cust_state,

cust_zip,

cust_country

from custnew;

这个例子,使用insert select将custnew中所有数据导入到customers中。select语句从custnew中检索出需要插入的值,select中列出的每个列对应于customers表名后所跟的列表中的每个值。

此例中,insert和select语句使用了相同的列名。但是,不一定要求列名匹配,mysql不关心select返回的列名,他使用的是列的位置。因此select中的第一列,不管其列名,将用来填充表列中指定的第一个列,如此类推。

insert select中,select语句可包含where子句来过滤需要插入的数据。

二十:更新和删除数据

1:更改表中的数据,使用update语句,可以更新特定的行,也可以更新所有行。在使用update时一定要细心,因为稍不注意,省略了where子句,就会更新表中所有行。

2:比如:

update custnew

set cust_email = 'hh@hh.com'

where cust_id = 10007;

update语句中where子句,告诉mysql更新哪一行。如果没有where子句,则mysql将会把表中所有行的cust_email值都改变,比如:

update custnew

set cust_email = 'hh@hh.com'

结果如下:

3:如果需要更新多个列,则:

update custnew

set cust_name = 'hh',

cust_email = 'hh@163.com'

where cust_id = 10007;

更新多个列,只需要单个set命令,每个key=value之间用逗号分隔。

4:如果用update语句更新多行,并且在更新过程中,其中一行或多行出现错误,则整个update操作将被取消,已经更新的行将恢复到它们原来的值。

如果需要即使发生错误,也继续更新,则可以使用ignore关键字,比如:update ignore customers...;

5:为了删除某个列的值,可设置它为NULL,比如:

update customers

set cust_email = NULL

where cust_id = 10005;

6:使用delete语句,可以删除表中特定行或所有行。使用delete语句需要小心,因为稍不注意,可能会删除表中所有行。

7:比如:

delete from custnew

where cust_id = 10007;

注意,如果没有where子句,则delete将删除表中的所有行。而且,delete子句删除的是整行,而不是某一列。

8:如果需要删除表中的所有行,不要使用delete,应该用truncate table语句,因为它更快。

9:使用update和delete时,一定注意不要遗忘了where子句,否则,将会影响到表中的所有行。

二十一:创建和操纵表

1:使用create table语句创建表,比如:

CREATE TABLE customers

(

cust_id             int              NOT NULL    AUTO_INCREMENT,

cust_name       char(50)    NOT NULL ,

cust_address   char(50)    NULL ,

cust_city           char(50)    NULL ,

cust_state         char(5)     NULL ,

cust_zip            char(10)   NULL ,

cust_country     char(50)   NULL ,

cust_contact     char(50)   NULL ,

cust_email        char(255)  NULL ,

PRIMARY KEY (cust_id)

)ENGINE=InnoDB;

表明紧跟在create table之后,实际的表定义在表名后面的圆括号之中。每个列以列名开始,后跟数据类型等。表的主键可以用primary key指定。

2:创建表时,指定的表必须不能存在,否则会出错。

3:如果某个列的定义中含有关键字NOT NULL,则将会阻止插入没有值的列,如果试图插入没有值的列,则返回错误。

NULL为默认设置,如果不指定NOT NULL,则认为指定的是NULL。注意,NULL与空串不同。

4:如果需要指定多个列组成的主键,则语法如下:

create table orderitems

(

...

primary key (order_num,order_item)

);

5:使用auto_increment,可以在每当增加一行是自动增量。每个表只允许一个auto_increment列,而且它必须被索引。

在insert时,如果指定了值,则该值会覆盖自动生成的值。后续的增量将开始使用该手工插入的值。

last_insert_id()函数可以获得当前的增量值。

6:默认值使用default关键字指定。

7:创建表时,可以使用ENGINE=InnoDB;指定特定的引擎。

与其他的DBMS一样,MySQL有一个具体管理和处理数据的内部引擎,多数时候它隐藏在DBMS内,不需要过多的关注它。

但MySQL与其他的DBMS不一样,它具有多种引擎,它打包多个引擎,这些引擎都隐藏在MySQL服务器内,全都能处理用户的请求。

为什么要发行多种引擎呢,因为他们具有各自不同的功能和特性,为了不同的任务选择正确的引擎能获得良好的功能和灵活性

当然你也可以省略这些数据库引擎,如果省略ENGINE=语句,则使用默认引擎(很可能为MyISAM),多数sql语句都会默认使用它,但并不是所有的语句都默认使用它,这就是为什么ENGINE=语句很重要的原因。

以下几个需要知道的引擎

InnoDB是一个可靠的事务处理引擎,它不支持全文本搜索。

MEMORY 在功能上等同于MyISAM,但由于数据存储在内存,所以速度更快(特别适用于临时表)

MyISAM是一个性能极高的引擎,它支持全文本搜索,但不支持事务处理.

8:更新表,使用ALTER TABLE语句,但是在理想状态下,当表中存储了数据后就不应该再去更新表了。所以在设计表时需要花费大量的时间去考虑,以便后期不做太大的改动。

比如:

添加一列 ALERT TABLE vendors ADD vend_phone CHAR(20);必须指明数据类型

删除一列 ALERT TABLE vendors DORP vend_phone;

9:删除表

DORP TABLE tablename;   不可撤销,永久删除表

重命名表

RENAME TABLE table1 TO table2;  多个表重命名 逗号分隔开,比如:

rename table table1 to table11,

table2 to table12,

table3 to table13;

二十二:使用视图

1:mysql 5添加了对视图的支持。视图是虚拟的表。与包含数据的表不一样,视图只包含使用时动态检索数据的查询。

2:比如下面的语句:

select cust_name, cust_contact  from  customers, orders, orderitems where

customers.cust_id= orders.cust_id and

orders.order_num= orderitems.order_num and

orderitems.prod_id= 'TNT2';

如果使用视图,可以将整个查询包装成一个名为productcustomers的虚拟表,则采用下面的查询即可得到相同的结果:

select cust_name, cust_contact from productcustomers where prod_id = ‘TNT2’;

这就是视图的作用,productcustomers是一个视图,作为视图,它不包含表中应该有的任何数据,它包含的是一个sql查询。

3:下面是视图的一些常见应用:

重用sql语句;

简化复杂的sql操作。在编写查询后,可以方便的重用它而不必知道它的基本查询细节;

使用表的组成部分而不是整个表;

保护数据。可以给用户授予表的特定部分的访问权限而不是整个表的访问权限;

更改数据格式和表示,视图可返回与底层表的表示和格式不同的数据;

在视图创建之后,可以用与表基本相同的方式利用它们。可以对视图进行select操作,过滤和排序操作,将视图联接到其他视图或表,甚至能添加和更新数据。

重要的是知道视图仅仅是用来查看存储在别处的数据的一种设施。视图本身不包含数据,因此他们返回的数据是从其他表中检索出来的。

因为视图不包含数据,所以每次使用视图时,都必须处理查询执行时所需的任一个检索。

4:视图的创建:

视图用create view语句来创建;

使用show create view viewname; 来查看创建视图的语句;

用drop删除视图,其语法为drop view viewname;

更新视图时,可以先用drop,再用create,也可以使用create or replace view;该语句的效果是:如果更新的视图不存在,则会创建一个视图;如果要更新的视图存在,则会替换原有视图。

5:上面的例子,使用视图的方法:

create view productcustomers as

select cust_name, cust_contact, prod_id

from customers, orders, orderitems

where customers.cust_id = orders.cust_id

and orderitems.order_num = orders.order_num;

productcustomers就是一个视图,可以使用下面的语句检索出订购了产品‘TNT2’的客户:

select cust_name, cust_contact fromproductcostomerswhere prod_id = ‘TNT2’;

6:可以用视图的方法,重新格式化检索出的数据,比如:

create view vendorlocations as

select concat(rtrim(vend_name), '(', rtrim(vend_country), ')')

as vend_title

from vendors

order by vend_name;

select *  from vendorlocation; 结果如下:

7:可以用视图过滤不想要的数据,比如可以过滤没有电子邮件的客户:

create view customeremaillist as

select cust_id, cust_name, cust_email

from customers

where cust_email is not null;

select * from customeremaillist; 结果如下:

8:可以将视图与计算字段结合,比如:

create view orderitemsexpanded as

select order_num,

prod_id,

quantity,

item_price,

quantity*item_price as expanded_price

from orderitems;

select * from orderitemsexpanded where order_num = 20005; 结果如下:

9:迄今为止,所有的视图都是和select语句使用的。然而,视图的数据是否能更新,这需要视情况而定。

通常,视图是可更新的,也就是可以对它们使用insert、update和delete。更新一个视图将更新其基表。如果你对视图增加或删除行,实际上是对其基表增加或删除行。

但是,并非所有视图都是可更新的。如果mysql不能正确的确定被更新的基数据,则不允许更新。也就是说,如果视图定义中有以下操作,则不能进行视图的更新:分组;联接;子查询;并;聚集函数、distinct、导出列。

一般而言,应该将视图用于检索,而不是更新。

《mysql必知必会》笔记3(插入、更新、删除、创建删除更新表、视图)的更多相关文章

  1. MySQL必知必会(第4版)整理笔记

    参考书籍: BookName:<SQL必知必会(第4版)> BookName:<Mysql必知必会(第4版)> Author: Ben Forta 说明:本书学习笔记 1.了解 ...

  2. 【SQL必知必会笔记(1)】数据库基础、SQL、MySQL8.0.16下数据库、表的创建及数据插入

    文章目录 1.数据库基础 1.1 数据库(database) 1.2 表(table) 1.3 列和数据类型 1.4 行 1.5 主键 2.什么是SQL 3.创建后续练习所需数据库.表(MySQL8. ...

  3. MySQL必知必会1-20章读书笔记

    MySQL备忘 目录 目录 使用MySQL 检索数据 排序检索数据 过滤数据 数据过滤 用通配符进行过滤 用正则表达式进行搜索 创建计算字段 使用数据处理函数 数值处理函数 汇总数据 分组数据 使用子 ...

  4. 《mysql必知必会》读书笔记--存储过程的使用

    以前对mysql的认识与应用只是停留在增删改查的阶段,最近正好在学习mysql相关内容,看了一本书叫做<MySQL必知必会>,看了之后对MySQL的高级用法有了一定的了解.以下内容只当读书 ...

  5. 《MySQL必知必会》学习笔记整理

    简介 此笔记只包含<MySQL必知必会>中部分章节的整理笔记.这部分章节主要是一些在<SQL必知必会>中并未讲解的独属于 MySQL 数据库的一些特性,如正则表达式.全文本搜索 ...

  6. MySQL必知必会复习笔记(1)

    MySQL必知必会笔记(一) MySQL必知必会是一本很优秀的MySQL教程书,并且相当精简,在日常中甚至能当成一本工作手册来查看.本系列笔记记录的是:1.自己记得不够牢的代码:2.自己觉得很重要的代 ...

  7. MySQL使用和操作总结(《MySQL必知必会》读书笔记)

    简介 MySQL是一种DBMS,即它是一种数据库软件.DBMS可分为两类:一类是基于共享文件系统的DBMS,另一类是基于客户机——服务器的DBMS.前者用于桌面用途,通常不用于高端或更关键应用. My ...

  8. 读《MySql必知必会》笔记

    MySql必知必会 2017-12-21 意义:记录个人不注意的,或不明确的,或不知道的细节方法技巧,此书250页 登陆: mysql -u root-p -h myserver -P 9999 SH ...

  9. 《MySQL必知必会》学习笔记——前言

    前言 MySQL已经成为世界上最受欢迎的数据库管理系统之一.无论是用在小型开发项目上,还是用来构建那些声名显赫的网站,MySQL都证明了自己是个稳定.可靠.快速.可信的系统,足以胜任任何数据存储业务的 ...

  10. 读书笔记汇总 - SQL必知必会(第4版)

    本系列记录并分享学习SQL的过程,主要内容为SQL的基础概念及练习过程. 书目信息 中文名:<SQL必知必会(第4版)> 英文名:<Sams Teach Yourself SQL i ...

随机推荐

  1. 关于maven 把插件依赖一起打包进jar问题

    今天在做storm on maven的时候发现要依赖到storm-hdfs的jar.自己又非常不想把乱七八糟的东西丢上自己的集群lib.于是就想maven 打包的时候把插件一块打包进jar.maven ...

  2. react-native start停止在Loading dependency graph, done.

    在试验的过程中. 发现运行 react-native start会卡住,停留在Loading dependency graph, done. 原因大概是之前运行过 react-native run-a ...

  3. [NOI OJ]6044:鸣人和佐助

    6044:鸣人和佐助 查看 提交 统计 提问 总时间限制:  1000ms 内存限制:  65536kB 描述 佐助被大蛇丸诱骗走了,鸣人在多少时间内能追上他呢? 已知一张地图(以二维矩阵的形式表示) ...

  4. 【python之路28】模块python与excel

    一.可使用的第三方库 python中处理excel表格,常用的库有xlrd(读excel)表.xlwt(写excel)表.openpyxl(可读写excel表)等.xlrd读数据较大的excel表时效 ...

  5. [转]深入理解定位父级offsetParent及偏移大小

    偏移量(offset dimension)是javascript中的一个重要的概念.涉及到偏移量的主要是offsetLeft.offsetTop.offsetHeight.offsetWidth这四个 ...

  6. mysql 导入txt数据

    在导入数据的时候,特别是数据包含中文的时候,在导入的时候,容易出现编码规则引起的错误.例如错误提示:Invalid utf8 character string: '' 这种情况下,我们可以把需要导入的 ...

  7. 使用 WPF 生成图形

    下载代码示例 基于一组与测试有关的数据来生成图形是一项常见的软件开发任务.根据我的经验,最常用的方法是将数据导入 Excel 电子表格,然后使用 Excel 内置的绘图功能手动生成图形.这种做法适用于 ...

  8. php用mysql方式连接数据库出现Deprecated报错

    以上是用php5.5 连接mysql数据库时报的错. 于是我用php5.4 连接正常没有报错. 这与mysql版本无关系,php 5.x版本,如5.2.5.3.5.4.5.5,怕跟不上时代,新的服务器 ...

  9. Linux下根目录root扩容

    参考博客:https://blog.csdn.net/qq_36527339/article/details/81772996 1.首先虚拟机关机 —> 选中要扩容的虚拟机 —>编辑虚拟机 ...

  10. IO流6 --- FileReader中使用read(char[] cbuf)读入数据 --- 技术搬运工(尚硅谷)

    FileReader 字符输入流 @Test public void test2(){ File file = new File("hello.txt"); FileReader ...