数据库、数据表的基本操作及查询数据
数据库的基本操作
- 创建数据库
create database database_name
database_name为要创建的数据库的名称 - 删除数据库
drop database database_name
database_name为要删除的数据库的名称 -
数据库存储引擎
数据库存储引擎是数据库底层软件组成,数据库管理系统(dbms)使用数据引擎进行创建、查询、更新和删除数据操作。
mysql的核心就是存储引擎。
存储引擎比较
|功能|myisam|memory|innodb|archive|
|---|---|---|---|---|
|存储限制|256tb|ram|64tb|none|
|支持事务|no|no|yes|no|
|支持全文索引|yes|no|no|no|
|支持数索引|yes|yes|yes|no|
|支持哈希索引|no|yes|no|no|
|支持数据缓存|no|n/a|yes|no|
|支持外键|no|no|yes|no|
数据表的基本操作
创建数据表
- 创建表的语法形式
sql create table<表名> ( 字段名1 数据类型 [列级别约束条件] [默认值], 字段名2 数据类型 [列级别约束条件] [默认值], …… [表级别约束条件] );
-
使用主键约束
主键约束要求主键列的数据唯一,并且不允许为空。他能唯一地标识表中的一条记录,可以结合外键来定义不同数据表之间的关系,并且可以加快数据库查询的速度。
- 单字段主键
- 在定义列的同时指定主键。
字段名 数据类型 primary key [默认值]
- 在定义完所有列之后指定主键。
[constraint <约束名>] primary key [字段名]
- 在定义列的同时指定主键。
- 多字段联合主键
主键由多个字段联合组合而成。primary key [字段1、字段2...]
其位置放置在定义完所有的主键之后
- 单字段主键
- 使用外键约束
外键用来在两个表的数据之间建立链接,它可以是一列或者多列。一个表可以有一个或多个外键。[constraint<外键名>] foreign key 字段1[,字段2...] references<主表名> 主键列1[,主键列2...]
- 使用非空约束
非空约束指字段的值不能为空。对于使用了非空约束的字段,如果用户在添加数据时没有指定值,数据库系统会报错。字段名 数据类型 not null
- 使用唯一性约束
唯一性约束要求该列唯一,允许为空,但只能出现一个空值。
唯一约束可以确保一列或者几列不出现重复值。- 在定义完列之后直接指定唯一约束。
字段名 数据类型 unique
- 在定义完所有列之后指定唯一约束。
[constraint<约束名>] unique(<字段名>)
- 在定义完列之后直接指定唯一约束。
- 使用默认约束
默认约束指定某列的默认值。字段名 数据类型 default 默认值
设置表的属性值自动增加
在数据库应用中,可以通过为表的主键添加auto_increment
关键字来实现:当每新增加一条记录,使该主键自动加一。一个表只能有一个字段使用auto_increment
约束,且该字段必须为主键的一部分。其约束的字段可以是任何整数类型。字段名 数据类型 auto_increment
查看数据表结构
- 查看表基本结构语句
describe 表名;
或者简写为desc 表名;
- 查看表详细结构语句
show create table <表名/g>;
如果不加/g
参数,显示的结果可能非常混乱,加上参数/g
后,可使显示结果更加直观,易于查看。
修改数据表
- 修改表名
alter table <旧表名> rename [to] <新表名>;
- 修改字段的数据类型
alter table <表名> modify <字段名> <数据类型>;
- 修改字段名
alter table <表名> change <旧字段名> <新字段名> <新数据类型>;
- 添加字段
alter table <表名> add <新字段名> <新数据类型> [约束条件] [first|after 已存在字段名];
- 删除字段
alter table <表名> drop <字段名>;
- 修改字段的排列位置
alter table <表名> modify <字段1> <数据类型> first|after <字段2>;
- 更改表的存储引擎
alter table <表名> engine=<更改后的存储引擎名>;
- 删除表的外键约束
alter table <表名> drop foreign key <外键约束名>;
删除数据表
drop table [if exists] 表1,表2...表n;
查询数据
基本查询语句
select {*|<字段列表>} [ from <表1>,<表2>... [where <表达式>] [group by <group by definition>] [having <expression>[{<operator><expression>}...]] [order by <order by definition>] [limit [offset,] <row count>] ] select [字段1,字段2,...,字段n] from [表或视图] where [查询条件];
单表查询
- 查询所有字段
select * from 表名;
- 查询指定字段
select 字段名1[,字段名2,...,字段名n] from 表名;
- 查询指定记录
在select
语句中,通过where
子句可以对数据进行过滤。select 字段名1[,字段名2,...,字段名n] from 表名 where 查询条件;
- 带
in
关键字的查询in
操作符用来查询满足指定范围内的条件的记录,使用in
操作符,将所有检索条件用括号括起来,检索条件之间用逗号隔开,只要满足条件范围内的一个值即为匹配项。
在in
关键字前面加上not
即可使得查询的结果正好相反。 - 带
between and
的范围查询between and
用来查询某个范围内的值,该操作符需要有两个参数,即范围的开始值和结束。如果字段值满足指定的范围查询条件,则这些记录被返回。
同样,在between and
关键字前面加上not
即可使得查询的结果正好相反。 - 带
like
的字符匹配查询like
关键字即是使用通配符来进行匹配查找。通配符是一种在sql的where
条件子句中拥有特殊意思的字符,可以和like
一起使用的通配符有%
和_
。
百分号通配符%
,匹配任意长度的字符,甚至包括零字符。
下划线通配符_
,一次只能匹配任意一个字符。 - 查询空值
空值不同于0,也不同于空字符串。空值一般表示数据未知、不适用或将在以后添加数据。
在select
语句中使用is null
子句,可以查询某字段内容为空记录。 - 带
and
的多条件查询and
主要用于where
子句中,用来链接两个甚至多个查询条件,表示所有的条件都需要满足才会返回值。 - 带
or
的多条件查询or
也主要用于where
子句中,用来链接两个甚至多个查询条件,表示所有的条件仅需满足其中之一项便会返回值。 - 查询结果不重复
在select
语句中,使用distinct
关键字来指示mysql消除重复的记录。select distinct 字段名 from 表名;
- 对查询结果排序
用order by
语句来对查询的结果进行排序。
在后面添加desc
表示降序排序
在后面添加asc
或默认,表示升序排序 - 分组查询
在mysql中使用group by
来对数据进行分组[group by 字段] [having <条件表达式>] [with rollup]
having
关键字用来过滤数据,因为where
不能和group by
混用with rollup
关键字是在所有查询出的记录之后增加一条记录,该记录计算查询出的所有记录的总和,即统计记录数量。但是rollup
和能够与group by
同时使用的order by
不能同时使用。 - 使用
limit
限制查询结果的数量limit [位置偏移量,] 行数
使用集合函数查询
函数 | 作用 |
---|---|
avg() | 返回某列的平均值 |
count() | 返回某列的行数 |
max() | 返回某列的最大值 |
min() | 返回某列的最小值 |
sum() | 返回某列值的和 |
连接查询
- 内连接查询
在内连接查询中,只有满足条件的记录才能出现在结果关系中。两个表之间的关系通过(inner) join
指定。 使用这种语法的时候,连接的条件使用on
子句给出,而不是用where
。 - 外连接查询
-
left join
左连接
返回包括左表中的所有记录和右表中连接字段相等的记录。 -
right join
右连接
返回包括右表中的所有记录和左表中连接字段相等的记录。
-
- 复合条件连接查询
复合条件连接查询是在连接查询的过程中,通过添加过滤条件,限制查询的结果,使查询的结果更加准确。
子查询
子查询指一个查询语句嵌套在另一个查询语句内部的查询。
- 带
any
、some
关键字的子查询any
和some
关键字是同义词,表示满足其中任一条件,它们允许创建一个表达式对子查询的返回值列表进行比较,只要满足内层子查询中的任何一个比较条件,就返回一个结果作为外层查询的条件。 - 带
all
关键字的子查询
使用all
时,需要同时满足所有内层查询的条件。 - 带
exists
关键字的子查询exists
关键字后面的参数是一个任一的子查询,系统对子查询进行运算以判断它是否返回行,如果至少返回一行,那么exists
的结果为true
,此时外层查询语句将进行查询;如果子查询没有返回任何行,那么exists
的结果为false
,此时外层语句不进行查询。 - 带
in
关键字的子查询
使用in
关键字进行子查询时,内层查询语句仅仅返回一个数据列,这个数据列里的值将提供给外层查询语句进行比较操作。当外层查询语句内只要有一个内层查询语句返回的数据列中的数据时,则判断为满足条件,外层查询语句将进行查询。 - 带比较运算符的子查询
子查询可以使用如'<','<=','=','>','>=','!='
等比较运算符。
合并查询结果
利用 union
关键字,可以给出多条 select
语句,并将他们的结果组合成单个结果集。合并时,两个表对应的列数和数据类型必须相同。各个 select
语句之间使用 union
或 union all
关键字分割。 union
不适用关键字 all
,执行的时候删除重复的记录,所有返回的行都是唯一的;使用关键字 all
的作用时不删除重复行也不对结果进行自动排序。
为表和字段取别名
- 为表取别名
表名 [as] 表别名
- 为字段取别名
列名 [as] 列别名
使用正则表达式查询
mysql
中使用regexp
关键字指定正则表达式的字符匹配模式。
正则表达式常用字符匹配列表
|选项|说明|
|:---:|---|
|^
|匹配文本的开始字符|
|$
|匹配文本的结束字符|
|.
|匹配任何单子符|
|*
|匹配零个或多个在他前面的字符|
|+
|匹配前面的字符1次或多次|
|<字符串>
|匹配保护指定的字符串的文本|
|[字符集合]
|匹配字符集合中的任何一个字符|
|[^]
|匹配不在括号中的任何字符|
|字符串{n,}
|匹配前面的字符串至少n次|
|字符串{n,m}
|匹配前面的字符串至少n次,至多m次|