08、Java--Mysql基础

Mysql

MySQL基础

目前常用的数据库如下:

SQL Server
Oracle
Sum
Mysql
HSQL
PostgreSQL
SQLite
IBM db2

安装完成Mysql后在dos窗口下使用 mysql -u 账号 -p 密码 来连接数据库。MySQL的资料和手册:

http://www.mysql.cn/

基础语法

关系型数据库需要操作它,需要发送特定格式的命令,那么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语句不区分大小写的。

对库操作

默认存在数据库有四个,不要随意更改,否则导致数据库出错。
08、Java--Mysql基础

其中对库的操作语法如下:

语句 描述
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)
);

如下图所示:
08、Java--Mysql基础

查看表

语句 描述
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);

如下图所示:
08、Java--Mysql基础

修改列类型

alter table 表名 modify 要修改的字段名 类型(长度) [约束]

修改student表中的name字段长度为16,且不能为空:

alter table student modify name varchar(16) not null;

如下图所示:
08、Java--Mysql基础

修改列的名称

alter table 表名 change 旧列名 新列名 类型(长度) [约束]

修改student表中的address字段为addr字段:

alter table student change address addr varchar(32);

如下图所示:
08、Java--Mysql基础

删除表的列

alter table 表名 drop 列名

删除student表中的gender字段:

 alter table student drop gender;

如下图所示:
08、Java--Mysql基础

修改表名

rename table 表名 to 新表名

修改表的编码

alter table 表名 character set 编码

除了可以修改表的字符集之外,还可以查看当前表的编码:
08、Java--Mysql基础

操作表记录

插入记录

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');

如下图所示:
08、Java--Mysql基础

修改记录

修改记录有带条件和不带条件等两种方式:

update 表名 set 字段名=值, 字段名=值, 字段名=值……
update 表名 set字段名=值, 字段名=值, 字段名=值…… where 条件

其中不带条件的会将表中列下所有记录都更改。

update student set age=28 where name='uding';

如下图所示:
08、Java--Mysql基础

删除记录

delete from 表名;

delete删除的时候是一条一条的删除记录,它配合事务,可以将删除的数据找回。id不会重置。

truncate删除,它是将整个表摧毁,然后再创建一张一模一样的表。它删除的数据无法找回。id会重置。

查询记录

select [distinct] *| 列名,列名 from 表名 [where条件]

1>查看年龄为25岁的学生:

08、Java--Mysql基础

2>单独查询某些列:

08、Java--Mysql基础

3> 使用表别名查询所有记录:

08、Java--Mysql基础

注意:其中as可以被省略。

4>查询所有的学生,按年龄进行排序(升序、降序)

08、Java--Mysql基础

其中升序是asc,降序是desc。

多条件查询

1> 查询学生表中年龄大于20 并且地址在深圳的记录

08、Java--Mysql基础

2> 查询学生表中地址在深圳或者湖南的记录

08、Java--Mysql基础

聚合函数

1> 获得所有学生的年龄总和
08、Java--Mysql基础

2> 获得学生的平均年龄

08、Java--Mysql基础

3> 获得学生的总数

08、Java--Mysql基础

分组操作

1> 首先为学生表添加分类

alter table student add cid varchar(32);

2> 初始化数据,配置不同的cid

08、Java--Mysql基础

3> 根据cid分组,分组统计每组学生的数量

08、Java--Mysql基础

4> 根据cid分组,分组统计每组学生的平均年龄,且年龄大于20岁以上

08、Java--Mysql基础

注意:查询条件如果是聚合函数,则使用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);
  1. 订单表和订单项表的主外键关系:
alter table orderitem add constraint orderitem_orders_fk foreign key(oid) references orders(oid);
  1. 商品表和订单项表的主外键关系
alter table orderitem add constraint orderitem_product_fk foreign key(pid) references product(pid);

多表查询

交叉连接查询

交叉连接查询得到的是两个表的乘积,通常称之为笛卡尔积。

语法:select * from 表一, 表二;

如下图所示:
08、Java--Mysql基础

内连接查询

内连接查询分为隐式内连接和显示内连接,是取得两个表中存在连接匹配关系的记录(交集)。

08、Java--Mysql基础

1> 隐式内连接

语法:select * from A, B where 条件;

08、Java--Mysql基础

2> 显式内连接

语法:select * from A inner join B on 条件 

08、Java--Mysql基础

注意:隐式内连接和显示内连接查询到的结果是一样的,其中显示内连接中inner关键字可以省略。

外连接查询

外连接查询分为左外连接和右外连接。其中outer关键字可以省略。

  1. 左外连接

左外连接查询到的是左表的全部数据和两张表之间的交集。

语法:select * from A left outer join B on 条件;

08、Java--Mysql基础

  1. 右外连接

右外连接查询到的是右表的全部数据和两张表之间的交集。

语法:select * from A right outer join B on 条件;

08、Java--Mysql基础

子查询

一条select语句结果作为另一条select语法的一部分。

1> 通过查询语句查询到化妆品分类的cid。

08、Java--Mysql基础

2> 将上方查询语句作为另外一条查询语句语法的一部分:

08、Java--Mysql基础

上一篇:java数据类型


下一篇:Java基本数据类型、字节长度和取值范围