浅谈有关数据库的基本理解
1.数据库的概念 [ 数据库管理系统 (DataBase Management System) ]
就是存储数据的仓库,其本质是一个文件系统,可以有规律的对数据进行存储,方便用户进行增删改查.
增删改查 : CRUD (create,update,read,delete)
2.数据库的分类 [当今常用的数据库分2种类型]
2.1.关系型数据库 描述的是 实体与实体之间的关系(一对多,一对一,多对多)
例如 : Mysql 丶 Oracle 丶 SqlServer 丶 DB2 丶SyBase 丶 SQLite
2.2.非关系型数据库 : 压根就没有数据表的概念. 只有 行 和 列 [ 或者叫 键(Key) 和 值(Value) ]
例如 : Redis, HBase
3.数据库 与 Java 的对应关系
大致可以理解为:
一个项目对应一个库(名)
一个类对应一张表
一个属性对应表里面的一个字段
一个对象对应表里面的一条记录!
4.常见关系型数据库的介绍:
Mysql : 广泛的应用在Internet上的大中小型网站中。主要是因为其 体积小、速度快、总体拥有成本低,开放源代码 [市场上大部分版本为5.5 免费]
Oracle:它是一个大型的收费的数据库
DB2:它是IBM公司的产品,主要用于银行系统
SQLServer:它是微软的产品,一般用于C#和.net语言开发的项目(中型)
SyBase:它是一个过时的数据库产品(但是有一个非常专业的建模工具powerdesigner)
SQLite:专门用于移动端的数据库
..........
5. 数据库的操作
- DDL语句:数据库定义语言(专门操作数据库中的结构!)
- DML:数据库操作语言(专门对数据库的表记录进行更新<添加、删除、修改>操作)
- DCL:数据库的控制语言(专门对数据库的权限进行设置等操作)【了解】
- DQL:数据库查询语言(专门对数据库的表的记录进行查询操作)
6. Sql语句的语法
SQL语句可以写成一行也可以写成多行,末尾以分号(;)结尾!
可以使用空格和缩进来增强SQL语句的可读性
对数据库进行SQL语句操作的时候,关键字建议使用大写(SQL语句不区分大小写)【实际开发,都会使用小写】
SQL语句可以使用/**/来进行注释(使用#更加便捷)
7.常用的数据类型:
整数:int
小数:double(普通的小数) decimal(用于钱数)【精度更高】
日期:date datetime timestamp
文本(字符串):vachar(用的最多<可变的>) char(定长的)
8.Sql中的简单常用语句
8.1对数据库库的操作(DDL语句:操作的是库的结构)
create database 库名 ; 创建一个库
show create database 库名; 查看数据库的字符集编码
create database 库名 character set 字符集 带有指定字符集的创建方式:
show databases; 查看当前MySQL数据库中所有的库
show create database 库名; 查看数据库的字符集编码
drop database 库名; 删除数据中的库 [三思而行,一般勿用]
use 库名; 使用某个数据库
select database; 查看正在使用的库名
show tables; 查看所有表
desc 表名; 查看表结构
drop table 表名; 删除表
alter table 表名 add 列名 类型(长度) [约束]; 在表中添加一列
alter table 表名 modify 列名 新的类型(新的长度) 新的约束; 修改表的列的类型长度和约束
alter table 表名 change 旧列名 新列名 类型(长度) 约束; 修改列名
alter table 表名 drop 列名; 删除列
rename table 旧表名 to 新表名; 修改表名
alter table 表名 character set 字符集 修改表的字符集
create table 表名(
字段名称1 类型(长度) 约束 ,
字段名称2 类型(长度) 约束 ,
字段名称3 类型(长度) 约束
);
说明:如果有多个字段,除了最后一个字段末尾不用加逗号(,),其余的必须加!!!!!
8.2.对数据库表记录的操作(DML语言:添加、修改、删除)
insert into 表名(字段名1, 字段名2) values(值1,值2);【插入指定字段的数据,添加的字段和值必须对应】
insert into 表名 values(值1,值2,值3……);【插入整张表所有字段的数据】 主键为自动增长时.给 null 即可.
注意事项:
1.给定的值的顺序要与字段的顺序一致!
2.如果字段名的类型是varchar或者日期的,那么给的值必须加引号(单引号)
3.值的长度不能超过字段的长度
4.如果插入的是空值给null。
关于中文乱码的问题: 临时方法:输入指令set names gbk;【 临时使用!更换窗口后,依然乱码.】
update 表名 set 字段名1=值1,字段名2=值2; 修改所有记录值
update 表名 set 字段名1=值1,字段名2=值2 where 唯一的字段名=值; 修改指定字段的值
delete from 表名 where 条件 删除指定数据
delete from 表名 [ 慎用 ] 删除所有数据
8.3对数据库表记录的操作(DQL语句:查询)
条件查询:
#查询商品名和商品价格
#select 要查询的字段(多个字段用逗号隔开) from 表名;
#select pname,price from product;
# 查询所有商品信息使用表别名
# 单表没什么用,主要用于多表操作!
#select * from product p;
# 查询商品名,使用列别名(相对表别名使用少一些)
#select 列明(原来的名字) 列别名(显示的新名字)(列别名并不修改原始的名字) from 表名
#select pname name from product;
# select * from 表名 where 条件;
#查询商品名称为'左慈'的商品信息
#select * from product where pname = '左慈';
# 查询商品价格>60元的所有的商品信息
#select * from product where price>60;
# 查询商品名称含有'士'字的商品信息(模糊查询)
# select * from where 字段名 like '%士%';(%表示任意个字符)
#select * from product where pname like '%士%';
# 查询商品名称以"士"字开头的商品信息
# select * from 表名 where 字段名 like '士%'; (%表示任意个字符,士在第一个字,则代表以士开头的信息)
#select * from product where pname like '士%';
# 查询商品名称第二字为"士"字的商品信息
# select * form 表名 where 列名 like '_士%'; (%表示任意个字符,_(下划线)代表第一个字)
# select * from product where pname like '_士%';
# 查询商品id在(3,6,9)范围内的所有商品信息【关键字in】
# select * from 表名 where 列名 in (3,6); (关键字 in (3,6)代表范围,多个范围用逗号隔开)
# select * from product where pid in (3,6);
# 查询商品名称为士兵并且价格>0的商品信息【关键字 and 】
# select * from 表名 where 列名1=要求1 and 列名2=要求2;(关键字 and 必须两边都要满足要求)
# select * from product where pname='士兵' and price>0;
# 查询商品名称含有士字或者价格>100的商品信息【关键字 or 】
# select * from 表名 where 列名 like '%士%' or 列名 > 100; (关键字 or 两边满足一个条件即可)
# select * from product where pname like '%士%' or price>100;
# 查询id不是2的商品信息
# select * from 表名 where 列名 <> 2 ;( <> 代表不等)(推荐使用,属于sql语句中)
# select * from 表名 where 列名 != 2 ;( <> 代表不等)(也可用,但是属于Java中)
# select * from product where pid <> 2;
# 查询价格在100到10000之间的商品信息【关键字 between 】
# select * from 表名 where 列名 >= 100 and 列名 <=10000;
# select * from product where price>=100 and price <=10000;
# select * from product where price between 200 and 10000;(前面必须写小值 and 后面写大值)
=============================================================================================
分组查询:
/*
语法: select * from 表名 group by 分组的字段名称
注意:
没有进行分组操作的,还带有条件的使用 where 关键字
如果进行了分组操作,还带有条件,必须使用having,而且只能放在最后面!!
*/
# 1.添加分类id
# alter table product add cid varchar(32);
# 2.初始化数据
# update product set cid='1';
# update product set cid='2' where pid in (5,6,7);
# 根据cid字段分组,分组后统计商品的个数。
# select * from product; # 查询中记录数
# select cid,count(*) from product group by cid;
#根据cid分组,分组统计每组商品的平均价格,并且平均价格大于20000元。
# select cid,avg(price)from product group by cid having avg(price)>20000;
#注意: 没分组,有附加条件使用where
#分过组,有附加条件必须使用having
======================================================================================
# 聚合语法:
# select 函数名称(列名) from 表名;
# 获得所有商品的价格的总和 sum
# select pid,sum(price) from product;
# 获得所有商品的平均价格 avg
# select pid,avg(price) from product;
# 获得所有商品的个数 count(重点)
# 注意: 获取个数时, 填任何列名都可以
# select count(*) from product;
=======================================================================================
# 排序语法: (默认不写,是升序)
# 注意: order by 排序操作必须放在 where 条件后面 !!!
# select * from 表名 order by 指定的字段名称(asc升序/desc降序)
# select * from product order by price; 默认的是升序排序
# select * from product order by price asc; 升序排序
# select * from product order by price desc; 降序排序
# 升序: ASC
# select * from product order by price asc;(价格升序)
# 降序 DESC
# select * from product order by price desc;(价格降序)
=======================================================================================
分页查询:
select * from 表名 limit ?; // 查询结果里面获得前N条记录
select * from 表名 limit ?,?; // 分页查询!
参数1:起始索引(默认从0开始),一般获得某页数据,起始索引是需要进行计算的,
公式:(要查看的页码数-1)*每页显示大小
参数2:每页显示大小(几条记录)【一般是固定写死】
9.约束
主键约束:[ 通常是在建表的时候就进行设置 ]对主键字段进行限定(唯一unique、非空not null!) 在字段后面添加相应约束即可.
alter table 从表名 add [constraint pk_主键名称] primary key(主键字段名称); 添加主键约束
alter table 表名 drop primary key 删除主键约束
alter table product add unique(pname); 添加唯一约束
alter table product drop index pname; 删除唯一约束
浅谈数据库记录......