数据库
1.
数据库,简而言之可视为电子化的文件柜——存储电子文件的处所,用户可以对文件中的数据进行新增、截取、更新、删除等操作。
2.数据库分类
关系型数据库: 描述实体与实体之间的关系
-
mysql: 开源免费,中小型企业免费数据库,
-
mariadb: mysql创始人搞的,mysql开源的 一个分支,命令一样
-
oracle: 甲骨文公司,大型电商网站
-
db2: IBM公司,银行系统大多采用db2
-
sqlserver: windows,政府,大学,图形化工具不错
非关系型数据库
: key value
mongodb
redis
3.E-R关系图( 必须要会画 )
实体: 矩形
属性: 椭圆
关系: 菱形
4.MySQL数据库服务器
-
mysql数据库 : 数据库管理软件
-
服务器: 相当于 一台电脑 , 这台电脑安装了相关服务器软件, 软件会监听不同的端口, 提供不同的服务.
5.MySQL 安装和卸载
卸载:注意删除my.ini配置文件
6.SQL语句( 结构化查询语言 )
-
DDL: 数据定义语言: 定义 数据库 , 数据表和它们的结构,create,drop,alter
-
DML: 数据操纵语言: 操作 数据, indert, update, delete
-
DCL: 数据控制语言: 定义 访问权限, 取消访问权限, grant
-
DQL: 数据查询语言 select from where
7.数据库的CRUD操作
-
首先登陆数据库服务器mysql -uroot -p123456
create database 数据库名;
create database day86;
--创建数据库的时候,指定字符集
create database 数据库名字 character set 字符集;
create database day8 character set utf8;
create database day8 characte set 字符集 collate 校对规则;
create database day8 characte set utf8 collate 校对规则;
校对规则是在字符集内用于比较字符的一套规则。让我们使用一个假想字符集的例子来区别清楚。
假设我们有一个字母表使用了四个字母:‘A’、‘B’、‘a’、‘b’。
我们为每个字母赋予一个数值:‘A’=0,‘B’= 1,‘a’= 2,‘b’= 3。字母‘A’是一个符号,数字0是‘A’的编码,这四个字母和它们的编码组合在一起是一个字符集。
-
查看数据库:
--查看数据库定义的语句
show create database 数据库的名字;
--查看所有数据库
show databases;
infor_schema
performance_schema
mysql
这三个库不要去动
-
修改数据库操作
alter database 数据库的名字 character set 字符集;
alter database day08 character set gbk;
-
删除数据库
drop database 数据库的名字;
-
其他操作
--切换数据库(选中数据库)
use 数据库名字
use day06;
--查看一下当前正在使用的数据库
select database();
8.表的CRUD 操作
-
创建表
create database 数据库的名字
create table 表名{
列名1 列的类型(长度) 约束,
列名2 列的类型(长度) 约束,
};
--列的类型:
java sql
int int
char/String char/varchar
char(3): 固定长度(不够补空格)
varchar(3): 可变长度
长度3代表字符的个数
double double
float float
boolean boolean
date: YYYY-MM-DD
time: hh:mm:ss
datatime: YYYY-MM-DD hh:mm:ss 默认是null
timestamp: YYYY-MM-DD hh:mm:ss 默认使用当前时间
text: 文本
blob: 存放二进制
--列的约束
主键约束: primary key
唯一约束: unique
非空约束: not null
自动增长: auto_increment
创建表:
1. 分析实体: 学生
2. 学生ID
3. 姓名
4. 性别
5. 年龄
create table student(
sid int primary key,
sname varchar(10),
sex int,
age int
);
-
查看表
--查看所有表
show tables;
--查看表的定义
show create table student;
--查看表的结构
desc student;
-
修改表
--添加列(add)
alter table 表名 add 列名 列的类型 列的约束
alter table student add chengji int not null;
--修改列(modify)
alter table student modify sex varchar(2);
--修改列名(change)
alter table student change sex gender varchar(2);
--删除列(drop)
alter table student drop chengji;
--修改表名(rename)
rename table student to heima;
--修改表的字符集
alter table student character set gbk;
-
删除表
drop table student;
9.SQL完成对表中数据的CRUE的操作
-
插入数据
insert into 表名(列名1,列名2,列名3) values(值1,值2,值3);
insert into student(sid, sname, gender) values(1, '张三', '男');
--简单写法
insert into student values(1, '张三', '男');
--批量插入
insert into student values
(4,'zhangsan','男'),
(4,'zhangsan','男'),
(4,'zhangsan','男')
10.中文乱码问题
-
删除操作
delete from 表名 [where 条件];
delete from student where sid = 1;
delete from student;//如果没有指定条件, 会将表中数据全部删除
--面试问题: 请说一下 delete 删除数据 和 truncate 删除数据有什么差别?
delete: DML 一条一条删除表中的数据
truncate: DDL,先删除表再重建表
关于哪一条执行效率高: 具体要看表中的数据量
如果数据比较少, delete会比较高效
如果数据比较多,truncate 会比较高效
-
更新表记录
update 表名 set 列名=列的值, 列名2=列的值2 [where 条件]
--将sid为5的名字改成李四
--如果参数是字符串,日期要加上单引号
update student set sname='李四' where sid = 5;
-
查询记录
select [distinct] [*] [列名,列名2] from 表名 [where 条件]
distinct: 去除重复的数据
--商品分类: 手机数码, 皮靴箱包
1.分类ID
2.分类名称
3.分类描述
Create table category (
cid int primary key auto_increment,
cname varchar(10),
cdesc varchar(30)
);
insert into category values(null, '手机数码','电子产品,黑马生产');
insert into category values(null, '皮靴箱包','江南皮革厂亲情打造');
insert into category values(null, '香烟酒水','衡水老白干');
insert into category values(null, '酸奶饼干','君乐宝乳业');
insert into category values(null, '馋嘴零食','花生瓜子八宝粥');
select * form category;
select cname,cdesc from category;
--所有商品
1.商品ID
2.商品名称
3.商品价格
4.商品数量
5.生产日期
6.商品分类ID
商品和商品分类: 所属关系
create table product(
pid int primary key auto_increment,
pname varchar(10) ,
price double,
pdate timestamp, (时间戳,默认当前时间)
cno int
);
insert into product values(null, '小米mix8',998,null,1);
insert into product values(null, '锤子',2888,null,1);
insert into product values(null, '阿迪王',99,null,2);
insert into product values(null, '老白干',598,null,3);
insert into product values(null, '敬酒',298,null,3);
insert into product values(null, '小熊饼干',1,null,4);
insert into product values(null, '卫龙辣条',3,null,5);
--简单查询
--查询所有商品信息
select * from product;
--查询商品名称和商品价格
select pname,price from product;
--别名查询, as的关键字, as 关键字可以省略
--表别名: select p.pname , p.price from product p; (主要用于夺标查询)
select p.pname as 商品名称 , p.price as 商品价格 from product as p;
select p.pname 商品名称 , p.price 商品价格 from product p;
--去掉重复的值
--查询所有商品的价格
select price from product;
select distinct price from product;
--select 运算查询 仅仅在查询结果上做了运算处理 + - * /
select * , price *0.9 as 折后价 from product;
--条件查询( where关键字 )
指定条件,确定要操作的纪律
--查询商品价格大于60元的所有商品信息
select * from product where price > 60;
--where 后的条件写法
--关系运算发: > >= < <= != <>
<>:不等于: 标准SQL语法
!=: 不等于: 非标准SQL语法
--查询商品价格不等于88的所有商品
select * from product where price != 88;
select * from product where price <> 88;
--查询商品价格再 10 到 100 之间
select * from product where price >= 10 and price <= 100;
between ...and...
select * from product where price between 10 and 100;
--查询商品价格大于100 或者 商品价格大于10
select * from product where price > 100 or price < 10;
--like : 模糊查询
- : 代表是一个字符
% : 代表多个字符
--查询出名字中带 有饼的所有商品 '%饼%'
select * from product where pname like '%饼%';
--查询第二个名字是 酒的所有商品 '_酒%'
select * from product where pname like '_酒%';
--in 在某个范围中获得值
--查询出商品分类 ID 在 1,4,5 里面的所有商品
select * from product where cno in (1,4,5);
--排序查询: order by 关键字
asc: ascend 升序 (默认)
desc: descend 降序
--0.查询所有商品按照价格进行排序
select * from product order by price;
--1.查询所有的商品,按照价格进行降序 排序
select * from product order by price desc;
--2.查询名称有 干 的商品 ,按照价格降序排序
select * from product where pname like '%干%' order by price desc;
--聚合函数:
sum() 求和
avg() 求平均值
count() 统计数量
max() 最大值
min() 最小值
--1.获得所有的商品价格的总和
select sum(price) from product ;
--2.获得所有商品的平均价格
select avg(price) from product;
--3.获得所有商品的个数
select count(*) from product;
--注意: where条件后面不能接聚合函数
--查出商品价格大于平均价格的所有商品信息
select * from product where price > avg(price); ×
查出所有商品
select * from product;
大于
平均价格
select avg(price) from product;
select * from product where price > (select avg(price) from product);
--分组: group by
--1.根据cno字段分组,分组后统计商品id
select cno,count(*) from product group by cno;
--2.根据cno分组,分组统计每组的平均价格,并且商品平均价格 > 60
select avg(price),cno from product group by cno
having avg(price) > 60;
--having 关键字 可以接聚合函数的 出现在分组之后
--where 关键字 他是不可以接聚合函数的 , 出现在分组之后
--编写顺序
select ... from ... where ... group by ... having ... order by
--执行顺序
from ... where ... group by ... having select ... order by
IFNULL(expr1,expr2)
当expr1不为空返回expr1,否则返回exp2。
例如:IFNULL(score,0)如果score不为空返回score,否则返回0。