什么是数据库
所谓“数据库”是以一定方式储存在一起、能予多个用户共享、具有尽可能小的冗余度、与应用程序彼此独立的数据集合。
1.关系型数据库
关系型数据库是依据关系模型来创建的数据库,关系型数据可以很好地存储一些关系模型的数据,比如一个老师对应多个学生的数据(“多对多”),一本书对应多个作者(“一对多”),一本书对应一个出版日期(“一对一”)。
2.非关系型数据库
非关系型数据库主要是基于“非关系模型”的数据库(由于关系型太大,所以一般用“非关系型”来表示其他类型的数据库),主要有:1.列模型:存储的数据是一列列的。关系型数据库以一行作为一个记录,列模型数据库以一列为一个记录。(这种模型,数据即索引,IO很快,主要是一些分布式数据库)2.键值对模型:存储的数据是一个个“键值对”,比如name:liming,那么name这个键里面存的值就是liming 3.文档类模型:以一个个文档来存储数据,有点类似“键值对”。
数据库操作方法(以mysql数据库为例)
//以下数据库名 都以user为例:
//1.创建数据库
create database user;
//2.修改数据库
alter database user character set utf8 collate 校对规则;
//3.删除数据库
drop database user;
//4.显示所有数据库
show databases;
//5.查看当前数据库的创建SQL
show create database user;
数据库表操作方法
1.java中的字段对应mysql中的字段
java中类型 | mysql数据库中类型 |
---|---|
byte | tinyint |
short | smallint |
int | int |
long | bigint |
float | float |
double | double |
boolean | bit |
char/String | char/varchar |
Date | date(只有日期) time(只有时间) datetime(日期时间都有,但默认初始化为null) timestamp(日期时间都有,但默认初始化为当前时间) |
File | Blob/Text |
2.数据库表操作语法
//1.创建数据库表语法:
create table 表名( 字段1 类型(长度) 约束, 字段2 类型(长度) 约束,字段3 类型(长度) 约束);
/*
约束
主键约束 primary key ,auto_increment
唯一约束 unique
非空约束 not null
*/
//2.删除表
drop table 表名;
//3.查看所有表
show tables;
//4.查看创建表的SQL
show create table 表名;
//5.修改表结构
alter table 表名 add 列名 类型(长度) 约束; //添加新列
alter table 表名 modify 列名 类型(长度) 约束; //修改列
alter table 表名 change 旧名 新名 类型(长度) 约束; //修改列名称
rename table 旧表名 to 新名; //修改表名
alter table 表名 character set 字符集; //修改表的字符集
数据库表记录的增删改查
1.增加一条表记录
insert into 表名(列名1,列名2,...) values(值1,值2,...); //这是插入一条记录,然后给特定的几个字段赋初值。
insert into 表名 values(值1,值2,...); //这里是默认给所有列都赋初值。
2.删除一条记录
//delete from 表名 [where 条件] 举例如下:
delete from user where id = 2;
注意:truncate table user;和 delete from user;
都是删除整个表.但第二种方式属于DML语句,是一条一条记录的删除,通过事务回滚可以再获取删除掉的数据;而第一种方式属于DDL语句,是删掉这张表,再创建一张具有同样字段的表,删除更高效,但删除掉的数据不可恢复。
3.修改一条记录
//update 表名 set 列名=值,列名=值 [where 条件]
update user set password='abc' where username = 'hello';
4.查询记录(重点)
基本查询:
select [distinct] *|列名 from 表 [条件];
例如: select * from exam;
select name,englist from exam;
select distinct englist from exam;//distinct用来去掉重复值;
select name,englist+chinese+math from exam;//展示三门成绩相加的结果;
select name,englist+chinese+math as sum from exam;//展示三门相加的结果并取别名sum(as,可以省略);
条件查询:
举例: select * from exam where name ='李四';
select * from exam where name ='李四' and english > 90;
select * form exam where name like'李%';//%和_作为占位符,_只能代表一个字符,而%代表一个或者多个字符;
select * form exam where english in (69,79,85);//范围查询;
排序查询:
使用 order by 字段名称 asc/desc
举例: select * from exam order by chinese;//按照Chinese升序进行排序;
select * from exam order by chinese desc;//按照Chinese倒序进行排序;
select * from exam order by chinese desc,english asc;//按照Chinese倒序进行排序,如果相同,按照英语成绩升序排序;
select * from exam where name like '李%' order by english asc;//把姓李的人按照英语进行升序排序;
分组统计查询:
聚合函数使用
sum();求和 count();个数 max();最大值 min();最小值 avg();平均值
举例: select sum(english) from exam;//获得英语成绩总和;
select sum(english),sum(math) from exam where name like '李%';//获取所有姓李的人的英语成绩和数学成绩总和;
select sum(english)+sum(math) from exam; 和select sum(english+math) from exam;//都是统计英语和数学的所有值,区别:当统计数据中有null时,结果会有差别;
解决:使用ifnull(english,0)//如果结果有null,将其当作0处理;
select count(*)from exam where name like '李%';//获得姓李的人的个数;
select ave(chinese) from exam;//获取中文成绩平均值;
分组查询:
语法:使用group by 字段名称
举例:
select product,count(*) from orderitem group by product;
select product,sum(price) from orderitem group by product;//where 后不能跟聚合函数,如果必须要写,将where改成having关键字就行;
select product,sum(price) from orderitem group by product having sum(price) > 5000;
总结:正确的查询语句应有的顺序为:
s(select)… F(from)… W(where)… G(group by)… H(having)… O(order by)
select和from必须有,where,group by,having, order by可有可不有,按照实际需要确定。