数据库概述:
什么是数据库?
- 数据库就是一个文件系统,只不过我们需要通过命令(SQL)来操作这个文件系统
- 数据库的定义不唯一,以下是两种定义:
- 数据库(DataBase)是按照数据结构来组织、存储和管理数据的建立在计算机存储设备上的仓库
- 数据库是长期储存在计算机内、有组织、可共享的数据集合。数据库中的数据是以一定的数据模型组织、描述和存储在一起、具有尽可能小的冗余度、较高的数据独立性和易扩展的特点并可在一定范围内为多个用户共享。
- 数据库的作用
- 储存数据,数据的仓库,带有访问权限限制不同人可以有不同的操作
- 为什么要学习数据库
- 操作都是后台数据,取到后台数据进行封装,然后交给前端去展现
常见的数据库
mysql:开源免费的适用于 中小型企业的免费数据库,sun公司收购了mysql,sun公司又被oracle收购了,oracle收购之后开始收费(6.0以上版本)
mariadb:是由mysql创始人做出来的,直接是mysql开源版本的一个分支,基本上所以的命令都是一样的
oracle:甲骨文公司,商业软件,收费软件,适用于大型电商网站
db2:IBM公司,thinkpad,做解决方案:软件和硬件,服务器架构,银行系统大多采用db2
sqlserver:常用于windows里面,政府网站常采用asp.net并且大学教学通常采用SQLserver,因为图形化工具做的不错
sybase:被淘汰的
MySQL非关系数据库:
存放key:value形式
godbmon
redis
MySQL关系数据库:
主要用来描述实体与实体之间关系
实实在在的事物:男生和女生 学生和班级 员工和部门
E-R关系图(实体-联系图)(Enity-Ralationship Diagram):要求必须会画
实体:方框
属性:椭圆
关系:菱形
MYSQL数据库服务器
MYSQL数据库:数据管理软件
服务器:就是一台电脑,这台安装相关的服务器软件,这些软件会监听不同的端口号,根据用户访问的端口号,提供不同的服务
MySQL的安装与卸载
- 卸载:
- 打开控制面板》删除软件
- 删除MYSQL安装目录下的所有文件C:\Program Files\MySQL
- 删除MYSQL数据存放文件C:\ProgramData\MySQL
- 安装
MYSQL的SQL语句
sql:Structure Query Language(结构化查询语言)
分类
DDL:数据定义语言:定义数据库,数据表它们的结构:create(创建) drop(删除) alter(修改)
DML:数据操纵语言:主要用来操作数据:insert(插入) update(修改)delete(删除)
DCL:数据控制语言:定义访问权限,取消访问权限,安全设置 grant
DQL:数据查询语言:select(查询)form子句 where子句
- 首先要登录数据库服务器:mysql-uroot-proot
创建数据库的名字
- create database 数据库的名字;
- 创建数据库的时候,指定字符集
- create database 数据库的名字 character set 字符集
- 如:create database 数据库的名字 character set utf8;
- create database 数据库的名字 character set 字符集 collate 校对规则;
- 如:create database 数据库的名字 character set utf8 collate utf8_bin;
查看数据库
show databases;
information_schema
performance_schema
mysql
这三个库不能动它
查看数据库定义语句
show create database 数据库的名字 如:show create database first;
修改数据库的操作
alter database 数据库的名字 charactar set 字符集;
alter database first_1 charactar set gbk;
删除数据库 drop database 数据库名字;
drop database first;
可以删掉text;
其他数据库指令
- 切换数据库(选中数据库)
- use 数据库名字;
- 如:ues first_1;
- 查看一下当前正在使用的数据库
- select database();
表的CRUD操作
建表
create database 数据库的名字
create table 表名(
列名 列的类型(指定长度) 约束,
列名2 列的类型(指定长度) 约束
);
列的类型
javasqlintintchar/stringchar/varchardoubledoublefloatfloatbooleanbooleandatedate:YYYY-MM-DD
sql常用类型
time:hh:mm:ss
datetime:YYYY-MM-DD hh:mm:ss 默认值是null
timestamp:YYYY-MM-DD hh:mm:ss 默认使用当前时间 text:主要用来存放文本
blob:存放的是二进制
char:固定长度
varchar:可变长度
列的类型存入char(3):一一空格空格varchar(3):一一
长度代表的是字符的个数
列的约束
主键约束:primary key 唯一约束:unique
非空约束:not null
创建表:
- 分析实体:学生
- 学生ID
- 姓名
- 性别
- 年龄
create table student(
sid int primary key,
sname varchar(5),
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 heima character set gbk;
删除表
drop table heima;
sql完成对表中数据CRUD的操作
插入数据
insert into 表名(列名1,列名2,列名3)values(值1,值2,值3);
insert into student(sid,sname,sex,age)values(1,'zhangsan',1,18);
简单写法:
insert into student values(2,'lisi',1,18);
insert into student(sid,sname)values(3,'wangwu');
批量插入
insert into student values
(4,'lisi',1,18),
(5,'lisi',1,18),
(6,'lisi',1,18),
(7,'lisi',1,18);
单条插入和批量插入的效率
查看表中数据:
select*from student;
删除记录
delete from 表名 [where 条件]
如:delete from student where sid=10;
如果没有指定条件,会将表中数据一条一条全部删除
delete from student;
delete删除数据和truncate删除数据有什么差别
delete: DML 一条一条删除表中的数据
truncate: DDL先删除表再重建表
关于哪条执行效率高:具体要看表中的数据量
如果数据比较少,delete比较高效
如果是数据比较多,truncate比较高效
更新表记录
update 表名 set 列名=列的值,列名2=列的值2 [where 条件]
--将id为5的名字修改成李四
update student set name='李四' where id=5;
注:如果参数是字符串,日期要加上单引号
查询记录
select [distinct] [*] [列名,列名2] from 表名 [where 条件]
distinct:去除重复数据
select:选择显示哪些列的内容
例如:
-- 商品分类:手机数码,鞋靴箱包等
1.分类的ID
2.分类名称
3.分类描述
create table category(-- 创建分类表
cid int primary key auto_increment-- id自增涨
cname varchar(10),
cdesc varchar(30)
);
命令:
mysql> create table category(
-> cid int primary key auto_increment,
-> cname varchar(10),
-> cdesc varchar(30)
-> );
Query OK, 0 rows affected (0.01 sec)
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 * from category;
select cname,cdesc from category;
-- 所有商品
1.商品ID
2.商品名称
3.商品的价格
4.生产关系
5.商品分类ID
-- 商品和商品分类:所述关系
create table product(
pid int primary key auto_increment,
pname varchar(10),
price double,
pdate timestamp,
cno int
);
insert into product values(null,'小米mix4',998,null,1);
insert into product values(null,'锤子',2888,null,1);
insert into product values(null,'阿迪王',99,null,2);
insert into product values(null,'老村长',88,null,3);
insert into product values(null,'小熊饼干',1,null,4);
insert into product values(null,'卫龙',1,null,5);
insert into product values(null,'旺旺大饼',1,null,5);
简单查询:
查询所有商品:
select * from product;
-- 查询商品名称和商品价格:
select pname,price from product;
别名查询,as关键字,as关键字是可以省略的
-- 表别名:select p.pname,p.price from product p;(主要是用在多表查询)
select p.pname,p.price from product p;
-- 列别名:select p.name as 商品名称 from product;
select pname as 商品名称,price as 商品价格 from product;
select pname 商品名称,price 商品价格 from product;
去掉重复的值
-- 查询商品所有的价格
select price from product;
select distinct price from product;(去掉重复)
select运算查询
select *,price*1.5 from product;
select *,price*1.5 as 折后价 from product;-- (取别名,在数据库里没有改变,仅仅在查询结果上做了运算 + - * /)
条件查询[where 关键字]
指定条件,确定要操作的记录
-- 查询商品价格>60元的所有商品信息
select * from product where price>60;
-- where后面的条件写法:
-- 关系运算符:> >= <= = != <>
<>:不等于:标准sql语法
!=:不等于:标准sql语法
--查询商品价格在10到100之间
select * from product where price>10 and price<100;
between...and...
select * from product where price between 10 and 100;
逻辑运算:and,or,not
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.查询所有商品,按价格进行排序(asc-升序 desc-降序)
select * from product order by price desc;
-- 2.查询名称有 小 的商品,按价格降序排序
1.查询名称有 小 的商品
select * from product where pname like '%小%';
2.进行排序得出结果
select * from product where pname like '%小%' order by price asc;
聚合函数:
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 where price>(select avg(price) from product);
分组:group by
-- 1.根据cno字段分组,分组后统计商品的个数
select cno,count(*) from product group by cno;
-- 2.根据cno分组,分组统计每组商品的平均价格,并且商品平均价格>60(关键字having)
select cno,avg(price) from product group by cno
having avg(price)>60;
-- having 关键字 可以接聚合函数的 出现在分组之后
-- where 关键字 它是不可以(直接)接聚合函数的 出现在分组之前
编写顺序:
-- S..F..W..G..H..O
select..from..where..group by..having..order by
执行顺序:
-- F..W..G..H..S..O
from..where..group by..having..select..order by
这是整个MySQL语法整理,需要用xmind打开
需要MySQL的教学视频以及资料,请私信松鼠:MySQL