MySql学习 日记 - 第一篇 基础篇
ucloud learning
背景知识
- 1970 年 IBM E.F.Codd 博士发表论文“大型共享数据银行的数据关系模型”
使用表集合来表示数据,相关条目之间采用冗余数据来链接而不是指针来导航。
- 基本术语
术语 | 定义 |
---|---|
列 | 单个数据片段 |
行 | 所有列的一个集合,也叫记录 |
表 | 行的集合 |
结果集 | 一般为 SQL 查询的结果 |
主键 | 用于唯一标识表中某一个行的一个或多个列组合 |
外键 | 用于唯一标识其它表中某一行的一个或多个列组合 |
- SQL 是一种语言。操作关系数据库的语言。
SQL 查询的结果也可以视为一张表,就是上面说的结果集。
SQL 语句定义了输入和输出,执行语句的方式交由优化器处理。
- MySql 是一种开源数据库服务器,主页 www.mysql.com. 遵循ANSI SQL标准。
总结一下:MySql是一种开源的关系型数据库服务器,遵循ANSI SQL标准,SQL本身只是一种语言。
安装MySql数据库
sudo apt-get install mysql-server
apt-get install mysql-client
sudo apt-get install libmysqlclient-dev
sudo netstat -tap | grep mysql
如果MySql服务端口处于LISTEN状态,表明安装成功
登录MySql数据库,-u 表示选择登陆的用户名, -p 表示登陆的用户密码,
创建数据库
创建数据库bank,并查看所有的数据库。
create datebase bank;
show databases;
分配权限:创建一个用户dezho,密码是xyz,分配查询、插入,更新等权限给他。
grant select,insert,update,delete,create,drop,alter on bank.* to [email protected] identified by 'xyz';
quit
mysql -u dezho -p
输入密码xyz,查看是否能够登录。
使用数据库
创建数据表
-
常用数据类型
选择数据类型的原则:设计数据库尽量用能满足需要的最小类型。
字符型 | ||
---|---|---|
type | 特点 | 优缺点 |
char | 固定长度 | 可支持的最大长度255B; 不要额外的用于数据长度的计算;不需要额外空间保存数据长度 |
varchar | 可变长度 | 可支持的最大长度65535B; 实际存储空间与变量的实际长度相关,节省空间;需要额外的空间保存数据实际长度 |
整数类型 | ||
---|---|---|
type | 存储大小 | 十进制最大支持位数 |
tinyint | 1个字节 | 3位数 |
smallint | 2个字节 | 5位数 |
int | 4个字节 | 10位数 |
bigint | 8个字节 | 20位数 |
时间类型 | ||
---|---|---|
type | 格式 | 特点 |
date | YYYY-MM-DD | 只能存放年月日,可以用于存放出生日期 |
datetime | YYYY-MM-DD HH-MI-SS | 精确到秒,比如订单配送时间,需要具体到秒 |
timestamp | YYYY-MM-DD HH-MI-SS | 精确到秒,增加或者更新时会自动地将timestamp列更新为当前时间 |
year | YYYY | 只记录年份信息 |
time | HHH:MI:SS | 只记录时间信息 |
2. 设计表结构
规范化:数据库设计时确保没有重复(外键除外)或者符合列。
比如name可以拆分成姓氏与名字,address可以拆分成街道、县、市、省。
设计一个t_person表
列 | 类型 | 说明 |
---|---|---|
persion_id | int | Primary Key |
first_name | varchar(20) | |
last_name | varchar(20) | |
gender | char(1) | 只能是M,F |
birth_date | date | |
street | varchar(30) | |
city | varchar(30) | |
state | varchar(30) | |
country | varchar(30) |
3. 构建表
create table t_person
(
person_id int unsigned,
first_name varchar(),
last_name varchar(),
gender char() CHECK (gender IN ('M', 'F')),
birth_date date,
street varchar(),
city varchar(),
state varchar(),
country varchar(),
constraint pk_person primary key (person_id)
);
- constraint pk_person primary key (person_id): 创建一个约束,约束的名字叫pk_person,约束的类型是主关键字约束,并指定person_id遵循该约束。
- 约束: 写入数据的限制条件
- 主关键字约束(Primary Key Constraint):输入的列必须能够唯一指定该行。
- gender char(1) CHECK (gender IN (‘M’, ‘F’))的CHECK语句会被忽略掉,无法保证gender一定在[‘M’, ‘F’]中。可以使用enum的字符数据类型来对gender做数值限制。
- enum 是一个字符串对象,其值来自表创建时在列规定中显式枚举的一列值。
create table t_person
(
person_id int unsigned,
first_name varchar(),
last_name varchar(),
gender enum('M', 'F'),
birth_date date,
street varchar(),
city varchar(),
state varchar(),
country varchar(),
constraint pk_person primary key (person_id)
);
- 1,2,4,5,6列都比较好理解,第三列的Null:表明插入数据时,如果没有指定该列的值,是否允许填充为null。
删除数据表
删除数据表一共有三种方法:drop,truncate和delete。使用方法都是[drop|truncate|delete] table 表名。
删除方法 | 特点 |
---|---|
drop | 删除表的内容,删除表的定义,释放内存空间 |
truncate | 删除表的内容,释放空间,但是不删除表的定义,索引从头开始 |
delete | 删除表的内容,不删除表的定义,不释放空间,可以回滚,索引不重新设置 |
增删改查数据
插入一行记录需要提供的信息:表名,列名,各列的值。
1. 主键插入:主键一般采用自增的数字或者uuid。
主键类型 | 优点 | 缺点 |
---|---|---|
自增 | 简单,性能高 | 主键个数有限,整数类型即使是bigint也只能支持20位数,int只能支持到10位数 |
uuid | 利于分布式表中的主键唯一 | uuid占空间大,生成、查询的速度都比较慢,性能较低 |
修改表t_person中主键person_id的生成方式为自增
- alter table: 用于在已有的表中添加、修改或删除列。
- insert、select, update, delete语句
插入语法:INSERT INTO table_name(列1, 列2,…) VALUES (值1, 值2,….)
insert into t_person(first_name, last_name, gender, birth_date) values ('zhiwei', 'pei', 'M', '1988-05-06');
select * from t_person ;
插入之后查询,得到的结果集如下所示:
删除语法: DELETE FROM 表名称 WHERE 列名称 = 值
delete from t_person where person_id=;
select * from t_person ;
删除之后查询,发现之前的记录已经没有了.
查询语法:
SELECT 列名称 FROM 表名称
SELECT * FROM 表名称
insert into t_person(first_name, last_name, gender, birth_date) values ('zhiwei', 'pei', 'M', '1988-05-06');
select person_id, first_name, last_name from t_person ;
更新语法: UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值
比如我们将last_name改成’chen’
update t_person set last_name='chen' where person_id=;
select person_id, first_name, last_name from t_person ;