数据库入门
什么是数据库
数据库:是指长期存储在计算机内、有组织的数据集合。简而言之,数据库就是一个存储数据的地方。
数据库分类-关系型数据库
将数据间的关系以数据库表的形式加以表达,并将数据存储在表格中,以便于查询。
常用关系型数据库:
- Oracle:在大型项目中使用,例如:银行、电信等项目
- MySQL:Web 项目中使用最广泛的关系型数据库
- Microsoft SQL Server:在微软的项目中使用
- SQLite:轻量级数据库,主要应用在移动平台
数据库分类-非关系型数据库
常见非关系型数据库:
- Redis:开源,可做数据库、缓存、消息中间件和队列
- Mongodb:面向文档的开源数据库系统,将数据存储为文档
- Hbase:大数据存储
SQL介绍
SQL:结构化查询语言通过SQL语言,可以对数据库进行操作,主流的关系型数据库都支持SQL语言,在MySql中SQL语言不区分大小写。
-
对于数据库的操作(主要):
- 数据查询:查询语句
- 数据更改:新增、修改、删除语句
-
关键字
- 查询语句--select;新增语句--insert;修改语句--update;删除语句--delete
MySQL介绍
MySql是一个关系型数据库,由瑞典MySql AB公司开发,后被Sun公司收购,Sun公司后来又被Oracle收购。目前MySql属于Oracle的产品。MySql产品分为社区版和商业版本,社区版本免费使用。官网:www.mysql.com/
MySQL特点
- 可移植性好
- 支持多操作系统
- 支持多种编程语言
- 开源、社区版免费
- 支持多线程
- 优化SQL查询算法
- 多种数据库连接方式
- 支持多语言编码格式
MySQL组成
MySQL组成:
-
MySQL服务器:存储数据并解析编译后的SQL语句,将执行结果返回给客户端。
-
MySQL客户端:下发用户要执行的SQL语句,并显示服务器返回的执行结果
-
注意
- MySQL服务器安装完成之后,默认就已经安装了命令行客户端。
- 在连接MySQL服务器之前需要知道MySQL服务器的IP地址及对应的端口(默认3306)。
- Windows服务器可以通过ipconfig查看IP地址,Linux中可以通过ifconfig查看IP地址
MySQL基础理论
数据类型与约束
常用数据类型
-
整型:int;
有符号范围(-2147483648 ~2147483647) 、无符号范围(0 ~ 4294967295)
-
字符串:varchar;
范围(0~65533) 、一个字母或一个中文点一个字符,例如:varchar(3) 表示最多存3个字符
-
小数:decimal
示例:decimal(5, 2),表示该字段可以存5位数,其中小数位数为2,整数为3
-
时间日期:datetime
范围(1000-01-01 00:00:00 ~ 9999-12-31 23:59:59),示例: 2021-01-01 12:29:59
数据约束
-
数据约束主要是指对数据库中数据进行限制,以确保数据的正确性、有效性、一致性。
-
常见数据约束有:
主键(primary key):物理上存储的顺序
非空(not null):此字段不允许填写空值
惟一(unique):此字段的值不允许重复
默认值(default):当不填写此值时会使用默认值,如果填写时以填写为准
DBeaver操作MySQL
目标:重点掌握数据库创建。日常工作中创建表和数据操作,更多使用SQL语句完成。
-
操作数据库(记得选择编码格式为--utf-8)
-
操作数据表
-
选择正确的数据库,点击右键创建表
-
设计完表之后,先保存,然后再弹出框中选择"执行"按键,才能完成表的创建
-
命令操作数据库
- 查看所有数据库:show databases;
- 使用数据库:use 数据库名;
- 查看当前使用数据库:select database();
- 创建数据库:create database 数据库名 charset=utf8;
- 删除数据库:drop database 数据库名;
命令操作数据库表
-
创建表语法格式:
create table 表名(
字段名称1 数据类型1,
字段名称2 数据类型2,
字段名称3 数据类型3
...... ......
);
-
删除表语法格式:
drop table if exists 表名;
或者:
drop table 表名;
-
查看当前数据库所有的表:show tables;
-
查看表结构:desc 表名;
数据增删改查
数据增加语法格式
-
全字段增加数据(主键自增长,可以用0或null代替)
insert into 表名 values(…);
-
选择字段添加
insert into 表名 (字段1, 字段2, …) values(值1, 值2, …);
-
添加多行数据
insert into 表名 (字段1, 字段2, …) value (值1, 值2, …);
insert into 表名 (字段1, 字段2, …) value (值1, 值2, …);
或者
insert into 表名 (字段1, 字段2, …) values (值1, 值2, …), (值1, 值2, …) ...
删除数据语法格式
-
delete(删除表中某一部分记录,自增长字段不会被删除)
delete from 表名 where 条件
-
Truncate(删除数据时,表结构会保留,自增长字段会被删除,新增数据自增长字段从1开始。执行效率低于drop命令)
truncate table 表名
修改数据语法格式
- update 表名 set 字段名1=值1,字段名2=值2... where 条件
查询数据语法格式
查询部分字段数据
select 字段1,字段2,... from 表名
去重查询
select distinct 字段1,... from 表名
条件查询
select 字段1,字段2... from 表名 where 条件;
where支持多种运算符进行条件处理
-
比较运算(等于:=,大于:>,小于:<,大于等于:>=,小于等于:<=,不等于:!=或<>)
select 字段 from 表名 where 字段 比较运算符 值;
例1:查询小乔的年龄
select age from students where name='小乔';
例2:查询20岁以下的学生
select * from students where age<20;
例3:查询家乡不在北京的学生
select * from students where hometown!='北京';
-
逻辑运算(且:and,或:or,非:not)
例1:查询年龄小于20且性别为女的学生信息
select * from students where age<20 and sex='女';
例2:查询女学生或1班的学生信息
select * from students where sex='女' or class='1班';
例3:查询家乡不在北京的学生信息
select * from students where not hometown='北京';
-
模糊查询(关键字: like; % :匹配任意多个字符;_ : 匹配一个任意字符)
例1:查询姓孙的学生
select * from students where name like '孙%';
例2:查询姓孙且名字是一个字的学生:
select * from students where name like '孙_';
例3:查询姓名以‘乔’结尾的学生
select * from students where name like '%乔';
例4:查询姓名中包含‘白’的学生
select * from students where name like '%白%';
-
范围查询(in表示在一个非连续的范围内,between ... and ...表示在一个连续的范围内)
例1:查询家乡是北京或上海或广东的学生
select * from students where hometown in('北京','上海','广东');
例2:查询年龄为18至20的学生
select * from students where age between 18 and 20;
-
空判断(判断为空:is null;判断非空:is not null,Mysql中空表示null,与 ”空“是不一样的)
例1:查询没有填写身份证的学生
select * from students where card is null;
例2:查询填写了身份证的学生
select * from students where card is not null;
-
排序查询语法格式:
select * from 表名 order by 字段名1 asc, 字段名2 asc,......;
或
select * from 表名 order by 字段名1 desc, 字段名2 desc,......;
- 将行数据按照字段1进行排序,如果某些字段1的值相同时,则按照字段2排序,以此类推
- 默认按照列值从小到大排列
- asc从小到大排列,即升序
- desc从大到小排序,即降序
例1:查询所有学生信息,按年龄从小到大排序
select * from students order by age;
例2:查询所有学生信息,按年龄从大到小排序,年龄相同时,再按学号从小到大排序
select * from students order by age desc,studentNo;
-
聚合函数(count(*):查询总记录数;max(字段名):查询最大值;min(字段名):查询最小值;sum(字段名):求和;avg(字段名):求平均值)
例1:查询学生总数
select count(*) from students;
例2:查询女生的最大年龄
select max(age) from students where sex='女';
例:查询1班的最小年龄
select min(age) from students WHERE class = '1班';
示例:查询北京学生的年龄总和
select sum(age) from students where hometown='北京';
例:查询女生的平均年龄
select avg(age) from students where sex='女';
-
分组查询语法格式:
select 字段1,字段2,聚合函数... from 表名 group by 字段1,字段2...
- 按照字段分组,此字段相同的数据会被放到一个组中
- 分组的目的是对每一组的数据进行统计(使用聚合函数)
例1:查询各种性别的人数
select sex,count(*) from students group by sex;
例2:查询各种性别年龄最大的
select sex,max(age) from students group by sex;
例3:查询各个班级的人数
select class,count(*) from students group by class;
例4:查询各个班级中不同性别的人数
select class,sex,count(*) from students group by class,sex;
-
分组后的数据筛选语法格式:
select 字段1,字段2,聚合... from 表名 group by 字段1,字段2,字段3...having 条件
- 关键字having后面的条件运算符与where的相同
例1:查询男生总人数
方案一:select count(*) from students where sex='男'
方案二:select sex,count(*) from students group by sex having sex=‘男’
例2:查询每个班级男生的总记录数
select class,sex,count(*) from students group by class,sex having sex='男';
例3:查询所有班级中不同性别的人数大于1的记录数
select class,sex,count( ) from students group by class,sex having count( ) >1;
having与where对比
- where 是对 from 后面指定的表进行数据筛选,属于对原始数据的筛选。
- having 是对 group by 的结果进行筛选。
- having 后面的条件中可以用聚合函数,where后面不可以。
-
分页-获取部分数据语法格式:
select * from students limit (n-1)*m, m
- Limit典型应用场景是分页查询:
- n表示显示第几页的数据
- m表示每页显示多少条数据
连接查询
-
内连接
连接两个表时,连接的是两个表中都存在的数据。(取交集)
-
语法格式
select * from 表1
inner join 表2 on 表1.列=表2.列 ;
或者
select * from 表1,表2 where 表1.列=表2.列 ;
例1:查询学生信息及学生的成绩
方式一:Select * from students stu inner join scores sc on stu.studentNo = sc.studentNo ;
方式二:select * from students stu, scores sc where stu.studentNo = sc.studentNo ;
例2:查询课程信息及课程的成绩
select * from courses cs inner join scores sc on cs.courseNo = sc.courseNo ;
例3:查询王昭君的成绩,要求显示姓名、课程号、成绩
select stu.name, sc.courseNo, sc.score from students stu ;
inner join scores sc on stu.studentNo = sc.studentNo where stu.name = '王昭君';
-
左连接
连接两个表时,连接的是两个表匹配到的数据加左表特有的数据,对于右表中不存在的数据,用null来填充
-
语法格式
select * from 表1
left join 表2 on 表1.列=表2.列 ;
例1:查询所有学生的成绩,包括没有成绩的学生
select * from students stu left join scores sc on stu.studentNo = sc.studentNo ;
例2:查询所有学生的成绩,包括没有成绩的学生,需要显示课程名
select * from students stu
left join scores sc on stu.studentNo = sc.studentNo
left join courses cs on cs.courseNo = sc.courseNo;
-
右连接
连接两个表时,连接的是两个表匹配到的数据加右表特有的数据,对于左表中不存在的数据,用null来填充
-
语法格式
select * from 表1
right join 表2 on 表1.列=表2.列 ;
例1:查询所有学生的成绩,包括没有成绩的学生
select * from scores sc right join students stu on stu.studentNo = sc.studentNo ;
例2:查询所有学生的成绩,包括没有成绩的学生,需要显示课程名
select * from scores sc
right join courses cs on cs.courseNo = sc.courseNo
right join students stu on stu.studentNo = sc.studentNo;
自关联
- 所谓自关联是指,一个数据表中的某个字段关联了该数据表中的另外一个字段。
- 自关联:inner join 关联同一个表,不同的字段。
- 自关联要用别名
例1:查询河南省所有的市
Select * from areas as a1
inner join areas as a2 on a1.aid=a2.pid
where a1.atitle='河南省';
例2:查询郑州市的所有的区
Select * from areas as a1
inner join areas as a2 on a1.aid=a2.pid
where a1.atitle='郑州市';
例3:查询河南省的所有的市区
Select * from areas as a1
inner join areas as a2 on a1.aid=a2.pid
left join areas as a3 on a2.aid=a3.pid
where a1.atitle='河南省' ;
子查询
-
查询语句充当条件/充当数据源
充当条件
例1:查询王昭君的成绩,要求显示成绩(标量子查询)
select score from scores where studentNo = (select studentNo from students where name = '王昭君
') ;
例2:查询18岁的学生的成绩,要求显示成绩(列子查询)
select score from scores where studentNo in (select studentNo from students where age=18) ;
例3:查询和王昭君同班、同龄的学生信息(行子查询)
select * from students where (class,age)=(select class,age from students where name='王昭君') ;
充当数据源
例1:查询数据库和系统测试的课程成绩
Select * from scores s inner join (select * from courses where name in ('数据库
','系统测试')) c on s.courseNo = c.courseNo;