第一章 数据库概述
1、什么是数据库
数据库是一种存储并管理数据的软件系统 存储:持久化 管理:增删改查
常用的存储数据的方式:
1、Java中的变量:生命周期短,不能实现持久化 [内存] 2、序列化:管理数据时依赖于Java中的反序列化 [硬盘] 3、txt,办公软件:没有统一的方式管理数据[硬盘] 4、数据库
2、数据库概述
DBMS:关系型数据库管理系统(Database Management System)是一种操纵和管理数据库的大型软件,例如建立、使用和维护数据库。 DB:数据库(Database) SQL:结构化查询语言,(Structure Query Language),专门用来操作/访问数据库的通用语言。 MySQL:其中的一款关系型数据库管理系统 以下是2019年DB-Engines Ranking 对各数据库受欢迎程度进行调查后的统计结果:(查看数据库最新排名:https://db-engines.com/en/ranking)
! 关系型数据库:
采用关系模型来组织数据,简单来说,关系模型指的就是二维表格模型。类似于Excel工作表。 特点: 所存储的数据有一定的关系 将数据存储在磁盘上 重在持久化
非关系型数据库(NoSQL,not only sql):
可看成传统关系型数据库的功能阉割版本,基于键值对存储数据,通过减少很少用的功能,来提高性能。 特点: 以key-value或json的方式存储数据 将数据存储在内存中 [快照] 重在性能,读取速度快
3、关系型数据库设计规则
- 遵循ER模型
- E entity 代表实体的意思 对应到数据库当中的一张表
- R relationship 代表关系的意思
- 具体体现
- 将数据放到表中,表再放到库中。
- 一个数据库中可以有多个表,每个表都有一个名字,用来标识自己。表名具有唯一性。[类]
- 表具有一些特性,这些特性定义了数据在表中如何存储,类似java和python中 “类”的设计。
- 表由列组成,我们也称为字段。每个字段描述了它所含有的数据的意义,数据表的设计实际上就是对字段的设计。创建数据表时,为每个字段分配一个数据类型,定义它们的数据长度和字段名。每个字段类似java 或者python中的“实例属性”。[成员变量]
- 表中的数据是按行存储的,一行即为一条记录。每一行类似于java或python中的“对象”。
::: hljs-left
4、数据库的存储结构
5、MySQL概述
MySQL是一种开放源代码的关系型数据库管理系统,开发者为瑞典MySQL AB公司。在2008年1月16号被Sun公司收购。而2009年,SUN又被Oracle收购。目前 MySQL被广泛地应用在Internet上的中小型网站中。由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,使得很多互联网公司选择了MySQL作为网站数据库(Facebook, Twitter, YouTube,阿里的蚂蚁金服,去哪儿,魅族,百度外卖,腾讯)。
MySQL软件的卸载、安装和配置这里不做过多叙述,主要是曾经学习时的一些知识点笔记分享给大家。安装的话大家可以搜索一下,网上都很详细,我用的SQLyog可视化工具
6、MySQL数据库客户端的登录
使用命令行客户端连接mysql服务 (1)注意:确认服务是开启的 (2)通过命令行客户端连接Mysql服务器 常规命令: mysql -uroot -p回车 //访问当前主机,端口号为3306的数据库服务 mysql -h主机IP地址 -P端口号 -u用户名 -p回车 Enter password:输入密码
第二章 SQL语言之DDL
1、SQL语言概述
SQL语言 : 结构化查询语言 Structured Query Language. 分类 : DDL : Data Definition Language 数据库定义语言,用于数据库操作,表操作 DML : Data Manipulation Language 数据处理语言,用于记录的增加,删除,修改 DQL : Data Query Language 数据查询语言,用于记录的查询 DCL : Data Control Language -- 部门经理 数据库控制语言,用于账户,权限的管理
2、DDL库操作
语法
建数据库
create database 数据库名 [character set 字符集 ];
查看有哪些数据库
show databases;
查看数据库的创建细节
show create database 数据库名;
修改数据库
alter database 数据库名 character set 字符集 collate 校对规则;
切换数据库
use 数据库名;
显示正在使用的数据库
select database();
删除数据库
drop database 数据库名;
注意 :
1. SQL语言的关键字规范是大写 [初学阶段先实现效果]
2. SQL语言的每一句结尾以 [;] 结尾
3. SQL语言的标点符号全部英文
案例:
-- 需求
-- ①创建一个数据库名称为mydb1数据库
create database mydb1;
--②创建一个使用gbk字符集的mydb2数据库
create database mydb2 character set gbk;
--③查看mysql有哪些数据库
show databases;
--④查看mydb2数据库创建信息
show create database mydb2;
--⑤修改数据库mydb2的字符集为utf-8
-- alter database mydb2 character set utf-8; 错误写法
alter database mydb2 character set utf8;
-- ⑥删除数据库mydb2
drop database mydb2;
3、数据库中字段的数据类型
4、编码问题
命令行操作sql乱码问题
mysql> INSERT INTO t_stu VALUES(1,'张三','男');
ERROR 1366 (HY000): Incorrect string value: '\xD5\xC5\xC8\xFD' for column 'sname' at row 1
修改my.ini配置文件
暂停服务 在路径:D:\ProgramFiles\mysql\MySQLServer5.7Data 找到my.ini文件 修改内容1: 找到[mysql]命令,大概在63行左右,在其下一行添加 default-character-set=utf8 修改内容2: 找到[mysqld]命令,大概在76行左右,在其下一行添加 character-set-server=utf8 collation-server=utf8_general_ci 修改完毕后,重启MySQL57服务 之前建的表还是之前的字符集,建议删除表再新建
查看编码命令:
show variables like 'character_%';
show variables like 'collation_%';
再有乱码问题,可以网上搜一下
DDL表操作
建表语句
-- 创建表(不带约束)语法 :
create table 表名 (
字段名1 字段类型(长度) [ default 默认值 ],
字段名2 字段类型(长度) [ default 默认值 ],
...
) [character set 字符集];
-- 练习 : 根据Java中的类 来建表
Employee{
-- 字段
private int id;
private String name;
private String gender;//性别
private Date birthday;
private Date entry_date; //入职时间
private String job;//职位类型
private double salary;//薪水
}
-- SQL语句
create table tb_employee (
id int,
name varchar(30),
gender char(1),
birthday date,
entry_date date,
job varchar(100),
salary double
);
查看表:
-- 查看数据库中所有的表
show tables;
-- 查看表中字段信息
desc 表名;
-- 查看建表语句
show create table 表名;
删除表
drop table 表名;
修改表
-- 修改表添加字段. 给表新增一列
alter table 表名 add 字段名 类型(长度) 约束;
-- ‐修改表修改字段的类型长度和约束. 修改表的字段信息
alter table 表名 modify 字段名 类型(长度) 约束;
-- 修改表删除表中这个字段.
alter table 表名 drop 字段名;
-- 修改表修改字段名
alter table 表名 change 旧的字段名 新的字段名 类型(长度) 约束;
-- 修改表名.
rename table 旧表名 to 新表名;
-- 修改表的字符集
alter table 表名 character set 字符集;
案例:
练习:
-- 在上面员工表中添加一个image varchar(20)列.
alter table tb_employee add image varchar(20);
-- 修改job列,使其长度变为60.
alter table tb_employee modify job varchar(60);
-- 删除gender列.
alter table tb_employee drop gender;
-- 表名改为user
rename table tb_employee to user;
rename table user to tb_employee;
-- 修改表的字符集utf8
alter table tb_employee character set utf8;
-- 修改列名name修改为username
alter table tb_employee change name username varchar(30);
DML添加、修改、删除数据
添加数据
-- 添加部分字段信息
insert into 表名 (字段名1,字段名2,字段名3...) values (值1,值2,值3...);
-- 添加全部字段信息
insert into 表名 values (值1,值2,值3...);
--添加字段的值的类型如果是字符串或者日期类型,那么在插入的值的时候,就需要使用单引号或者双引号引起来.
-- 推荐使用单引号
案例:
-- 添加部分字段
insert into tb_employee(id,username,birthday) values (1,'光头强','2000-01-01');
--批量添加部分字段
insert into tb_employee(id,username,birthday) values (2,'熊大','2001-01-01') , (3,'熊二','2002-01-01') ;
-- 添加全部字段
insert into tb_employee values(4,'胖虎','2003-01-01','2022-09-13','高级开发工程师',100000,'胖虎.jpg');
--批量添加全部字段
insert into tb_employee values(5,'大雄','2004-01-01','2021-09-13','架构师',200000,'大雄.jpg') , (6,'静香','2005-01-01','2020-09-13','CTO',1000000,'静香.jpg');
修改数据
-- 修改某个字段的值 [一般会带条件,若不带条件就是把所有的值都改变]
update 表名 set 字段名 = 值,字段名=值 [where 条件];
-- 修改某个字段的值 [可以做运算]
update 表名 set 字段名 = 字段名 [赋值操作符] 值,字段名=值 [where 条件];
案例:
-- 将所有员工的工资改为6000元.
update tb_employee set salary = 6000;
-- 将姓名为高卫东的员工的工资改为3000元.
update tb_employee set salary = 3000 where username = '光头强';
-- 将姓名为朱世伟的员工的工资改为9000元,将job改为Manager.
update tb_employee set salary = 9000,job = 'Manager' where username = '熊大';
-- 将姓名为薛嘉锦的员工的工资在原有基础上加1000元.
update tb_employee set salary = salary + 1000 where username = '熊二';
删除数据
语法:
delete from 表名 where 条件; --一定要条件,不带条件都删除完毕
truncate table 表名; -- 属于DDL
注意 :
delete方式属于dml,逐条记录进行删除
truncate方式属于ddl,直接删除表,然后重新创建表
##案例:
-- 删除表中姓名为高卫东记录
delete from tb_employee where username = '光头强';
-- 删除表中的所有记录
使用delete方式 -> DML : 逐一删除数据,留下空表,操作的是记录
delete from tb_employee;
使用truncate方式 -> DDL : 直接删除表,再重新创建新表
truncate table tb_employee;
DDL查询数据
//实体类
class Exam{
private int id;
private String name;
private int math;
private int english;
private int chinese;
}
-- 根据实体类创建数据库中的表
create table tb_exam(
id int,
name varchar(20),
math int,
english int,
chinese int
);
-- 添加数据
-- insert into tb_exam values(字段值1,字段值2,....);
insert into tb_exam values (1,'zhangsan',62,83,79);
insert into tb_exam values (2,'lisi',73,92,81);
insert into tb_exam values (3,'wangwu',81,83,65);
insert into tb_exam values (4,'zhaoliu',73,67,84);
insert into tb_exam values (5,'sunqi',93,75,93);
insert into tb_exam values (6,'zhuba',72,69,95);
基本查询
-- 基础查询 : * 全部列 , [列名,列名] 指定列 , distinct : 列的去重
select [distinct] * 或 [列名,列名...] from 表名;
-- 取别名 as
select 列名 as 别名,列名 as 别名 from 表名;
案例:
-- 查询表中所有学生信息:
select * from tb_exam;
-- 查询表中所有学生的姓名与英语成绩的信息:
select name , english from tb_exam;
-- 过滤表中的重复数据:(过滤英语成绩信息)
select distinct english from tb_exam;
-- 如果多条件去重,可能去重失败,保证每一个记录都是不重复的
select distinct english,name from tb_exam;
-- 在所有学生的英语分数上加10分特长分:
select name , english from tb_exam;
select name , english + 10 from tb_exam; -- 在结果上进行加分
-- 统计每个学生的总分:
select name , (chinese + math + english) from tb_exam;
-- 使用别名的方式表示学生的总分:
select name , (chinese + math + english) as 总分 from tb_exam;
条件查询
语法:
select [distinct] * 或 [列名,列名...] from 表名 where 条件;
案例:
-- 查询姓名为zhangsan的学生成绩信息:
select * from tb_exam where name = 'zhangsan';
-- 查询英语成绩大于90分的学生信息:
select name,english from tb_exam where english > 90;
-- 查询总分大于240分的所有学生信息:
select * from tb_exam where (chinese + math + english) > 240;
-- 查询学生信息和总分一起展示
select * , (chinese + math + english) from tb_exam where (chinese + math + english) > 240;
-- 查询学生信息和总分一起展示 [起别名]
select * , (chinese + math + english) as 总分 from tb_exam where (chinese + math + english) > 240;
-- SQL的执行顺序有关 -> 错误写法
select * , (chinese + math + english) as 总分 from tb_exam where 总分 > 240;
查询中的逻辑运算符
查询中的逻辑运算符 :
> ,< ,>= ,<= ,= ,<>
in : 一组数据内 in(值1,值2,值3...)
like : 模糊查询.
_ : 一个字符 where name like '张_'; -- 名字是2个字,且开头为张
% : 任意个字符 where name like '张%'; -- 名字是n个字,且开头为张
张% : 以张开头
%张 : 以张结尾
%张% : 包含张即可
and : 逻辑与 -> 并且
or : 逻辑或 -> 或者
not : 逻辑非
between ... and : 在xxx之间
案例:
-- 查询英语分数在80-90分的学生的信息:
select * from tb_exam where english > 80 and english < 90;
-- between ... and : 在xxx之间
select * from tb_exam where english between 80 and 90;
-- 查询数学分数为62,81,93的学生的信息.
select * from tb_exam where math in(62,81,93);
-- or 或者
select * from tb_exam where math = 62 or math = 81 or math = 93;
-- 查询所有姓张的学生信息:
select * from tb_exam where name like 'zhang%';
-- 查询数学分数>80,并且语文>80的学生信息:
select * from tb_exam where math > 80 and chinese > 80;
带排序功能的查询
select * from 表 where 条件 order by 列名 asc/desc,列名 asc/desc;
asc : 升序 -- 默认
desc : 降序
案例:
-- 对数学成绩进行排序后输出: [升序]
select * from tb_exam order by math;
-- 对总成绩按照从高到低顺序排序输出:
select * from tb_exam order by (chinese + math + english) desc;
select * , (chinese + math + english) 总分 from tb_exam order by (chinese + math + english) desc;
select * , (chinese + math + english) 总分 from tb_exam order by 总分 desc;
-- 对学生的数学成绩进行降序排序,如果数学成绩相同,那么参照英语成绩进行降序.
select * from tb_exam order by math desc , english desc;
-- 修改人名 : update 表名 set 字段名 = 值,字段名=值 [where 条件];
update tb_exam set name = 'zhangba' where id = 6;
-- 对姓张的同学进行总成绩的排序输出: [降序]
-- 错误写法
select * , (chinese + math + english) 总分 from tb_exam order by 总分 desc where name like
'zhang%';
-- 正确写法
select * , (chinese + math + english) 总分 from tb_exam where name like'zhang%' order by 总分 desc;
SQL语句的执行顺序
SQL语句的编写顺序
select * from 表名 where 条件 group by 列名 having 聚集函数 order by 列名 asc/desc;
这两天工作毕竟忙,摸鱼时间少,不忙的时候继续更java基础的,现在只能靠MySQL的水任务了,见谅
标签:exam,--,where,数据库,笔记,MySQL,tb,select From: https://blog.51cto.com/u_16213911/7023486