数据库入门

145 阅读11分钟

数据库入门

什么是数据库

数据库:是指长期存储在计算机内、有组织的数据集合。简而言之,数据库就是一个存储数据的地方。

数据库分类-关系型数据库

将数据间的关系以数据库表的形式加以表达,并将数据存储在表格中,以便于查询。

常用关系型数据库:
  • 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)

image-20230917150347366.png

  • 操作数据表

    • 选择正确的数据库,点击右键创建表

    • 设计完表之后,先保存,然后再弹出框中选择"执行"按键,才能完成表的创建

    image-20230917150449505.png

命令操作数据库
  • 查看所有数据库: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;