一、数据库
1.1 目前存储数据的方式
A.使用数组或者是集合容器来存储数据 临时存储
B.使用文件来进行存储 存储数据的没有指定数据的格式
1.2 缺点
- 要么是临时存储 要么数据没有指定的数据格式
- 没有权限控制 安全性比较差
- 使用文件存储数据 操作比较麻烦 效率低
1.3 数据库简介
1.数据库是“按照数据结构来组织、存储和管理数据的仓库”。是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合 A.数据库存储数据的仓库(粮仓)
1.4 数据库的分类
1.分类:关系型数据库 与非关系型数据库
2.关系型数据库 数据库中的表与表之间存在的关联 例子:班级表 ==>学生表
常见的关系型数据 db2 mysql sqlite oracle sqlserver
3.非关系型数据库:数据库中表与表不存在的关系
常见非关系型数据库 redis(键值对) mondb hbase(列族来进行存储)
1.5 数据库管理系统
1.数据库管理系统(Database Management System)是一种操纵和管理数据库的大型软件,用于建立、使用和维护数据 库,简称DBMS。它对数据库进行统一的管理和控制,以保证数据库的安全性和完整性
A.数据库管理系统就是一个数据库的大型软件
B.用于对数据库进行统一管理与控制
2.运维(管理数据库人员) 运维工程师通过数据库管理系统来统一维护与管理数据库
二、Mysql 数据库
2.1 简介
1.MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL是最流行的关系 型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一
2.2 特点
1.开源 免费
2.轻量级 体积比较好
3.学习成本低 学习比较简单
2.3 下载
1.下载地址:https://www.oracle.com/mysql/free/
2.4 卸载与安装 (参考百度)
三、sql 语句
1.sql语句 结构化查询语句 就是用于操作数据库
2.分类
A.DDL 数据库定义语言 主要是用于来操作数据库 以及数据库表 关键字 alter drop create truncate
B. DQL 数据库查询语言 主要是用于操作数据库表 主要用于查询数据库中的数据 关键字 select
C. DML 数据库操纵语言 主要是用于操作数据库中数据表 主要是对数据进行 增加 insert 删除 delete 修改 update
D. DCL 数据库控制语言 主要是用于对数据库的用户的管理 以及权限的管理 运维工程师操作 关键字为grant、revoke
四、DDL-针对数据库操作
1.创建数据库 语法:create database 数据库库名
2. 创建数据库判断是否存在 语法:create database if not exists 数据库的库名
3.创建数据设置编码格式 语法: create database 数据库的名称 character set 编码格式
4.查看数据库创建的格式 语法:show create database 数据库库名
5.修改数据库的编码格式 语法: alter database 数据库库名 character set 编码格式
6.查看所有的数据库 语法: show databases
7.删除数据库 语法:drop database 数据库库名
五、DDL-操作表
5.1 数据库与数据库表之间的关系
A.数据库中可以有多个数据表 一张表在唯一的数据库中
5.2 mysql 数据库中常见的数据类型
5.2.1 字符类型
varchar 类似于java 的StringBuffer ,长度可变,数据库中一般使用varchar 来记录字符串
5.2.2 数值类型
5.2.3 时间类型
5.3 DDL-对表的操作
5.3.1 创建表
1.语法:
create table 表名(
列名 数据类型(长度),
列名 数据类型(长度),
列名 数据类型(长度),
列名 数据类型(长度)
…
);
2.例子:创建一张表学生表 sid sname sex sage sbirthday date
create table student(
sid int(11),
sname varchar(20),
sex char(2),
sage int(4),
sbirthday date
);
3.注意点:
A. 创建表的时候 括号后需要加上英文分号 列都是使用逗号进行分割 最后列名不需要编写逗号
B. 列的数据类型的长度 可以不指定 但是一般建议指定其长度
C.double类型指定长度 为(长度大小,小数点位数)
5.3.3
修改表名 语法: alter table 原表名 rename to 新表名
查看数据库中所有的表 语法: show tables;
删除表 语法: drop table 表名
查看表结构 语法:desc 表名
5.4 对列的操作
在末尾增加列 语法: alter table 表名 add 列名 数据类型(长度)
在指定的列后增加 语法: alter table 表名 add 列名 数据类型(长度) after 已经存在的列名
修改列的数据类型 语法:alter table 表名 modify 列名 数据类型(长度)
修改列名 语法: alter table 表名 change 原列名 新列名 数据类型(长度)
删除列 语法:alter table 表名 drop 列名
5.6 可视化工具
1.常用的可视化工具 网页版可视化工具 navicte(收费) sqlyarn(不收费)
2.下载安装使用sqlyarn
5.7 DML
在可视化工具sqlyarn中写语句
1.素材
#创建数据库
CREATE DATABASE day08db;
#切入到数据库
USE day08db
#创建数据库表
CREATE TABLE student(
sid INT(11),
sname VARCHAR(20),
spwd VARCHAR(20),
sbrithday DATE
);
2. 增加数据
2.1 第一种方式
1.语法: insert into 表名 values(数据1,数据2,数据3);
2.例子:
INSERT INTO student VALUES(1,"小明","123456",'2018-11-20');
3.注意点:A.必修插入所有列的数据
2.2 第二种方式 指定列名插入
1.语法: insert into 表名(列名,列名,列名)values(数据,数据,数据);
2.例子:
INSERT INTO student(sid,spwd,sbrithday)VALUES(2,"123",'2019-11-23')
2.3 插入多条数据
1.语法:
insert into 表名 values(数据1,数据2,数据3),(数据1,数据2,数据3)
insert into 表名(列名,列名,列名)values(数据,数据,数据),(数据,数据,数据);
方式和插入单条数据一样,直接在最后面加个逗号加数据
2.例子:
INSERT INTO student(sid,spwd,sbrithday)VALUES(3,"122",'2019-10-23'),
(4,"345",'2019-10-23')
INSERT INTO student VALUES(5,"吴","123456",'2018-11-20'),(6,"李","123456",'2018-11-20')
2.4 注意点
A.插入的数据的值必须与数据库列表中的数据类型一致
B.插入数据值的长度要少于列表定义的长度
C.字符串可以使用单引号以及双引号修饰 时间类型只能使用单引号进行修饰
3. 修改数据
1.语法:update 表名 set 列名= 值,列名=值 where 条件
2.例子:
UPDATE student SET sname ="毛哥" ,spwd="123" WHERE sid =1;
3.注意点:
执行修改的操作的时候 需要根据条件来进行修改
4.删除数据
4.1 第一种写法
1.语法:delete from 表名 where 条件
delete from 表名 删除表中的所有数据
2.例子:
DELETE FROM student WHERE sid=1;
4.2 第二种写法
1.语法: truncate table 表名
2. TRUNCATE TABLE student
4.3 区别
**A.TRUNCATE 删除数据 并且删除表的结构(从1开始) delete 只能删除数据
B.TRUNCATE 删除整个表中的数据 delete 一行一行的删除 效率低
例:学生表有自增主键id 用truncate 会删除所有数据和结构,在插入数据时,id从1开始重新自增 用delete 删除数据,在插入数据时,id 会删除前时最大的id 自增,而不是从1开始重新自增 **
5.单表查询(重要)
- 素材
#创建商品表:
CREATE TABLE product(
pid INT PRIMARY KEY,#主键ID
pname VARCHAR(20),#商品名称
price DOUBLE,#商品价格
category_name VARCHAR(32)#商品分类名称
);
INSERT INTO product(pid,pname,price,category_name) VALUES(1,'联想电脑',5000,'电脑
办公');
INSERT INTO product(pid,pname,price,category_name) VALUES(2,'海尔电脑',3000,'电脑
办公');
INSERT INTO product(pid,pname,price,category_name) VALUES(3,'雷神电脑',5000,'电脑
办公');
INSERT INTO product(pid,pname,price,category_name) VALUES(4,'JACK JONES',800,'服
装');
INSERT INTO product(pid,pname,price,category_name) VALUES(5,'真维斯',200,'服装');
INSERT INTO product(pid,pname,price,category_name) VALUES(6,'花花公子',440,'服
装');
INSERT INTO product(pid,pname,price,category_name) VALUES(7,'劲霸',2000,'服装');
INSERT INTO product(pid,pname,price,category_name) VALUES(8,'香奈儿',800,'女士用
品');
INSERT INTO product(pid,pname,price,category_name) VALUES(9,'相宜本草',200,'女士用
品');
INSERT INTO product(pid,pname,price,category_name) VALUES(10,'面霸',5,'女士用品');
INSERT INTO product(pid,pname,price,category_name) VALUES(11,'雪碧',56,'饮料饮
品');
INSERT INTO product(pid,pname,price,category_name) VALUES(12,'香飘飘奶茶',1,'饮料
饮品');
INSERT INTO product(pid,pname,price,category_name)
VALUES(13,'iPhone9',8000,NULL);
2.表结构
3. 全查(查询表中所有的数据)
1.语法: select * from 表名
2.例子:
#查询product表中所有记录
SELECT * FROM product
4.查询表中指定列的数据
1.语法:select 列名,列名,列名 from 表名
2.例子:
#查询product表中pid和pname字段
SELECT pid, pname FROM product
5.简单运算查询
1.语法: select 运算 from 表名
2.运算: + - * /
3.例子:
#查询结果是表达式(运算查询):将所有商品的价格+10元进行显示.
SELECT price+10 FROM product
6.根据条件进行查询
1.语法: select * from 表名 where 条件
2.例子:
#查询product表中所有的电脑办公记录
SELECT * FROM product WHERE category_name ="电脑办公"
#查询商品名称为“花花公子”的商品所有信息:
SELECT * FROM product WHERE pname ="花花公子"
#查询价格为800商品
SELECT * FROM product WHERE price =800;
#查询价格不是800的所有商品
SELECT * FROM product WHERE price !=800;
#查询商品价格大于60元的所有商品信息
SELECT * FROM product WHERE price >60
#查询商品价格在200到1000之间所有商品
SELECT * FROM product WHERE price >= 200 AND price <=1000;
SELECT * FROM product WHERE price >= 200 && price <=1000;
SELECT * FROM product WHERE price BETWEEN 200 AND 1000;
#查询商品价格是200或800或者2000的所有商品
SELECT * FROM product WHERE price =200 || price =800 || price =2000
SELECT * FROM product WHERE price =200 OR price =800 OR price =2000
SELECT * FROM product WHERE price IN(200,800,2000);
- 模糊查询
1.模糊查询的关键字 like
2.匹配的符号 % 匹配多个 _ 匹配一个
3.例子:
#查询含有'霸'字的所有商品
SELECT * FROM product WHERE pname LIKE '%霸%'
#查询以'香'开头的所有商品
SELECT * FROM product WHERE pname LIKE '香%'
#查询第二个字为'想'的所有商品
SELECT * FROM product WHERE pname LIKE '_想%'
8.非空查询 is not null is null
1.null 不等于 “” null 表示是未插入数据的状态
2.例子:
#商品没有分类的商品
SELECT * FROM product WHERE category_name IS NULL
#查询有分类的商品
SELECT * FROM product WHERE category_name IS NOT NULL
9.排序
1.关键字: order by 升序 asc 降序 desc
2.语法: select * from 表名 order by 列名 排序的规则
3.例子:
遇到相同时,可以在加一个排序规则,直接在后面加逗号加 排序规则
#1.使用价格排序(降序)
SELECT * FROM product ORDER BY price DESC
#2.在价格排序(降序)的基础上
#若价格相同,相同价格的数据以pid降序排序
SELECT * FROM product ORDER BY price DESC,pid DESC
10.分页查询(可用来只显示前几条)
1.关键字 limit ?,? 第一个参数表示的是数据库的索引 第二个参数表示的是页量(每页显示数据的数量)
数据库索引是从0开始
2.语法: select * from 表名 limit ?,?
3.案例
#查询第一条与第二条数据
SELECT * FROM product LIMIT 0,2 //第一页 每页显示两条数据 1
#查询出第三条与第四条数据
SELECT * FROM product LIMIT 2,2 //第二页 2
#查询出第五条与第六条数据
SELECT * FROM product LIMIT 4,2 //第三页 3
转换的规则 (当前页-1)*页量
可以用来0页来筛选前几条数据
SELECT * FROM product ORDER BY price DESC LIMIT 0,3
- 分组查询
1.分组:group by
2.语法: select * from 表名 group by 列名
3.例子:
# 统计各个分类下商品的个数
SELECT category_name ,COUNT(1) FROM product GROUP BY category_name
- 过滤(只能配合分组来使用)
1.过滤: having
2.一般是与分组进行搭配使用 一般是在分组的后面
3.语法:select * from 表名 group by 列名 having 条件
4.例子:
#统计各个分类商品的个数,有且 只显示分类名称不为空值的数据
SELECT category_name ,COUNT(1) FROM product GROUP BY category_name
HAVING category_name IS NOT NULL
- 去重
1.关键字: DISTINCT
2.案例
#查询出价格
SELECT DISTINCT price FROM product
- 设置别名
1.关键字 as
2.设置别名 可以给表设置别名 也可以给列设置别名 设置别名as 关键字也可以省略
3.案例
SELECT p.pname ,price+10 AS "运算后的价格" FROM product AS p
查询语句的顺序
1.查询语句的顺序:
where 一般优先级最高 group by 在having 前面
select * from 表名 where 条件 group by 条件 + having 条件 order by 排序条件 + limit(分页)
2.例子:
SELECT category_name ,COUNT(1) AS n FROM product WHERE category_name LIKE '%
品%' GROUP BY category_name
HAVING category_name IS NOT NULL ORDER BY n ASC LIMIT 0,1
15.1聚合函数
#1 查询商品的总条数
SELECT COUNT(1) FROM product
#查看商品总价格、最大价格、最小价格、价格的平均值
SELECT SUM(price) AS "总价格",MAX(price) AS "最大价格",MIN(price) AS "最小价格",
ROUND(AVG(price),2) AS "平均价格" FROM product
#2 查询价格大于200商品的总条数
SELECT COUNT(1) FROM product WHERE price >=200
#3 查询分类为'电脑办公'的所有商品的总记录
SELECT COUNT(1) FROM product p WHERE p.category_name="电脑办公"
#4 查询分类为'服装'所有商品的平均价格
SELECT AVG(price) FROM product p WHERE p.category_name="服装"
15.2时间的函数
SELECT SYSDATE()
SELECT CURDATE()
SELECT CURTIME()
SELECT NOW()
15.3 字符串函数
SELECT CONCAT("小良","精神了","笑傲发")
SELECT INSERT("小良发图片",4,3,"多来a梦");
SELECT UPPER("Abc");
SELECT LOWER("Abc");
SELECT SUBSTRING("瞬间精神小伙",4,3)
七、约束
7.1 约束的概念
1.概念:
在设计表中给指定列在约束条件 可以用于限制指定列的数据 保证数据的正确性以及完整性,避免出现大量的重复的数据
2.五大约束
主键约束 primary key
唯一约束 unique
外键约束 foreign key
非空约束 not null
默认约束 default
7.2 主键约束
1.关键字:primary key
2.特点: 唯一 不能为空 一张表中只能有一个主键
3.主键约束设置两种方式
A.创建表的时候设置
B.在表创建完成之后设置
第一种方式 创建表的时候设置
CREATE TABLE p1(
pid INT (11) PRIMARY KEY,
panme VARCHAR(20)
)
第二种方式 在创建表完成之后设置
CREATE TABLE p2(
pid INT(11),
pname VARCHAR(20)
);
#添加主键约束
语法:alter table 表名 add PRIMARY KEY(列名)
例子:ALTER TABLE p2 ADD PRIMARY KEY(pid)
#删除主键约束
alter table 表名 drop PRIMARY KEY
例子:ALTER TABLE p2 DROP PRIMARY KEY
验证主键约束的特点
自增长策略
1.关键字 auto_increment
2.特点:
A.只能针对与整数
B.自增长的波长是1
C.一般是与主键进行搭配使用
D.设置自增长之后 改列不需要再插入数据
#创建表
CREATE TABLE p3(
pid INT(11) PRIMARY KEY AUTO_INCREMENT,
pname VARCHAR(20)
);
INSERT INTO p3(pname)VALUES("小明")
7.3 唯一约束
1.关键字 unique
2.特点: 唯一 不能重复 可以为null
3.主键约束与唯一约束的区别
A.主键约束 一张表中只能有一个 唯一约束一张表中可以有多个
B.主键约束不能为空 唯一约束是可以设置空
C.唯一约束可以设置为联合唯一约束 (多个列组成约束条件)
4.唯一约束两种创建方式
A.创建表的时候设置 B.表创建完成之后设置
第一种方式
CREATE TABLE p1(
pid INT(11) PRIMARY KEY AUTO_INCREMENT,
pname VARCHAR(20) UNIQUE
);
第二种方式
CREATE TABLE p2(
pid INT(11) PRIMARY KEY AUTO_INCREMENT,
pname VARCHAR(20)
);
语法:
alter table 表名 add CONSTRAINT 唯一约束的名称 unique(列名)
#增加唯一约束
ALTER TABLE p2 ADD CONSTRAINT u_name UNIQUE(pname)
语法:
alter table 表名 drop index 唯一约束的名称
#删除唯一约束
ALTER TABLE p2 DROP INDEX u_name
联合唯一约束
CREATE TABLE p3(
pid INT(11) PRIMARY KEY AUTO_INCREMENT,
pname VARCHAR(20),
pwd VARCHAR(20),
UNIQUE(pname,pwd)
);
INSERT INTO p3(pname,pwd)VALUES("毛哥","123");
上例中联合唯一约束后,需要pname+pwd 两个都相同才发生错误,插入 (“毛哥”,“1231”);可以成功,不会发生错误
7.4 非空约束
1.关键字: not null
2.作用: 插入数据的时候必须插入数据 不能插入 null
3.在创建表的时候进行设置
CREATE TABLE p4(
pid INT(11) PRIMARY KEY AUTO_INCREMENT,
pname VARCHAR(20) NOT NULL
);
INSERT INTO p4(pname)VALUES(NULL)
7.5 默认约束
1.关键字:default
2.作用:用于设置列的默认值
3.在创建表的时候进行设置
4.说明:
A.指定列设置默认约束之后 未插入数据 显示默认值
B.指定列设置默认约束之后 插入 default 也是默认值
C.插入具体的数据时候 才会替换默认值
CREATE TABLE p5(
pid INT(11) PRIMARY KEY AUTO_INCREMENT,
pname VARCHAR(20) DEFAULT '毛哥'
);
INSERT INTO p5(pid)VALUES(1);
INSERT INTO p5(pname)VALUES(DEFAULT)
INSERT INTO p5(pname)VALUES("吴启龙")
多表查询
select * from 表名 where 条件
直接英翻中 选择筛选 列名,列名… 从 表名,表名… 当 什么条件时
列名…就是显示的结果表的列名
表名 就是从哪张表中查询 ,如果表中没有相应列名就会报错,结果表显示不出来,子查询无连接表的功能
用where 时,表名… 中的多张表会连接起来,只要多张表有的列名都可以在结果表显示出来,不报错
连接表功能的语句还有 INNER JION 内连接
左连接 LEFT ON 右连接 RIGHT ON
子查询 IN() 就没有连接表的功能,只是通过逻辑连接的外键 在 from紧接的表名 中需要筛选的列进行提前筛选一次