Mysql
MySQL基础
目前常用的数据库如下:
SQL Server
Oracle
Sum
Mysql
HSQL
PostgreSQL
SQLite
IBM db2
安装完成Mysql后在dos窗口下使用 mysql -u 账号 -p 密码 来连接数据库。MySQL的资料和手册:
基础语法
关系型数据库需要操作它,需要发送特定格式的命令,那么sql语言几乎是所有关系型数据库通用的。
名称 | 说明 |
---|---|
SQL(结构化查询语言) | SQL是用来存取关系型数据库的语言,具有查询、操纵、定义和控制关系型数据库的四方面功能。 |
DDL(数据定义问题) | 数据定义语音 - Data Definition Language,用来定义数据库对象,如数据包、视图、索引等。 |
DML(数据操纵问题) | 数据处理语言 - Data Manipulation Language,在数据库表中更新、增加和删除记录,如:update、insert、delete等。 |
DCL(数据控制问题) | 数据控制语言 - Data Control Language,指用于设置用户权限和控制事务语句,如:grant、revoke、if...else、while、begin transation |
DQL(数据查询问题) | 数据查询语言 - Data Query Language,如:slect 可以去查询相关的文件Mysql5.1_zh.chm,SQL语句不区分大小写的。 |
对库操作
默认存在数据库有四个,不要随意更改,否则导致数据库出错。
其中对库的操作语法如下:
语句 | 描述 |
---|---|
create database db_name | 创建数据库 |
show databases | 显示数据库语句 |
show create database db_name | 显示数据库创建语句。 |
select database() | 查看当前数据库。 |
use db_name | 切换数据库:。 |
drop database db_name | 删除数据库。 |
alter database db_name character set 字符集 collate 校对规则 | 修改数据库。 |
创建一个使用utf8字符集,并带校对规则的mydb3数据库:
create database mydb character set utf8 collate utf8_unicode_ci;
对xx表操作
表是二维表,分为行和列,每行对应着一个实体类的实例对象,没列对应每个实体类的具体的字段名和类型。
创建表
创建表的语法如下所示:
create table table_name(
field1 datatype,
field2 datatype,
field3 datatype
)
其中datatype表示数据类型:
类型 | 描述 |
---|---|
String、varchar、char | 字符串类型。 |
blob、text、mediumblob、mediumtext、longblob、longtext | 大数据类型。 |
tinyint、smallint、int、bigint、float、double | 数值型。 |
bit、0、1 | 逻辑型。 |
date(日期)、time(时间)datatime(日期时间)、timestamp(时间戳) | 日期型 |
注意:mysql语句中的注释是 --
创建一张表用于测试用:
create table student(
id int(32) primary key auto_increment,
name varchar(32),
age int(32),
gender varchar(16)
);
如下图所示:
查看表
语句 | 描述 |
---|---|
show tables | 查看所有表。 |
show create table 表名 | 查看表的创建语句。 |
desc 表名 | 查看表的详细结构。 |
注:创建表的时候通常会添加额外的约束,这些约束都是为了保证表中的数据的有效性和完整性。
特性 | 描述 |
---|---|
primarey key | 主键约束:声明为主键的字段必须非空,并且不能重复。 |
auto_increment | 主键必须是数值类型,表示主键自动增长。 |
unique | 唯一约束,字段必须唯一,但是可以是空。 |
not null | 非空约束:不能为空。 |
修改表
语句 | 描述 |
---|---|
rename table db_name to new_name | 修改表的名称。 |
change [column] old_col_name column_definition | 修改列的名称。 |
alter table db_name character set utf8 | 修改表的字符编码。 |
删除表
语句 | 描述 |
---|---|
drop table db_name | 删除表 |
添加一列
alter table 表名 add 字段名 类型(长度) [约束]
给student表中的学生添加地址列:
alter table student add address varchar(32);
如下图所示:
修改列类型
alter table 表名 modify 要修改的字段名 类型(长度) [约束]
修改student表中的name字段长度为16,且不能为空:
alter table student modify name varchar(16) not null;
如下图所示:
修改列的名称
alter table 表名 change 旧列名 新列名 类型(长度) [约束]
修改student表中的address字段为addr字段:
alter table student change address addr varchar(32);
如下图所示:
删除表的列
alter table 表名 drop 列名
删除student表中的gender字段:
alter table student drop gender;
如下图所示:
修改表名
rename table 表名 to 新表名
修改表的编码
alter table 表名 character set 编码
除了可以修改表的字符集之外,还可以查看当前表的编码:
操作表记录
插入记录
insert into 表名(列名1,列名2,列名3……) values(值1,值2,值3……)
insert into 表名 values(值1,值2,值3……)
向表中插入多条数据:
insert into student values(1, 'legend', 22, 'shenzhen');
insert into student values(2, 'vinvent', 25, 'hunan');
insert into student values(3, 'uding', 20, 'yunnan');
如下图所示:
修改记录
修改记录有带条件和不带条件等两种方式:
update 表名 set 字段名=值, 字段名=值, 字段名=值……
update 表名 set字段名=值, 字段名=值, 字段名=值…… where 条件
其中不带条件的会将表中列下所有记录都更改。
update student set age=28 where name='uding';
如下图所示:
删除记录
delete from 表名;
delete删除的时候是一条一条的删除记录,它配合事务,可以将删除的数据找回。id不会重置。
truncate删除,它是将整个表摧毁,然后再创建一张一模一样的表。它删除的数据无法找回。id会重置。
查询记录
select [distinct] *| 列名,列名 from 表名 [where条件]
1>查看年龄为25岁的学生:
2>单独查询某些列:
3> 使用表别名查询所有记录:
注意:其中as可以被省略。
4>查询所有的学生,按年龄进行排序(升序、降序)
其中升序是asc,降序是desc。
多条件查询
1> 查询学生表中年龄大于20 并且地址在深圳的记录
2> 查询学生表中地址在深圳或者湖南的记录
聚合函数
1> 获得所有学生的年龄总和
2> 获得学生的平均年龄
3> 获得学生的总数
分组操作
1> 首先为学生表添加分类
alter table student add cid varchar(32);
2> 初始化数据,配置不同的cid
3> 根据cid分组,分组统计每组学生的数量
4> 根据cid分组,分组统计每组学生的平均年龄,且年龄大于20岁以上
注意:查询条件如果是聚合函数,则使用having。
多表设计
外键约束
表是用来保存现实生活中的数据的,而现实生活中数据和数据之间往往具有一定的关系,我们在使用表来存储数据时,可以明确的声明
表和表之前的依赖关系,命令数据库来帮我们维护这种关系,向这种约束就叫做外键约束。
一对一关系
一对一的关系在实际开发中应用并不多,因为一对一的关系完全可以创建成一张表。
两种建表原则如下:
1)外键唯一:主表的主键和从表的外键唯一,形成主外键关系。
2) 外键是主键:主表的主键和从表的主键,形成主外键关系。
一对多关系
一对多的建表原则是:在从表(多方)创建一个字段,字段作为外键指向主表(一方)的主键。
我们创建两张表,分别是分类表和商品表,其中一个分类对应多个商品。
--分类表:
create table category(
cid varchar(32) primary key,
cname varchar(100)
);
--商品表:
create table product(
pid varchar(32) primary key,
pname varchar(40),
price double,
category_id varchar(32)
);
然后分别向分类表和商品表中添加数据:
--分类表
insert into category(cid,cname) values('c001','家电');
insert into category(cid,cname) values('c002','服饰');
insert into category(cid,cname) values('c003','化妆品');
--商品表
insert into product(pid,pname,price,category_id) values('p001','联想','5000','c001');
insert into product(pid,pname,price,category_id) values('p002','海尔','5000','c001');
insert into product(pid,pname,price,category_id) values('p003','雷神','5000','c001');
insert into product(pid,pname,price,category_id) values('p004','JACK JONES','800','c002');
insert into product(pid,pname,price,category_id) values('p005','真维斯','200','c002');
insert into product(pid,pname,price,category_id) values('p006','花花公子','440','c002');
insert into product(pid,pname,price,category_id) values('p007','劲霸','2000','c002');
insert into product(pid,pname,price,category_id) values('p008','香奈儿','800','c003');
insert into product(pid,pname,price,category_id) values('p009','相宜本草','200','c003');
注意:插入数据如果出现编码问题,只需要通过set names gbk即可设置编码。
此时,product和category表是没有任何关系的,需要设置外键来确定两张表的关系,将从表categoryid作为外键字段来映射主表product的cid字段。
alter table product add foreign key(category_id) references category(cid);
添加外键来确定表之间关系的语法如下:
语法:alter table 从表 add [constraint] [外键名称] foreign key (从表外键字段名) references 主表 (主表的外键);
[外键名称]:用于删除外键约束的,一般建议_fk结尾。
我们在删除的时候就可以通过如下语句来删除外键约束:
alter table 从表 drop foreign key 外键名称;
多表操作需要注意如下地方:
从表不能够添加(更新)主表中不存在的数据。
主表不能够删除(更新)从表中已经使用的数据。
多对多关系
多对多关系需要创建第三张表作为中间表,中间表中至少有两个字段分别作为外键指向各一方的主键。其中两张表都是主表,中间表为从表。
我们创建三张表,分别是订单表、商品表、订单项表,其中订单和商品为多对多关系,订单项则是中间表指向各方的主键。
--商品表
create table product(
pid varchar(32) primary key,
pname varchar(40),
price double,
category_id varchar(32)
);
--订单表
create table orders(
oid varchar(32) primary key,
totalprice double
);
--订单项表
create table orderitem(
oid varchar(50),
pid varchar(50)
);
然后我们建立订单表和商品表的关系,设定联合主键(可省略)
alter table orderitem add primary key(oid,pid);
- 订单表和订单项表的主外键关系:
alter table orderitem add constraint orderitem_orders_fk foreign key(oid) references orders(oid);
- 商品表和订单项表的主外键关系
alter table orderitem add constraint orderitem_product_fk foreign key(pid) references product(pid);
多表查询
交叉连接查询
交叉连接查询得到的是两个表的乘积,通常称之为笛卡尔积。
语法:select * from 表一, 表二;
如下图所示:
内连接查询
内连接查询分为隐式内连接和显示内连接,是取得两个表中存在连接匹配关系的记录(交集)。
1> 隐式内连接
语法:select * from A, B where 条件;
2> 显式内连接
语法:select * from A inner join B on 条件
注意:隐式内连接和显示内连接查询到的结果是一样的,其中显示内连接中inner关键字可以省略。
外连接查询
外连接查询分为左外连接和右外连接。其中outer关键字可以省略。
- 左外连接
左外连接查询到的是左表的全部数据和两张表之间的交集。
语法:select * from A left outer join B on 条件;
- 右外连接
右外连接查询到的是右表的全部数据和两张表之间的交集。
语法:select * from A right outer join B on 条件;
子查询
一条select语句结果作为另一条select语法的一部分。
1> 通过查询语句查询到化妆品分类的cid。
2> 将上方查询语句作为另外一条查询语句语法的一部分: