代码改变世界

Java开发系列-MySQL

2018-08-12 23:45  iCoderHong  阅读(297)  评论(0编辑  收藏  举报

概述

数据库 公司 特点
Mysql Oracle 开源的数据库 社区版免费 商业版是收费的
Oracle Oracle 大型的 收费的数据库
DB2 IBM 大型的 收费的数据库 一般用于银行系统 特点主要它的硬件比较稳定
sqlserver 微软 中型的收费的数据库 c++开发者使用
MySQL是属于关系型数据库,而Oracle是属于非关系型数据库(直接存储对象)。

MySQL语句

基本语句

-- 创建数据库
CREATE DATABASE mydb;
-- 创建表
CREATE TABLE USER (
	uid INT PRIMARY KEY AUTO_INCREMENT,
	username VARCHAR(20) DEFAULT NULL
);
-- 插入数据
INSERT INTO USER VALUES(NULL, 'tom');
-- 更新数据
UPDATE USER SET username = 'rose' WHERE id = 1;
-- 删除表
DROP TABLE USER;
-- 删除表中的所有数据
DELETE FROM USER;
-- 查询表中所有数据
SELECT *FROM USER;

聚合函数

对一列进行计算 返回值是一个,忽略null值, sum(), avg(), max(), min(), count();

-- .获得所有商品的价格的总和
SELECT SUM(price) AS totalPrice FROM product;
-- 获得商品表中价格的平均数:
SELECT ROUND(AVG(price), 2) AS vagprice FROM product;
-- 获得商品表中有多少条记录
SELECT COUNT(*) FROM product;

分组查询

-- 根据cno字段分组,分组后统计商品的个数
SELECT cno, SUM(price)FROM product GROUP BY cno;
-- 根据cno分组,分组统计每组商品的总数量,并且总数量> 200;
SELECT cno, SUM(pnum) FROM product GROUP BY cno HAVING SUM(pnum) > 200;
-- 获得商品表中有多少条记录:
select count(*) from products;

注意:havingwhere的区别 1.where 是对分组前的数据进行过滤 ;having 是对分组后的数据进行过滤 2. where 后面不能使用聚合函数,having可以

排序查询

-- 查询所有的商品,按价格进行排序.(asc-升序,desc-降序)
SELECT *FROM product ORDER BY price ASC;
-- 查询名称有"新"的商品的信息并且按价格降序排序
SELECT *FROM product WHERE pname LIKE '%新%' ORDER BY price DESC;

分页查询

limit n, m; 从第n条记录开始查询m条数据。

SELECT *FROM product LIMIT 0, 2;
SELECT *FROM product LIMIT 2, 2;
SELECT *FROM product LIMIT 4, 2;
SELECT *FROM product LIMIT 6, 2;

确定好PageSize,做某一页分页查询的数据公式

limit (n-1)*pageSize pageSize

MySQL表设计

在MySQL中存在三种关系:一对一,一对多,多对多。

一对多

比如开发中用户与订单的关系,对于一表我们也可以称之为主表,而多表称之为从表。遵循的设计原则从表中添加一个外键对应主表的主键。

-- 用户表
create  table user(
	id int primary key auto_increment,
	username varchar(20)
);

-- 订单表
create  table orders(
	id int primary key auto_increment,
	totalprice double,
	user_id int
);

为了保证数据的有效性和完整性,添加约束(外键约束).

--  alter table 多表名称 add foreign key(外键名称) references 一表名称(主键);
alter table orders add foreign key(user_id) references user(id);
  • 添加了外键约束之后有如下特点
    • 主表中不能删除从表中已引用的数据
    • 从表中不能添加主表中不存在的数据

多对多

比如: 订单与商品的关系。

-- 创建商品表
-- 创建商品表
create table product(
	id int primary key auto_increment,
	name varchar(20),
	price double
);	    
-- 创建中间表
create table orderitem(
	oid int,
	pid int
);
-- 添加外键约束
alter table orderitem add foreign key(oid) references orders(id);
alter table orderitem add foreign key(pid) references product(id);

开发中处理多对多:引入一张中间表,存放两张表的主键,一般会将这两个字段设置为联合主键,这样就可以将多对多的关系拆分成两个一对多了

多表查询

笛卡尔积

多张表无条件的联合查询.没有任何意思

select a.*,b.* from a,b;

内连接

-- 显示的内连接
select a.*,b.* from a [inner] join b on ab的连接条件
-- 隐式的内连接
select a.*,b.* from a,b where ab的连接条件

外连接

-- 左外连接
select a.*,b.* from a left [outer] join b on 连接条件;
先展示join左边的(a)表的所有数据,根据条件关联查询 join右边的表(b),符合条件则展示出来,不符合以null值展示.

-- 右外连接
select a.*,b.* from b right [outer] join a on 连接条件;
先展示jion右边的表(a)表的所有数据,根据条件关联查询join左边的表(b),符合条件则展示出来,不符合以null值展示.

子查询

一个查询依赖另一个查询. 用()连接。