Day8
今天了解一下数据库。。
引入
程序中用来保存数据的方式?
变量,数组,对象等等(内存存储。断电数据丢失,速度极快。)
文件存储(硬盘存储。永久保存数据,保存数据 ,取出数据 很麻烦,效率很低。)
数据库:用来永久保存程序中用到的各种各样的数据。 (磁盘存储,永久保存数据 取出数据 ,存储数据 极为方便,好用,安全。);
1.当下一些比较流行数据库
中小心的企业:mysql(免费,开源)
大一点的企业:oracle(使用时免费,服务是收费的)
sql server :.net(C#)开发中应用较多。
移动端开发:sqlLite…( .db文件)
总结一下:熟练掌握一门 数据库(mysql,sql server,oracle);
2.Mysql管理结构
管理员root(拥有最高权限,可以创建用户,分配权限,当然自己也拥有对库,对表等各种操作的权利)
|| 创建多个
普通用户(由管理员创建并且分配权限,能够拥有哪些权利,由管理员决定)
||创建多个
数据库(存储数据的仓库)
||创建多个表格,视图,存储过程,触发器,函数等等。
表,视图,存储过程。
||很多行很多列
记录(就是我们的行) , 字段(就是我们的列),约束,
3.MySql的数据类型
数值类型:
整数:int
小数:double
字符串:vachar(n): n=30 长度不能超过30个字符。。。
时间:
date:年月日
time:时分秒
datetime:年月日时分秒
timestamp:时间戳 获取当前系统时间。
4.创建数据库
-- 创建数据库的语句: 名字为E_MarketDB
create database E_MarketDB charset utf8 collate utf8_unicode_ci;
-- 删除数据库
drop database E_MarketDB;
-- 使用数据库
use E_MarketDB;
5.创建表格
-- 创建表格
-- 根据主键,唯一键 查询数据 效率更高(默认创建主建索引,唯一索引)
-- 一般主键一张表里面只能有一个,(特点:唯一非空) ,其余约束可以有多个、
-- auto_increment 只能用在拥有索引的数值列(一般用在主键列)
create table goods(
gid int auto_increment primary key,
-- unique 唯一 默认创建唯一索引 提高检索效率
gName varchar(30) unique not null,
gPrice double not null,
imgSrc varchar(40) default 'images/1.jpg',
amount int default 100,
);
-- 删除表格
drop table goods;
6.mysql单表 字段约束
注意:
users id cardNom,upass,money,phoneNum;
1.数据库中无法保存完全相同的2条记录(表格的行)
<1>primary key 主键约束
特点:唯一非空(空代指null). 整个表格只允许拥有一个主键加了主键的字段创建表格的时候会默认创建主建索引(唯一),提高检索数据的效率。
auto_increment 自增。
2.注册个人信息的时候 经常出现带*
的选项(必填) ,也有一些不带*
的(可以选填)
<2>.not null; 不加上此约束 ,我们的字段默认就是允许为空
3.我们要存储一些不可重复的数据,比如身份证号等。
<3>.unique唯一约束 :加了唯一约束的字段能够保证数据库中此字段的值独一无二。
4.对于一些属性我们要设置默认值,如初始密码等。
default ‘123456‘ 设置默认值为‘123456’ 如果不插入相应的数据 就会保存对应的默认值。
check:检查约束(mysql不起作用) ,只能在可视化视图中使用。
总结:主键约束 primary key,唯一约束 unique,非空约束 not null, 默认值 default,自增auto_increment;
7.联合主键
我们有时会遇到主键要求是多个字段的情况,我们可以用联合主键来解决这个问题。
-- type ,id 作为我们的联合主键 (将多个字段组合成一个主键)
Student(type,id,stuName,stuPass,address,phoneNum)
create table student(
primary key(`id,type`)
id int auto_increment,
`type` varchar(5) default 'S',
stuName varchar(30) not null,
stuPass varchar(30) default '123456',
address varchar(30) not null,
phoneNum varchar(30) not null,
);
8.往表格中插入数据
语法:
insert into 表名(字段1,字段2,…) values(字段1对应的值,字段2对应的值,…);
注意事项:对于自增,有默认值,允许为空的字段,我们可以省略,
1.自增字段的值 有系统分配
2.有默认值 不手动插入 系统会分配默认值 (当然你想要手动插入也可以)
3.允许为空的字段,不插入数据系统会分配一个null值(当然你想要手动插入也可以)
-- 1.往goods表中插入数据 对于自增,有默认值,允许为null 可以省略
insert into goods(gName,gPrice,cid) values('蜗牛10plus' ,1999.99,1);
insert into goods(gName,gPrice,cid) values('蜗牛X' ,2999.99,1);
insert into goods(gName,gPrice,cid) values('蜗牛10' ,999.99,1);
-- 2.当然对于有默认值,允许为空的数据,我们也可以是手动插入数据
insert into goods(gName,gPrice,cid,amount,imgSrc)
values('mysql入门到放弃',88.88,2,888,'images/2.jpg');
insert into goods(gName,gPrice,cid,amount,imgSrc)
values('java入门到放弃',88.88,2,888,'images/2.jpg');
insert into goods(gName,gPrice,cid,amount,imgSrc)
values('C++入门到放弃',88.88,2,888,'images/2.jpg');
-- 3.批量插入数据。。。
insert into goods(gName,gPrice,cid)
values('保时捷·卡宴一系列',88.88,3),
('保时捷·911一系列',88.88,3),
('保时捷·卡宴二系列',98.88,3),
('保时捷·911二系列',98.88,3);
9.修改,删除数据
修改数据:
语法结构:
update 表名 set 字段1=新值 , 字段2=新值 where id=1;
1.加where条件,修改id=1的记录。
2.不加where条,件默认修改整个表格中的数据。
具体的应用:
-- 修改商品的名称和数量
-- gid=1 修改成 商品名称:红牛 数量99
update goods set gName='红牛',amount=99 where gid=1;
-- gid=2 的价格修改成 2888.88
update goods set gPrice=2888.88 where gid=2;
select * from goods;-- 查询整个表
删除数据:
语法结构:
delete from 表名 where gid=1;
1.加where条件 删除gid=1的记录
2.不加where条件默认删除整个表格中的数据。
具体事例:
-- 7.删除数据
-- 删除id=1的商品信息
delete from goods where gid=1;
-- 删除商品id=14 的商品信息
delete from goods where gid=14;
-- 全部清空数据1 id自动增长列不会重置 不会从1开始
delete from goods;
-- 全部清空数据2 id自动增长列的初始值 重置 从1开始
truncate goods;
-- 从新插入数据id自动增长列将会重置。。。
10.查询操作
语法:
1.* 代表通配符 所有字段
Select * from 表名
2.查询部分字段
select 字段1,字段2… from 表名
3.查询信息 根据什么条件查询
select * from 表名 where id=1
不加where条件 默认查询所有的信息
加where条件,根据对应的条件查询筛选
基础查询
-- 查询全部的商品信息
select * from goods;
-- 查询全部商品的名称以及商品的价格 商品的图片
select gName,gPrice,imgSrc from goods;
-- 查询 gid=1的商品信息
select * from goods where gid=1;
逻辑查询(and or not)
-- and 与 or或 not非
-- 查询 gid=1,gid=3,gid=7,gid=10的商品信息
select * from goods where gid=1 or gid=3 or gid=7 or gid=10;
-- 针对多个条件用or进行连接 也可使用 in() 提高检索效率
select * from goods where gid in(1,3,7,10);
-- 查询gid大于5 并且商品价格<90的商品信息
-- and 2个条件同时满足。。。
select * from goods where gid>5 and gPrice<90;
-- 查询 gid在[4,8]之间的数据
select * from goods where gid>=4 and gid<=8;
-- 针对这种连续区间的[4,8] 建议使用between and;
select * from goods where gid between 4 and 8;
-- 查询 gid为偶数的商品信息
select * from goods where gid%2=0;
-- 查询 gid为奇数的商品信息
select * from goods where gid%2!=0;
-- 查询商品的首页信息 gName,gPrice,imgSrc,amount
select gName,gPrice,imgSrc,amount from goods;
模糊查询以及分页查询
模糊查询:
-- 模糊查询 (关键字搜索)
-- %: 代表任意长度任意字符
-- _:单个任意字符
-- 使用like关键字进行连接 模糊查询
-- 将商品中带有入门的商品全部查询出来。。。
select * from goods where gName like '%入门%';
-- 将商品名称以红牛开头的商品商品查询出来并且长度为3
select * from goods where gName like '红牛_';
分页查询:
-- 分页查询 limit m,n;
-- m:(当前的第几页-1)*1页最多能显示多少条数据。
-- n:1页最多能显示多少条数据。
-- 当前页是第四页 ,1页最多能显示3条数据
-- 第二页:m=(2-1)*3 n=3
-- 第三页:m=(3-1)*3 n=3
-- 第四页:m=(4-1)*3 n=3
select * from goods limit 9,3;
11.聚合函数
1.sum(需要统计的字段) 累加
2.avg(字段) 求平均
3.max(字段) 最大值
4.min(字段) 最小值
5.count(*) 统计总的记录数
具体的应用实例:
-- 统计所有参加考试的学生信息
-- 给列取一个别名
-- as '自定义的别名';
select
SUM(mark) as 'sum',
AVG(mark) as 'avg',
MAX(mark) as 'max',
MIN(mark) as 'min',
COUNT(*) as 'count'
from student where courseName='java' and mark is not null;
-- 统计参加考试的每个学生的总分 平均分
-- 查询 参加2门考试的 所有学生信息。。
-- group by 字段 根据什么进行分组查询
-- having 对于分组之后的结果进行筛选
select stuName,SUM(mark),AVG(mark),COUNT(*)
from student
where mark is not null -- 根据什么条件查询
group by stuName -- 根据什么字段进行统计
having COUNT(*)=2 -- 分组之后的结果进行筛选
order by SUM(mark)desc; -- 对最终的结果进行 排序