第一章
- 什么是数据库
数据库是一个以某种有组织的方式存储的数据的集合,需要区分数据库和数据库软件,数据库软件称为DBMS(数据库管理系统),数据库是通过DBMS创建和操作的容器。我们并不能直接访问数据库,而是通过DBMS来访问数据库。 - 表
表是某种特定类型数据的结构化清单,表是一种结构化文件,可用来存储某种特定类型的数据。数据库中每个表都有自己的名字,用来标示自己,此名字是唯一的。 - 模式
模式是关于数据库和表的布局及特性的信息,可以用来描述数据库中特定的表以及整个数据库 - 列与行
列是表中的一个字段,所有表都是由一个或多个列组成的。数据库中每个列都有相应的数据类型,数据类型定义列可以存储的数据类型
行是表中的一个记录,每一行是一个记录 - 主键
主键是表的一列(或一组列),其值可以唯一区分表中的每一行
表中的任意一列都可以作为主键,只要它满足:
- 任意两行都不具有相同的主键值
- 每一行都必须具有一个主键值(主键列不允许NULL值)
使用主键的好习惯:
- 不更新主键列中的值
- 不重用主键列的值
- 不在主键列中使用可能会更改的值
- 什么是SQL
SQL是结构化查询语言(Structured Query Language),是一种专门用来与数据库通信的语言
SQL有如下优点:
- SQL不是某个特定数据库供应商专有的语言,学习此语言可以喝几乎所有的数据库打交道
- SQL简单易学
- SQL尽管看上去简单,但它实际上是一种强有力的语言,灵活使用其语言元素,可以进行非常复杂和高级的数据库操作
第二章 MySQL简介
- 什么是MySQL
数据的所有存储,检索,管理和处理实际上由数据库软件完成,MySQL是一种DBMS,即它是一种数据库软件
MySQL的优点:
- 成本,MySQL是开源的,一般可以免费使用
- 性能,MySQL执行非常快
- 可信赖,一些主流的大公司都在使用它
- 简单,MySQL很容易安装和使用
- DBMS的分类
DBMS分为两类:
- 基于共享文件系统的DBMS(
Microsoft Access
和FileMaker
) - 基于客户机-服务器的DBMS,如
MySQL
,Oracle
,Microsoft SQL Server
服务器部分是负责所有数据的访问和处理的软件,这个软件运行在称为数据库服务器的计算机上,与数据库打交道的只有服务器软件,客户机是与用户打交道的软件。客户机软件提交请求,服务器软件处理请求,并将结果送回到客户机软件
- 基于共享文件系统的DBMS(
- MySQL工具
- mysql命令行实用程序
- MySQL Administrator
- MySQL Query Browser
第三章 使用MySQL
- 连接
为了连接到MySQL,需要一下信息:
- 主机名(计算机名),如果连接到本地MySQL服务器,为localhost
- 端口(如果使用默认端口3306之外的端口)
- 一个合法的用户名
- 用户口令(如果需要)
- 选择数据库
在最初连接到MySQL时,没有任何数据库打开供我们使用,需要选择一个数据库,使用USE
关键字,USE语句不返回任何结果,依赖于使用的客户机,显示某种形式的通知 - 了解数据库和表
数据库,表,列,用户,权限等信息被存储在数据库和表中,可用SHOW
命令来显示这些信息
show databases
返回可用数据库的一个列表,包含在这个表中的可能是MySQL内部使用的数据库,如mysql
和information_schema
等show tables
返回当前选择的数据库内可用表的列表show columns form xx
也可以用describe xx
显示表列,对于给定的表名,每个字段返回一行,行中包括字段名,数据类型,是否允许为NULL,键信息,默认值以及其它信息show status
用于显示广泛的服务器状态信息show create database xx
和show create table xx
用于显示创建特定数据库或表的信息show grants'
show errors
用来显示授予用户的安全权限 </li>
<li>和
show warnings`
用来显示服务器错误或警告信息
第四章 检索数据
- select语句
它的用途是从一个或多个表中检索信息,为了使用select
检索表数据,必须至少给出两条信息:
- 想选择什么
- 从什么地方选择
- 检索单个列
select xx from yy
利用select
语句从yy
表中检索出名为xx
的列,所需的列名在select
关键字后给出,from
关键字后跟表名。返回的数据没有过滤,也没有排序 - 检索多个列
使用select
关键字,需要给出多个列名,列名之间必须以逗号分隔
select xx,yy from zz
这条语句可以返回两个列 - 检索所有列
使用通配符*
来达到
select * from xx
如果给定一个通配符*
,则返回表中的所有列,列的顺序一般是列在表定义中出现的顺序 - 检索不同的行
解决办法是使用distinct
关键字,此关键字指示MySQL只返回不同的值
select distinct xx from yy
这条语句只返回不容的xx行,如果使用distinct
关键字,它必须放在列名的前面 - 限制结果
为了返回第一行或者前几行,可以使用limit
子句
select xx from yy limit 4
此语句使用select语句检索单个列,limit 4
指示MySQL返回不多于4行
select xx from yy limit 4,4
limit 3,4
指示MySQL返回从行3开始的以下4行,第一个数为开始位置,第二个数为要检索的行数(第一行从0开始),MySQL 5支持limit的另一种替代语法limit 4 offset 3
- 使用完全限定的表名和列名
select xx.yy from xx
这条语句指定了表xx中的具体列(yy)select xx.yy from zz.xx
这条语句指定了zz数据库中的具体表(xx)
第五章 排序检索数据
- 排序数据
关系数据库设计理论认为,如果不明确规定排序顺序,则不应该假定检索出的数据的顺序有意义
- 子句
SQL语句由子句构成,有些子句是必需的,有些子句是可选的
为了明确的排序select语句检索出的数据,可使用order by
子句,order by
子句取一个或多个列的名字,据此对输出进行排序
select xx from yy order by xx
排序所使用的列可以为显示的列,也可以是其它列
- 子句
- 按多个列排序
经常需要按不止一个列进行数据排序(如果由相同的行,这个很有用)
select xx from yy order aa,bb
这个语句的输出,尽在多个行具有相同的aa值时才对yy按bb进行排序,如果aa列中所有值都是唯一的,则不会按照bb排序 - 指定排序方向
数据排序不仅限于升序排序,这只是默认的排序顺序,还可以使用order by
子句以降序排序,为了进行降序排序,需要使用desc
关键字
select * from xx order by yy desc
这条语句按照yy列的降序来排序select * from xx order by yy desc,zz
这条语句先对yy进行降序排序,然后在对zz进行升序排序。desc
关键字只应用到位于其前的列名,如果想在多列上进行降序排序,必须对每个列制定desc
关键字。与desc
相反的关键字是asc
,没多大用处,因为升序是默认的select * from xx order by yy desc limit 1
使用order by
和limit
组合,可以找出一个列中最高或最低的值,limit
子句位于order by
子句之后
第六章 过滤数据
- 使用where子句
数据库很少需要检索所有行,至检索所需数据需要制定搜索条件,搜索条件也称过滤条件。在select语句中,数据根据where子句中指定的搜索条件进行过滤,where子句在from子句之后给出
select xx from yy where xx = val
这条语句只返回xx=val的行,当同时使用order by子句和where子句时,应将order by子句放到where子句之后,否则将发生错误 where子句操作符
MySQL支持的条件操作符:- = 等于
- <> 不等于
- != 不等于
- < 小于
- <= 小于等于
- /> 大于
- />= 大于等于
between 在指定的两个值之间
检查单个值
- 不匹配检查 !=
- 范围值检查 使用between操作符,指定的两个值必须用and分割
- 空值检查 where xx is null
在创建表时,表设计人员可以指定其中列是否可以不包含值,在一个列不包含值时,称其为包含空值NULL.空值和0,空字符串,空格不同
第七章 数据过滤
- 组合where子句
MySQL允许给出多个where子句,这些子句可以两种方式使用:
- and子句方式
- or子句方式
以上两个操作符称为逻辑操作符 - and操作符
select xx,yy from zz where aa = val1 and bb < val2
and指示DBMS只返回满足所有给定条件的行,还可以条件多个过滤条件,每添加一条就要使用一个and - or操作符
与and操作符不同,它知识MySQL检索匹配任一条件的行
select xx,yy from zz where aa = val1 or aa = val2
or操作符高速DBMS匹配任一条件而不是同时匹配两个条件 - 计算次序
where可包含任意数目的and和or操作符,允许两者结合进行复杂和高级的过滤。and的优先级高于or的优先级,优先计算and操作符,为了解决计算次序问题,where子句可以使用圆括号
- in操作符
圆括号在where子句中还有另外一种用法,in操作符用来指定条件范围,in取合法值的清单用逗号隔开,全都放在圆括号里
select xx from yy where zz in (val1,val2)
此select语句检索zz等于val1和val2的所有行,or操作符也能完成相同的功能
- 为什么要用in操作符呢
- 在使用长的合法清单时,in操作符的语法更清楚直观
- 在使用in操作符时,计算次序更容易管理(因为使用的操作符较少)
- in操作符一般比or操作符执行的快
- in的最大优点是可以包含其他select语句,使得能够动态的建立where子句
- 在使用长的合法清单时,in操作符的语法更清楚直观
- not操作符
not操作符只有一个功能,就是否定它之后的所有条件
select xx from yy where zz not in (val1,val2)
这条语句匹配val1和val2之外的所有行
MySQL支持not对in,between和exists子句去反
- 为什么要用in操作符呢
第八章 用通配符进行过滤
- like操作符
通配符是用来匹配值的一部分的特殊字符
搜索模式是由字面值,通配符或两者组合构成的搜索条件
为在搜索子句中使用通配符,必须使用like操作符。like指示MySQL后跟的搜索模式利用通配符匹配而不是直接相等匹配进行比较
- 百分号通配符(%)
最常使用的通配符是百分号(%),在搜索串中,%表示任何子符出现任意次数
select xx from yy where zz like 'hello%'
这条语句检索任意以hello
开头的词。%操作符告诉MySQL接受hello
之后的任意字符,不管它有多少字符
select xx from yy where zz like '%hello%'
通配符可以在搜索模式中任意位置使用,并且可以使用多个通配符。搜索模式%hello%
表示匹配任何位置包含文本hello的值
%代表搜索模式中给定位置的0个,1个或多个字符
注意where xx like '%'
并不能匹配值为NULL的行 - 下划线通配符 (_)
下划线只匹配单个字符
- 百分号通配符(%)
- 使用通配符的技巧
通配符搜索处理一般比前面讨论的其他搜索所花的时间长,这里给出通配符的使用技巧:
- 不要过度使用通配符。如果其他操作符可以达到相同目的,应该使用其他操作符
- 在确实需要使用通配符时,除非绝对必要,否则不要把它们放在搜索模式的开始处,这样是最慢的
- 仔细注意通配符的位置
第九章 用正则表达式进行搜索
- 正则表达式
正则表达式是用来匹配文本的特殊的串(字符集合)。所有种类的程序设计语言,文本编辑器,操作系统等都支持正则表达式
正则表达式用正则表达式语言建立,正则表达式语言是一种特殊的语言,与任意语言一样,正则表达式具有我们必须学习的特殊语法和指令 使用MySQL正则表达式
正则表达式的作用时匹配文本,将一个模式(正则表达式)与一个文本进行比较。MySQL用where子句对正则表达式提供初步的支持,允许指定正则表达式,过滤select检索出来的数据。MySQL仅支持正则表达式语言的一个子集
基本字符匹配
select xx from yy where zz regexp 'hh'
这条语句看上去非常像使用like的语句。它告诉MySQL:regexp后所跟的东西作为正则表达式处理
.是正则表达式语言中一个特殊的字符,它表示匹配任意一个字符like与regexp的区别
like匹配整个列,如果被匹配的文本在列值中出现,like将不会找到它。regexp在列值内进行匹配,如果被匹配的文本在列值中出现,regexp将会找到它。regexp使用定位符^和$也可以匹配整列- 进行or匹配
为搜索两个串之一,使用|
select xx from yy where zz regexp 'hello|hi'
这条语句使用正则表达式hello|hi,|为正则表达式的or操作符,它表示匹配其中之一,因此hello和hi都匹配并返回。 - 匹配几个字符之一
使用[]括起来几个字符
select xx from yy where zz regexp '[123]hello'
这条语句使用了正则表达式[123]hello,[123]定义了一组字符,它的意思是匹配1或2或3。 [123]是[1|2|3]的缩写,也可以使用后者。[^123]匹配除这些字符外的任何东西 - 匹配范围
例如[1-4]匹配从1到4所有数字,,[a-z]匹配任意字母
select xx from yy where zz regexp '[1-3]hello'
这条语句和上面的[123]功能是相同的 - 匹配特殊字符
为了匹配特殊字符,必须用\为前导。\-表示查找-,\.表示查找.。这种处理就是所谓的转义。
为了匹配\,需要使用\\
多数正则表达式使用\转义特殊字符,但MySQL要求使用两个\转义(MySQL自己解释一个,正则表达式库解释另一个)
- 匹配字符类
字符类有: - [:alnum:] 任意字母和数字([a-zA-Z0-9])
- [:alpha:] 任意字符([a-zA-Z])
- [:blank:] 空格和制表([\t])
- [:cntrl:] ASCII控制字符
- [:digit:] 任意数字([0-9])
- [:graph:] 与[:print:]相同,但不包含空格
- [:lower:] 任意小写字母([a-z])
- [:print:] 任意可打印字符
- [:punct:] 既不在[:alnum:]又不在[:cntrl:]中的任意字符
- [:space:] 包括空格在内的任意空白字符([\f\n\r\t\v])
- [:upper:] 任意大写字母([A-Z])
[:xdigit:] 任意十六进制数字([a-fA-F0-9])
匹配多个实例
重复元字符:- * 0个或多个匹配
- /+ 1个或多个匹配({1,})
- ? 0个或1个匹配({0,1})
- {n} 指定书目匹配
- {n,} 不少于指定书目匹配
- {n,m} 匹配数目的范围(m不超过255)
select xx from yy where zz regexp '\\([0-9] sticks?\\)'
这条语句\(和\)匹配括号,[0-9]匹配任意数字,sticks?匹配stick和sticks(s后的?使s称为可选)
使用正则表达式时,编写的某个特殊的表达式几乎总是不止一种方法
- 定位符
定位元字符:
- ^ 文本的开始
- $ 文本的结尾
- [[:<:]] 词的开始
- [[:>:]] 词的结尾
select xx from yy where zz regexp '^[0-9]\\.'
^匹配串的开始
通过用^开始每个表达式,用$结束每个表达式,可以使regexp与like作用一样
正则表达式的测试: select 'hello' regexp '[0-9]'
返回0
第十章 创建计算字段
- 计算字段
存储在数据库表中的数据一般不是应用程序所需要的格式,我们需要直接从数据库中检索出转换,计算或格式化过的数据,而不是检索出数据,然后再在客户机应用程序中重新格式化
以上就是计算字段发挥的作用,计算字段并不实际存在于数据库表中,计算字段是运行时在select语句内创建的
字段(field)基本上与列的意思相同,经常互换使用。只有数据库知道select语句哪些列是实际的表列,哪些列是计算字段 - 拼接字段
拼接是将值连接到一起构成单个值
在MySQL的select语句中,可使用Concat()函数来拼接两个列。多数DBMS使用+或||来实现拼接,MySQL则使用Concat()函数来实现
Concat()需要一个或多个指定的串,各个串之间用逗号分隔
select Concat(xx,yy) from zz
LTrim()和RTrim()分别为去掉串左边的空格和去掉串右边的空格
- 使用别名
前面的拼接字段只是一个值,一个未命名的列不能用于客户机应用中,因为客户机没有办法引用它,为了解决这个问题,SQL支持列别名,别名用as关键字赋予
select concat(xx,yy) as xy from zz
现在列名为xy,任何客户机都可以按名引用这个列,就像它是实际的表列一样,别名有时也称导出列
- 使用别名
- 执行算数运算
select xx*yy as xy from zz
这条语句将xx与yy相乘的结果作为xy列名,MySQL支持+,-,*,/基本运算符,圆括号可以用来区分优先级顺序
第十一章 使用数据处理函数
- 函数
与大多数计算机语言一样,SQL支持利用函数处理数据。函数一般在数据上执行,它给数据的转换和处理提供了方便 使用函数
大多数SQL实现支持一下类型的函数:- 用于处理文本串,如删除或填充值,转换大小写
- 用于数值数据进行算术操作,如绝对值,代数运算
- 用于处理日期和时间值并从这些值中提取特定成分
返回DBMS正使用的特殊信息,如用户登陆信息,检查版本细节的系统函数
文本处理函数
不再详述- 日期和时间处理函数
不在详述 - 数值处理函数
这些函数一般用于代数,三角或几何运算
第十二章 汇总数据
- 聚集函数
我们经常需要汇总数据而不用把它们实际检索出来,为此MySQL提供了专门的函数。使用这些函数,MySQL查询可用于检索数据,以便分析和报表生成,这种类型的检索例子有以下几种:
- 确定表中行数
- 获得表中行组的和
- 找出表列的最大值,最小值和平均值
SQL的5个聚集函数:
- avg() 返回某列的平均值
avg()函数忽略值为NULL的行
select avg(xx) as avg_xx from yy
这条语句求出xx列的平均值,并将它作为新的一列返回,avg()只用于单个列,如果为了获得多个列的平均值,必须使用多个avg()函数
- count() 返回某列的行数
有两种用法:
1. 使用count(*)对表中行的数目进行计数,不管表列中包含的是空值还是非空值
2. 使用count(column)对特定列中具有值的行进行计数,忽略NULL值
- max() 返回某列的最大值
MySQL允许它用来返回任意列中的最大值,包括返回文本中的最大值,在用于文本数据时,如果数据按相应的列排序,则max()返回最后一行,max()忽略列值为NULL的行
- min() 返回某列的最小值
与max()的功能相反
- sum() 返回某列之和
sum()用来返回指定列值的和。sum()忽略列值为NULL的行
2. 聚集不同值
以上5个聚集函数都可以如下使用:
- 对所有行执行运算,指定all参数或不给参数(因为all是默认行为)
- 只包含不同的值,指定distinct参数
3. 组合聚集函数
select语句可根据需要包含多个聚集函数
select count(*) as num_items
min(xx) as min_xx
max(xx) as max_xx
avg(xx) as avg_xx
from yy
第十三章 分组数据
- 数据分组
分组允许把数据分为多个逻辑组,以便能对每个组进行聚集计算 - 创建分组
分组是在select语句的group by子句中建立的。group by子句指示MySQL分组数据,然后对整个组而不是整个结果进行聚集
使用group by的一些重要规定:
- group by子句可以包含任意数目的列,这使得能对分组进行嵌套
- 如果在group by子句中嵌套了分组,数据将在最后规定的分组上进行汇总
- group by子句中列出的每个列都必须是检索列或有效的表达式
- 除聚集计算语句外,select语句中的每个列都必须在group by子句中给出
- 如果分组列中具有NULL值,则NULL将作为一个分组返回
- group by子句必须出现在where子句之后order by子句之前
- 过滤分组
MySQL还允许过滤分组,规定包括哪些分组,排除哪些分组。MySQL为此目的提供了另外的子句,那就是having子句,having非常类似于where,唯一的差别是where过滤行,having过滤分组
- having和where的差别
where在分组前进行过滤,having在分组后进行过滤
- having和where的差别
- 分组和排序
- order by与group by的差别
group by分组的数据可能不是分组的顺序,一般在使用group by子句时,应该也给出order by子句,这是保证数据正确排序的唯一方法
- order by与group by的差别
- select子句顺序
select form where group by having order by limit
第十四章 使用子查询
- 子查询
查询:任何SQL语句都是查询,此术语一般指select语句
SQL还允许创建子查询,即嵌套在其他查询中的查询 - 利用子查询进行过滤
可以把一条select语句返回的结果用于另一条select语句的where子句中。先执行子查询,子查询返回的结果用于外层的where子句
在where子句中使用子查询能够编写功能很强并且很灵活的SQL语句,对于能嵌套的子查询数目没有限制 - 作为计算字段使用子查询
使用子查询的另一方法是创建计算字段
第十五章 联结表
- 联结
SQL最强大的功能之一就是能在数据检索查询的执行中联结表。联结是利用SQL的select能执行的最重要的操作
- 关系表
相同的数据出现多次绝不是一件好事,此因素是关系数据库设计的基础。关系表的设计就是要保证把信息分解成多个表,一类数据一个表。各表通过某些常用的值(即关系设计中的关系)互相关联 - 外键
外键为某个表中的一列,它包含另一个表的主键值,定义了两个表之间的关系,这样做的好处如下: - 避免信息重复,从而不浪费时间和空间
- 如果一个表中信息变动,可以只更新该表的单个记录,相关表中的数据不用改动
- 由于数据无重复,显然数据是一致的,这是的处理数据更简单
总之,关系数据可以有效的存储和方便的处理,因此关系数据库的可伸缩性远比非关系数据库要好 - 可伸缩性
能够适应不断增加的工作量而不失败。设计良好的数据库或应用程序称之为可伸缩性好 - 为什么要使用联结
分解数据为多个表能更有效的存储,更方便的处理,并具有更大的可伸缩性
如果数据存储在多个表中,怎样用单条select语句检索出数据?可以使用联结,简单的说,联结是一种机制,用来在一条select语句中关联表,因此称之为联结。使用特殊的语法,可以联结多个表返回一组输出
- 关系表
- 创建联结
联结的创建非常简单,规定要连接的所有表以及它们如何关联即可
select vend_name,prod_name,prod_price
from vendors,products
where vendors.vend_id = products.vend_id
order by vend_name,prod_name;
这里prod_name和prod_price在一个表中,而vend_name在另一个表中,from子句列出了两个表,这两个表用where子句正确联结,where子句指示MySQL匹配vendors表中的vend_id和products表中的vend_id(需要完全限定列名)
- where子句的重要性
在联结两个表时,实际上做的时将第一个表的每一行与第二个表中的每一行配对,where子句作为过滤跳进啊,它只包含哪些匹配给定条件的行,没有where子句,第一个表中的每个行将与第二个表中的每个行配对,而不管它们逻辑上是否可以配在一起
- 笛卡尔积
由没有联结条件的表关系返回的结果为笛卡尔积,检索出的行的数目将是两个表行数的乘积
- 内部联结
目前所有的联结称为等值联结,它基于两个表之间的相等测试,这种联结也称为内部联结。对这种联结可以用另一种语法,使用inner join
select vend_name,prod_name,prod_price
form vendors inner join products
on vendors.vend_id = products.vend_id;
- 联结多个表
SQL对一条select语句中可以联结的表的数目没有限制,创建联结的基本规则也相同。首先列出所有表,然后定义表之间的关系
第十六章 创建高级联结
- 使用表别名
别名处理用于列名和计算字段外,SQL还允许给表名起别名,这么做有两个理由
- 缩短SQL语句
- 允许在单条select语句中多次使用相同的表
表别名只在查询执行中使用,与列别名不一样,表别名不返回到客户机
- 使用不同类型的联结
除了内部联结外,还有三种联结:
- 自联结
自联结可以和子查询达到相同的功能,而且子联结比子查询要快得多 - 自然联结
标准的联结返回所有数据,甚至相同的列出现多次,自然联结排出多次出现,时每个列只返回一次 - 外部联结
有时会会需要包含没有关联行的那些行
联结包含了那些在相关表中没有关联行的行,这种类型的联结称为外部联结
使用outer join关键字,而且需要left和right关键字来修饰(right指出的是outer join右边的表,left指出的是outer join左边的表)
- 自联结
- 使用带聚集函数的联结
聚集函数可以和联结一起使用 - 使用联结和联结条件
注意:
- 注意所使用的联结类型,一般我们使用内部联结
- 保证正确的联结条件
- 总是提供联结条件,否则会得到笛卡尔积
第十七章 组合查询
组合查询
多数SQL查询都只包含从一个或多个表中返回数据的单条select语句,MySQL也允许执行多个查询(多条select语句),并将结果作为单个查询结果集返回,这些组合查询称为并或复合查询
使用组合查询的两个情况:- 在单个查询中从不同的表返回类似结构的数据
对单个表执行多个查询,按单个查询返回数据
组合查询与多个where条件
任何具有多个where子句的select语句都可以用一个组合查询给出
- 创建组合查询
利用union操作符组合数条SQL查询
- 使用union
在各条select语句之间放上关键字union,与where子句使用or来连接多个条件效果一样 - union规则
- 使用union
第十九章 插入数据
- 数据插入
insert是用来插入行到数据库的,插入可以用几种方式使用:
- 插入完整的行
- 插入行的一部分
- 插入多行
- 插入某些查询的结果
- 插入完整的行
insert into xx
values(..,..,...);
insert语句一般不会产生输出。对每个列必须提供一个值,如果某列没有值,应该使用NULL值,各个列必须以它们在表定义中出现的次序填充。编写依赖于特定次序的SQL语句是很不安全的,下面是更安全的方法(不过繁琐)
insert into xx(各列名)
values(..,..,....);
因为提供了列名,values必须一起指定的次序匹配指定列名,不一定按照各列在实际表的次序。这种方法可以省略某些列
省略的列必须满足以下某个条件:
- 该列定义允许NULL值
- 在表定义中给出默认值,如果不给出值,将使用默认值
除了以上情况,MySQL将产生一条错误信息,并且相应的行插入不成功
如果数据检索是最重要的,则可以通过在insert和into之间添加关键字low_priority,指示mySQL降低insert语句的优先级
3. 插入多个行
可以使用两种方法:
- 多条insert语句,每条语句用一个分号结束,一次提交
- 单条insert语句多组值,每组值用一对圆括号扩起来,用逗号分隔
4. 插入检索出的数据
insert还可以将一条seelct语句的结果插入表中,这就是所谓的insert select,它有一条insert语句和一条select语句组成
insert into xx(列名)
select 列名 from yy;
第二十章 更新和删除数据
- 更新数据
为了更新(修改)表中的数据,可使用update语句,有两种方式使用update语句:
- 更新表中特定行
- 更新表中所有行
基本的update语句有三部分组成,分别为: - 要更新的表
- 列名和它们的新值
- 确定要更新行的过滤条件