文章目录
- 数据库入门
- 数据库概念
- 理解中的数据库:
- 实际可视化中的数据表:
- 在数据库的操作:
- 在没有数据的情况时候我们操作数据的方式:
- 在有数据库的时候我们操作数据的方式:
- 数据库的组成:
- 数据库管理系统(DBMS):
- 实体类和数据库表的关系:
- 传统数据库(关系型数据库):表与表之间是存在关系
- 非关系型数据库:
- mysql的学习
- mysql数据库连接的方式:
- mysql 安装:
- 连接数据库的方式:今天主要使用shell窗口
- 普通的shell窗口:
- 修改mysql密码:
- 对数据库的操作
- sql语句分类:
- 数据库中的数据类型:(部分)
- DDL:对数据库表的操作
- DML:对数据的操作,增加 删除 修改
- DQL:查询后回形成伪表,并不会改变数据
- sql语句的规范:
- 分页查询原理:
数据库入门
数据库概念
存数据的一个仓库(大量的数据),其实底层还是使用文件来进行存
理解中的数据库:
数据库: 是一个文件夹 => 数据表在数据库 ==》数据由数据库进行管理,存放
数据表: 文件夹里的文件
实际可视化中的数据表:
数据表:显示就是一个二维的表格
包含三大要素: 表名 行 与列
在数据库的操作:
就是增删改查 (不需要去关键底层如何实现,只需要关注一些指令)
作用:使对数据的操作更加高效,相对于java原始的操作数据流。
在没有数据的情况时候我们操作数据的方式:
我们操作数据,都是使用java通过流的形式对数据进行操作,但是过程繁杂,代码量庞大
在有数据库的时候我们操作数据的方式:
我们只需使用java代码对数据库发送相应的指令给数据,处理数据的这个过程交给数据库就可以获取我们想要的结果。
数据库的组成:
数据库的组成: 一个是客户端 一个是服务器
客户端 : dos , sqlyarn , 类似于 眼睛 耳朵
作用:1.发送指令 2.接受数据,显示数据
服务器:(主要是由空间,可以连接外网,都可以当做一台服务器)电脑 或主机,类似人的大脑
作用: 1.接受指令 2.处理指令 3.返回相应的数据
数据库管理系统(DBMS):
DBMS:管理数据库的系统
1.更好的去管理数据以及数据库
2.对指令的处理
3.数据库:只需要做数据存储: 减轻数据库服务器的压力
实体类和数据库表的关系:
实体类和数据库表的关系:实体类就是数据库表在代码中实际映射,实体类是和数据库表一一对应的
表名 =>类名
列=>属性
每一行数据对应一个对象
传统数据库(关系型数据库):表与表之间是存在关系
mysql: 1.免费 2.开源 3. 轻量级 (学习的重点)
orcle 收费的,性能非常好,保证数据安全,数据快(学习重点)
DB2 收费,性能好
sqlserver c# 微软
sqlite 移动端的数据库 存数据比较少
非关系型数据库:
hbase(列族来存) ,redis(以键值对来进行存)==>表与表之间不存在关系 ,可以存的数据量比关系型数据库更大
mysql的学习
mysql数据库连接的方式:
1.dos(系统自带) 2.sqlyarn (可视化工具)等
mysql 安装:
注意问题:
1.要注意端口号3306
2.注意设置编码格式 utf-8
3.记住root的密码(root用户是超级用户,权限基本上都有)
连接数据库的方式:今天主要使用shell窗口
普通的shell窗口:
1.本地连接的方式 :mysql -u用户名 -p密码
2.远程连接的方式: mysql -hIP地址 -u用户名 -p密码 (公司一般远程连接)
- 手动关闭数据库服务指令:(都必须使用管理员shell窗口)
net stop (数据库名) 如 MYSQL57
- 手动启动数据库服务指令:
net start (数据库名)如MYSQL57
注意点: 都需要开启mysql服务(mysql一般是自动开启) 快捷键:ctrl+alt+delete
修改mysql密码:
1.进入mysql中
2.切换到mysql
3.修改语句 update user set passwrod =“修改的密码” where user=“用户名”
对数据库的操作
- 对数据库的操作:写sql语句(结构化查询语言(就类似于普通,基本数据库都能够使用))
sql语句分类:
- DDL :对库,表结构进行操作,不会修改表里的数据 常用的关键件 alter rename …
- DML:对数据库的操作:数据库的数据会发生变化 insert(增加) update(修改) delete(删除) 不包含查询
- DQL : 查询数据库的数据==>数据库的数据是不会发生改变==>相当于形成了一张伪表
- DCL : 对权限,以及用户的增加与删除的控制,(管理员)
数据库中的数据类型:(部分)
- int(整数)
- double(小数)
- char(类似String)=>固定的字节
- varchar(长度可变,类似于Stringbuffer)
- Text(大文本) 文章
- blob 存二进制(图片,视频) java一般图片都存的是地址
- date : yyyy–MM-dd
- time: HH:mm:ss
- dateTime: yyyy–MM-dd HH:mm:ss
DDL:对数据库表的操作
创建数据库 :create database + 数据库的库名
mysql> create database student;
Query OK, 1 row affected (0.00 sec)
创建数据库的时候设置其编码格式 :create database + 数据库的库名 + character set +编码格式
mysql> create database student character set utf8;
Query OK, 1 row affected (0.00 sec)
查看数据库的编码格式: show create database+数据库的库名
mysql> show create database student;
+----------+------------------------------------------------------------------+
| Database | Create Database |
+----------+------------------------------------------------------------------+
| student | CREATE DATABASE `student` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+------------------------------------------------------------------+
1 row in set (0.03 sec)
删除数据库: drop database +数据库库名(不要把数据库默认的库删除了)
mysql> drop database student;
Query OK, 0 rows affected (0.00 sec)
查看所有的数据库:show databases;
mysql> show databases;
使用数据库:use +库名(在创建表格前要确认使用哪个数据库)
mysql> use student;
Database changed
创建表:create table +表名(
列名1 数据类型(长度),
列名2 数据类型(长度),
列名…n 数据类型(长度)
);
1.注意点:最后一个列名不需要加逗号
2.要切换到具体的库
mysql> create table user(
-> u_id int (10),
-> u_sex char(2),
-> u_tel varchar(20)
-> );
Query OK, 0 rows affected (0.02 sec)
在表中增加一列 :alter table 表名 add 列名(长度)
mysql> alter table user add u_age int(100);
Query OK, 0 rows affected (0.03 sec)
Records: 0 Duplicates: 0 Warnings: 0
查看表结构: desc 表名
mysql> desc user;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| u_id | int(10) | YES | | NULL | |
| u_sex | char(2) | YES | | NULL | |
| u_tel | varchar(20) | YES | | NULL | |
| u_age | int(100) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
4 rows in set (0.04 sec)
修改具体列的类型的约束:alter table + 表名 modify 列名(长度)
mysql> alter table user modify u_age varchar(50);
Query OK, 0 rows affected (0.04 sec)
Records: 0 Duplicates: 0 Warnings: 0
修改整个列名: alter table +表名 change 旧的列名 新的列名(长度);
mysql> alter table user change u_age new_age varchar(15);
Query OK, 0 rows affected (0.04 sec)
Records: 0 Duplicates: 0 Warnings: 0
删除列: alter table 表名 drop 列名
mysql> alter table user drop new_age;
Query OK, 0 rows affected (0.03 sec)
Records: 0 Duplicates: 0 Warnings: 0
修改表的名称:alter table 表名 rename +新的表名 || rename table +旧表名 to +新的表名
mysql> alter table user rename new_user;
Query OK, 0 rows affected (0.01 sec)
mysql> rename table new_user to user;
Query OK, 0 rows affected (0.01 sec)
查看当前库里的所有的表: show tables
mysql> show tables;
+-------------------+
| Tables_in_student |
+-------------------+
| user |
+-------------------+
1 row in set (0.03 sec)
设置表的编码格式: alter table +表名 character set 编码格式
mysql> alter table user character set utf8;
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
查看表的编码格式: show create table + 表名
mysql> show create table user;
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------+
| user | CREATE TABLE `user` (
`u_id` int(10) DEFAULT NULL,
`u_sex` char(2) DEFAULT NULL,
`u_tel` varchar(20) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.05 sec)
mysql使用总结:
- 创建一个库,查询所有的库
- 给库设置编码格式(查看库的编码格式)
- 切换具体库
- 创建一张表
- 新建一个字段
- 修改字段的约束
- 修改一列
- 删除这一列
- 查看表结构
- 修改表名
- 查看所有的表
- 给表设置编码格式
- 查看表的编码格式
DML:对数据的操作,增加 删除 修改
增加:
第一种写法: insert into 表名(“列名1”,“列名2”,“列名3”)values(值1,值2,值3); (写列名)
mysql> insert into user(u_id,u_sex,u_tel) values(1,"男","123456789");
Query OK, 1 row affected (0.01 sec)
第二种写法:(不用列名)insert into 表名 values(值1,值2,值3,值n); 默认插入所有的数据,从第一列开始
mysql> insert into user values(2,"女","123457777789");
Query OK, 1 row affected (0.01 sec)
插入多条数据:insert into 表名 values(值1,值2,值3,值n),(值1,值2,值3,值n),n个();
mysql> insert into user values(4,"女","123457777789"),(3,"男","1123132132");
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
注意事项: 1.列与插入值的对应上
2.插入值的范围不能超过其设置的长度
3.数字类型不用加引号,字符串类型加双引号或单引号, 时间类型加单引号
删除:
- delete from 表名 where 条件 ==>删除指定条件的数据
mysql> delete from user where u_id=1;
Query OK, 1 row affected (0.00 sec)
- delete from 表名 ==》全部删除表的内容,但是如果有自增的索引不会被重置为0
mysql> delete from user;
Query OK, 3 rows affected (0.01 sec)
- truncate 表名 =>删除清空数据,并且会删除表结构 ==>也就等同于先删除这张表,再重新构建一张表,如果有设置自增,则会把自增的索引重置为0
修改:update 表名 set 列名1=“值1”,列名=“值2” where 条件
mysql> update user set u_sex ="女" where u_id=1;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0
注意事项:
- 一定要指定条件,否则就回修改所有
- 要修改的列与值要对应
- 修改值的范围不能超过其长度
- 数字类型用加引号,字符串类型加双引号, 时间类型加单引号
DQL:查询后回形成伪表,并不会改变数据
对单表的查询操作:
#创建商品表:
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);
#查询product表中所有记录 所有的使用*
语法: select * from 表名
select * from product
#查询product表中pid和pname字段
语法:select 列名,列名 from 表名
select pid,pname from product;
#查询product表中所有的电脑办公记录
语法:select * from 表名 where 条件
select * from product where categroy_name="电脑办公";
#查询结果是表达式(运算查询):将所有商品的价格+10元进行显示.
语法:select 列名+10 from 表名
select price+10 from product;
#设置别名关键字 按as(可以不写) ==>设置别名可以给表设置,也可以给列设置别名(表与表之间存在关系,使用的比较多)
给表设置别名 :select * from 表名 as s
去除重复的关键字是: distinct
去除价格重复
select distinct price from product;
#======================== 根据条件来进行查询=====================
#查询商品名称为“花花公子”的商品所有信息:
select * from product where pname="花花公子";
#查询价格为800商品
select * from product where price=800;
#查询价格不是800的所有商品
1.第一种写法:select * from product where price !=800;
2.第二种写法:select * from product where not(price=800);
#查询商品价格大于60元的所有商品信息
select * from product where price>60;
#查询商品价格在200到1000之间所有商品
1. select * from product where price>=200 and price<=1000;
2.使用的关键字是 between ... and ==> select * from product where price between 200 and 1000(包头包尾)
3.select * from product where price>=200 && price<=1000;
#查询商品价格是200或800或者2000的所有商品
1.select * from product where price=200 || price =800||price=2000;
2.select* from product where price=200 or price =800 or price=2000; ==>使用的关键字是or
3.select * from product where price in(200,800,2000); ==>使用的关键字是in
#查询含有'霸'字的所有商品 模糊查询的两个符号 %==》匹配一个或者是多个 _匹配一个字符 like(像)
select * from product where pname like "%霸%"
#查询以'香'开头的所有商品
select * from product where pname like "香%";
#查询第二个字为'想'的所有商品
select * from product where pname like "_想%";
#商品没有分类的商品 注意点 is null ="" 不一样
select * from product where category_name=""; is null 表示插入的时候,没有插入数据
select * from product where category_name is null
#查询有分类的商品
select * from product where category_name is not null;
#分页查询 limit?,? ==>? 表示数据的索引这个索引是从0 开始, (当前页-1)*页量 ?每页显示的页量 ,算法分页limit的两个参数的算法:第一个参数:(当前页-1)*页量 ,第二个参数:页量
select * from product limit0,2;
#排序:关键字order by ASC升序 desc降序==> 淘宝店的销售量
#1.使用价格排序(降序)
select * from product order by price desc;
#2.在价格排序(降序)的基础上
#若价格相同,相同价格的数据以pid降序排序
select * from product order by price desc, pid desc;
#查询出 价格(去掉重复的) 以价格进行降序排列
select distinct price from product order by price desc;
#聚合函数:
#count(* 或者是 1 或者列名)==>查询出总记录数
#MAX(列名)==>最大值
#MIN(列名)==>最小值
#SUM(列名)==>总和
#AVG(列名)==>平均数
#1 查询商品的总条数
select count(1) from product;
#查看商品总价格、最大价格、最小价格、价格的平均值
select SUM(price),MAX(price),MIN(price),AVG(price) from product;
#2 查询价格大于200商品的总条数
select count(1) from product where price>200
#3 查询分类为'电脑办公'的所有商品的总记录
select count(1) from product where category_name="电脑办公";
#4 查询分类为'服装'所有商品的平均价格
select avg(price) as "平均数" from product where category_name="服装";
#分组:group by +分组的条件
# 统计各个分类下商品的个数
select category_name,count(1) from product group by category_name;
#统计各个分类商品的个数,有且 只显示分类名称不为空值的数据
select category_name,count(1) from product group by category_name having category_name is not null;
#统计各个分类商品的个数,有且只显示分类名称不为空值的数据 降序排列 + 加分页取前两条数据
select category_name,count(1) as s from product group by category_name having category_name is not null order by s desc limit 0,2;
#分组的条件关键字having
#where ===相同点都是用于过滤
# 区别: having 是在分组的后面进行过滤(group by 一般having进行搭配使用)
# where 是在分组的前面的过滤
#查询语句书写的规范: select * from + 表名 +where 条件 +group by(分组)+having(过滤)+order by(排序)+limit(分页)
#备份: 1.通过sql语句备份 dos 窗口 mysqldump -u用户名 -p密码 数据库的苦命>路径(d:/aa.sql); 1.一点不要加分号 2.不能进mysql进行备份
#还原 : 2. mysql -u用户名 -p密码 数据库<路径(d:/aa.sql); 1.数据库在存在 2.一点不要加分号 3.不能进mysql进行备份
sql语句的规范:
1.可以存在多行,每一行sql以分号结尾
2.不区别大小写(html 但是一般建议小写) 关键字一般建议大写,其它的小写
3.数据库的命名一般以db结尾 stuent_db
分页查询原理:
-- 查询练习 1------------
CREATE TABLE stu (
sid CHAR(6),
sname VARCHAR(50),
age INT,
gender VARCHAR(50)
);
INSERT INTO stu VALUES('S_1001', 'liuYi', 35, 'male');
INSERT INTO stu VALUES('S_1002', 'chenEr', 15, 'female');
INSERT INTO stu VALUES('S_1003', 'zhangSan', 95, 'male');
INSERT INTO stu VALUES('S_1004', 'liSi', 65, 'female');
INSERT INTO stu VALUES('S_1005', 'wangWu', 55, 'male');
INSERT INTO stu VALUES('S_1006', 'zhaoLiu', 75, 'female');
INSERT INTO stu VALUES('S_1007', 'sunQi', 25, 'male');
INSERT INTO stu VALUES('S_1008', 'zhouBa', 45, 'female');
INSERT INTO stu VALUES('S_1009', 'wuJiu', 85, 'male');
INSERT INTO stu VALUES('S_1010', 'zhengShi', 5, 'female');
INSERT INTO stu VALUES('S_1011', 'xxx', NULL, NULL);
-- 查询性别为女,并且年龄大于等于50的记录
SELECT * FROM stu WHERE age>=50 AND gender="female"
-- 查询学号为S_1001,或者姓名为liSi的记录
SELECT * FROM stu WHERE sid="S_1001" OR sname="liSi"
-- 查询学号为S_1001,S_1002,S_1003的记录
SELECT * FROM stu WHERE sid="S_1001" OR sid="S_1002" OR sid="S_1003"
-- 查询学号不是S_1001,S_1002,S_1003的记录
SELECT * FROM stu WHERE sid NOT IN ("S_1001","S_1002","S_1003")
-- 查询年龄为null的记录
SELECT * FROM stu WHERE age IS NULL
-- 查询年龄在20到40之间的学生记录
SELECT * FROM stu WHERE age>=20 AND age<=40
-- 查询性别非男的学生记录
SELECT * FROM stu WHERE NOT gender="male"
-- 查询姓名不为null的学生记录
SELECT * FROM stu WHERE sname IS NOT NULL
-- 查询姓名由5个字母构成的学生记录
SELECT * FROM stu WHERE sname LIKE "_____"
-- 查询姓名由5个字母构成,并且第5个字母为“i”的学生记录
SELECT * FROM stu WHERE sname LIKE "____i"
-- 查询姓名以“z”开头的学生记录
SELECT * FROM stu WHERE sname LIKE "z%"
-- 查询姓名中第2个字母为“i”的学生记录
SELECT * FROM stu WHERE sname LIKE "_i%"
-- 查询姓名中包含“a”字母的学生记录
SELECT * FROM stu WHERE sname LIKE "%a%"