数据库基础
数据库(database)是一个以某种有组织的方式存储的数据集合。
- 数据库软件称为DBMS(数据库管理系统)。数据库是通过DBMS创建和操纵的容器。
表(table)
某种特定类型数据的结构化清单。数据库中的每个表都有一个名字,用来标识自己。此名字是唯一的。
表具有一些特性,这些特性定义了数据在表中如何存储。描述表的这组信息成为模式(schema),可用来描述数据库中特定的表以及整个数据库和其中表的关系。
列(column)
表中的一个字段,所有表都是由一个或多个列组成的。每个列都有相应的数据类型(datatype),它限制该列中存储的数据。
行(row)
表中的数据是按行存储的。
有时也被叫做数据库记录(record)。
主键(primary key)
表中每一行都应该有可以唯一标识自己的一列(或一组列),其值能够唯一区分表中的每个行。
没有主键,更新或删除表中特定行很困难。
表中的任何列都可作为主键,只要满足以下条件:
- 任意两行都具有不相同的主键值。
- 每个行都必须具有一个主键值,主键值不允许为NULL。
多列作为主键时,所有列值组合必须是唯一的,但单个列的值可以不唯一。
主键的好习惯
- 不更新主键列中的值;
- 不重用主键列的值;
- 不在主键列中使用可能会更改的值;
什么是SQL
SQL 是结构化查询语言(Structured Query Language),是专门与数据库通信的语言。
MySQL简介
客户机-服务器软件
DBMS分为两类:
- 基于共享文件系统的DBMS,(Microsoft Access和FileMaker),用于砖面用途 ,通常不用于更高端或更关键应用。
- 基于客户机-服务器的DBMS,MySQL、Oracle等。客户机-服务器应用分为两个不同的部分。服务器部分是负责所有数据访问和处理的一个软件,这个软件运行在称为数据库服务器的计算机上。增删改查所有请求都是由服务器软件完成,请求来自于客户机软件。
MySQL版本(后续需补充)
当前位版本5
- 4:InnoDB引擎,增加事务处理、并、改进行全文搜索等支持
- 4.1:对函数库、子查询、集成帮助等的重要增加。
- 5:存储过程、触发器、游标、视图等
使用MySQL
选择数据库
连接MySQL后,需要选择一个数据库来使用。
use crashcourse;
- 查看数据库和表
show DATABASES; – 查看数据库
show TABLES; – 查看表
show COLUMNS from TABLES;
describe TABLES;– 查看列
- 自动增量: 在每个行添加到表中时,MySQL可以自动为每个行分配下一个可用编号,不用在添加一行时手动分配唯一值。
所支持的其他show语句:
show STATUS; – 用于显示广泛的服务器状态信息。
show create DATABASE;
show create TABLE; – 用来显示创建特定的数据库或表。
show GRANTS; – 显示授予用户的安全权限。
show errors;
show warnings; – 显示服务器错误或警告信息。
2. select语句
select column_name from TABLES; – 检索单个列,得到数据没有过滤,没有排序。
select column_id,column_name from TABLES; – 检索多个列。
select * from TABLES; – 检索所有列。
- distinct关键字
select distinct column_name from TABLE; --distinct只返回不同的column_name行,distinct关键字用于所有列。 - limit关键字
select column_name from TABLE limit 5; – 检索单个列,返回结果不多于5行。
select column_name from TABLE limit 5,5; – limit 5,5 指返回从行5开始的5行。第一个数为开始位置,第二个数为药检索的行数。
limit 4 offset 3 等于 limit 3,4
select TABLE.column_name from TABLE; – 使用完全限定的列名。
select TABLE.column_name from DATABASE.TABLE; – 使用完全限定的表名。
- 排序数据 order by关键字
select column_name from TABLE order by column_name; --返回对column_name列以字母顺序排序的列结果。
select column_id,column_name,column_price from TABLE order by column_name,column_price; – 按多个列排序。但具有多个相同column_name时才会对column_price排序,若column_name的值都是唯一的,则不会按column_price排序。
- 指定排序方向 desc asc
select column_id,column_price from TABLE order by column_price desc; – 按照column_price降序排序。
select column_id,column_price,column_name from TABLE order by column_price desc,column_name; --多个列排序时desc跟在需要降序的列后,先对column_price进行降序排序后在对column_name排序。
- 在多个列上进行降序排序时,每个列都指定desc。
- asc(ascending)与desc相反,升序排序可使用。但升序是默认的。
- 过滤数据 where
where 在 from 之后 ,搜索条件也叫过滤条件。
select column_id,column_name from TABLE where column_price=3.50;
- SQL过滤与应用过滤:数据也可在应用层过滤,SQL的select语句为客户机应用检索出超过实际所需的数据行,然后客户机代码对返回数据进行循环,来得到所需行。这样会影响效率。
- where子句操作符
操作符 | 说明 |
= | 等于 |
<> | 不等于 |
!= | 不等于 |
< | 小于 |
<= | 小于等于 |
> | 大于 |
>= | 大于等于 |
between | 在指定的两个值之间 |
select column_name,column_price from TABLE where column_name = ‘fuses’; – MySQL在执行匹配时默认不区分大小写。
- 何时用引号 : 单引号用来限制字符串。
select column_name,column_price from TABLE where column_price between 5 and 10; – 检索价格在5到10之间的行。
select column_name,column_price from TABLE where column_price is NULL; – 检索值为NULL的行。
- 组合where子句 逻辑操作符
select column_id,column_price from TABLE where column_id = 1001 and column_price <= 10; – 返回满足两个条件的行。
- 上述只有两个过滤条件,还可添加多个过滤条件,每添加一个条件就要使用一个and。
select column_name,column_price from TABLE where column_name = ‘fuses’ or column_price <= 10; – 返回匹配任一条件的行。 - 当or和and同时出现在一个子句中时,优先处理and操作符,应使用()分组操作符。
select column_name,column_price from TABLE where column_id in (1002,1003) order by column_name; – 检索column_id为1002和1003的行,功能与or是一样的。column_id = i002 or column_id = 1003; - 为什么要使用in操作符呢?
- in操作符语法更清楚和直观。
- 使用in,计算次序容易管理。
- in操作符一般比or操作符执行更快。
- in可以包含其他的select语句。
select column_name,column_price from TABLE where column_id not in (1002,1003) order by column_name; – not否定跟在它之后的条件,返回column_id不是1002或1003的行。 - 支持使用not对in、between、exists子句取反。
- 用通配符过滤
- 通配符:用来匹配值的一部分的特殊字符。
- 搜索模式: 由字面值、通配符或两者组合构成的搜索条件。
1). like、%通配符
select column_id,column_price from TABLE where column_name like ‘jet%’; – 检索任意以jet起头的词,%表示接受jet后的任意字符,不管有多少个。这是区分大小写的。
select column_id,column_price from TABLE where column_name like ‘%anvil%’; – 匹配任何位置包含anvil的值,不管之前或之后出现什么字符。
- %能够匹配一个或多个字符,还可匹配0个字符。
- %不能匹配NULL。
2)._通配符
select column_id,column_price from TABLE where column_name like ‘_ton’; – _匹配一个字符,返回column_name为Xton的行。
- 使用通配符技巧
- 不要过度使用通配符,通配符搜索的处理一般要比其他搜索花的时间长。
- 在确实需要时使用通配符,且最好不要放在搜索模式的开头,这样是最慢的。
用正则表达式搜索
- MySQL仅支持多数正则表达式实现的一个很小的子集。(这句我不理解)
select column_name from TABLE where column_name regexp ‘1000’ order by column_name; – regexp后所跟的东西作为正则表达式处理。
select column_name from TABLE where column_name ragexp ‘.000’ order by column_name; – .在正则表达式中表示匹配任意一个字符。 - 匹配不区分大小写。要区分使用binary,例where column_name regexp binary ‘Rose .000’。
select column_name from TABLE where column_name regexp ‘1000|2000’ order by column_name; – |为正则表达式的or操作符,表示匹配其中之一。可有多个or。
select c