数据库

本文介绍了数据库的基础知识,重点讲述了关系型数据库SQL语言,包括DQL、DML、TPL、DCL和DDL。此外,详细讲解了MySQL数据库的使用,如数据类型和约束、多表关联查询、数据分析中的SQL技巧,如显示行号、分组排序、小算法实现等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、数据库介绍

  1. 在python基础班,想要把数据做到永久储存,使用的是文件;数据库也是做永久存储的。
  2. 数据库分类:关系型数据库(以二维表格形式存储数据);非关系行数据库即nosql(以key-value的方式存储)
    数据库是用来管理和存储数据的。读写速度比文件快。
  3. 如果想使用数据库,就需要安装数据库管理系统(就是一个应用软件)。例如想要使用mysql数据库,就要安装mysql数据库管理系统
    关系型数据库管理系统分为:
    关系型数据库服务端软件:用来管理多个数据库,各个数据库都有多个数据文件…
    关系型数据库客户端软件:用来跟服务端软件进行通信,获取服务端的数据
    在这里插入图片描述
    说明:关系型数据库分为服务端和客户端,那么底层通信使用的是TCP协议

二、关系型数据库的语言:SQL

SQL(Structured Query Language)是结构化查询语言,是一种用来操作RDBMS(即关系型数据库)的数据库的语言。用来实现数据库客户端和服务端的通信。
SQL语言主要分为:
DQL:数据查询语言,用于对数据进行查询,如select
DML:数据操作语言,对数据进行增加、修改、删除,如insert、update、delete

TPL:事务处理语言,对事务进行处理,包括begin transaction、commit、rollback-----(事务可以理解为一个团体,这个团体是要么都执行,要么都不执行)
DCL:数据控制语言,进行授权与权限回收,如grant、revoke-----(是对用户权限进行设置,例如该用户对这张表只能查询,对另一张表可以进行增删改等。)
DDL:数据定义语言,进行数据库、表的管理等,如create、drop

三、mysql数据库:

多表关联:多张表通过相同的字段关联
多表关联一定是左表的每条数据都和右表的每条数据进行对比,满足条件的按照要求保留(如inner join 则是两边表都有该字段的才保留,left join则是左边的表内容都表里,右边的表包含坐标中关系字段的才保留)
在这里插入图片描述
需求:学生在生日当天放假,查出考试安排冲突的情况
方法一:
select a.user_id,a.name,b.course,b.test from user a inner join test b on a.user_id=b.user_id where a.birth=b.test_date;
方法二:可以将条件一起写在on条件里
select a.user_id,a.name,b.course,b.test from user a inner join test b on a.user_id=b.user_id and a.birth=b.test_date;
注意
5. on条件一定只能是等于=,如果条件是不等于、大于之类的都不能放在on条件里
6. join … on … 等价于 inner join … on …

MySQL

MySQL是一个关系型数据库管理系统
使用MySQL系统,需要安装服务端和客户端

sudo apt-get install mysql-server     #服务端安装命令(ubantu)
sudo apt-get install mysql-client    #命令行客户端mysql的安装
apt-cache show mysql-server  #显示MySQL服务端安装包信息效果图

在这里插入图片描述
查看MySQL服务效果图:

ps -aux | grep myslq 
	ps 查看当前系统中的进程
	-a 表示所有用户
	-u 表示显示用户名
	-x 表示显示所有的执行程序

在这里插入图片描述
mysql终端命令

sudo service mysql status   #查看MySQL服务状态
sudo service mysql stop     #停止MySQL服务
sudo service mysql start   #启动MySQL服务
sudo service mysql restart   #重启MySQL服务

MySQL配置文件的介绍:
配置文件路径为: /etc/mysql/mysql.conf.d/mysqld.cnf
主要配置信息说明:

port表示端口号,默认为3306
bind-address表示服务器绑定的ip,默认为127.0.0.1
datadir表示数据库保存路径,默认为/var/lib/mysql
log_error表示错误日志,默认为/var/log/mysql/error.log

数据类型和约束

常用数据类型如下:

整数:int,bit
小数:
	decimal-----浮点数,如 decimal(5, 2) 表示共存5位数,小数占 2.
字符串:
	varchar:小型数据,表示可变长度的字符串,如varchar(3),填充'ab'时就会存储'ab'3表示字符数;使用场景:姓名、地址、品牌、型号
	char:小型数据,表示固定长度的字符串,如char(3),如果填充'ab'时会补一个空格为'ab '3表示字符数;	使用场景:身份证号、手机号、电话、密码
	text:可变长度,表示存储大文本,当字符大于 4000 时推荐使用, 比如技术博客.
日期、时间:
	date:	'2020-01-01'
	time: 	'12:29:59'
	datetime:	'2020-01-01 12:29:59'
	YEAR:	'2017'
	TIMESTAMP:'1970-01-01 00:00:01' UTC ~ '2038-01-01 00:00:01' UTC	
枚举类型(enum)

**对于图片、音频、视频等文件**不存储在数据库中,而是上传到某个服务器上,然后在表中存储这个文件的保存路径.

常见的约束

主键 primary key: 物理上存储的顺序. MySQL 建议所有表的主键字段都叫 id, 类型为 int unsigned.
非空 not null: 此字段不允许填写空值.
惟一 unique: 此字段的值不允许重复.
默认 default: 当不填写字段对应的值会使用默认值,如果填写时以填写为准.
外键 foreign key: 对关系字段进行约束, 当为关系字段填写值时, 会到关联的表中查询此值是否存在, 如果存在则填写成功, 如果不存在则填写失败并抛出异常.

mysql客户端的使用

1,客户端需要先连接服务端:登录数据库

mysql -uroot -p        #连接服务端,登录数据库
	-u: 表示MySQL服务端的用户名
	-p: 表示MySQL服务端的密码
quit 或者 exit 或者 ctr + d        #表示登出(退出)数据库
**数据库操作的SQL语句**
select now();       #显示当前时间
show databases;      #查看所有数据库
create database 数据库名 charset=utf8;   #创建数据库
use 数据库名;      #使用数据库
select database();     #查看当前使用的数据库
drop database 数据库名;   #删除数据库-慎重
**表结构操作的SQL语句**
show tables;    #查看当前数据库中所有表



**创建表**
create table 表名(
字段名称 数据类型  可选的约束条件,
column1 datatype contrai,
...
);
	例如:
	create table students(
	 id int unsigned primary key auto_increment not null,
	 name varchar(20) not null,
	 age tinyint unsigned default 0,
	 height decimal(5,2),
	 gender enum('男','女','人妖','保密')
	);

二. 数据分析中的mysql使用

1.显示行号

本质是:为当前表格增加一列(该列显示行号),增加的一列需要使用会话变量进行命名

会话变量定义和赋值:
select @名字:=值(或者表达式)
set @名字:=值(或者表达式)
存在的问题:会话变量初始值没有定义,则默认是null,遍历后结果均为null---->
解决:定义初始值:
方法一:先增加新列(定义初始值列),以增加新列后的表作为查询表进行操作

select *,@rownum:=@rownum+1 from products a,(select @rownum:=1) b order by p_view 

方法二:提前定义好会话变量的初始值

set @rownum=1;
select *,@rownum:=@rownum+1 from products order by p_view 

方法三:使用IFNULL(expr1,expr2)函数,表示如果返回值是null则返回@rownum:=1 ,如果不是则返回@rownum:=@rownum+1 (存在问题,运行一次rownum就会更改,只有第一次的初始值为1)

select *,ifnull(@rownum:=@rownum+1,@rownum:=1) from products order by p_view

2. 分组后在分组内排序(加行号)

本质:先进行排序,先按照类别排序(将同类放一起;再按点击数排序),然后对排序后的表的每组添加行号
难点:对每组分别写行号,需要判断当前的行跟上一行是不是同类,同类行号+1;不同类行号从1重新开始,
解决:定义新的会话变量,初始值为null,进行if判断,之后定义会话变量=当前行的类别值,然后进行遍历查询

SELECT *,if(@pt=p_type,@rownum:=@rownum+1,@rownum:=1),@pt:=p_type 
FROM 
(select * from products a order by a.p_type desc, a.p_view desc) a,(select @rownum:=0,@pt:=null) b 
# 注意:不是对同类分组,因为分组返回的结果同一组只会显示一个,不会全部显示信息

3. 纯SQL也能实现小算法(辅助决策)计算商品评分、及时补货

4. mysql中自连接的使用

5. 不等连接

6. 删除重复数据

7. 有重复数据不插入或更新的处理方法

8. update表子查询、多条件判断

9. 利用order by 实现"排名作弊"

10. 获取连续签到X天用户列表— 百度面试题

11. 子查询去重、获取商品分类最新销售情况

12. 多表关联update(用户积分奖励)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值