数据库笔记

文章最后更新时间:2024-10-25 20:11:29某些文章具有时效性,若有错误或已失效,请在下方 留言或联系 梦幻屋

数据定义语言,用来定义数据库对象(数据库,表,字段)

全称

🥰MySQL概述

|名称|全称|简称| |-|-|-| |数据库|是存储数据的仓库,数据是有组织的进行存储|Database(DB)| |数据库管理系统|超纵和管理数据库的软件|Database Management System(DBMS)| |SQL|操作关系型数据库的编程语言,定义了一套操作数据库的统一标准|Structured Query Language(SQL)|

Mysql逻辑结构

数据库笔记-梦魂博客

关系型数据库(RDBMS)

概念 建立在关系模型基础上,由多张相互的二维表组成的数据库

特点

  • 1.使用表存储数据,格式统一,便于维护
  • 2.使用SQL语言操作,标准统一,使用方便

🥰SQL

sql通用语法

  1. SQL语句可以单行或多行书写,以分号结尾。
  2. SOL语句可以使用空格/缩进来增强语句的可读性。
  3. MySOL数据库的SOL语句不区分大小写,关键字建议使用大写。
  4. 注释:
  • 单行注释:–注释内容 或 # 注释内容(MySQL特有)
  • 多行注释:/*注释内容 */

DDL (Data Definition Language)数据定义语言,用来定义数据库对象(数据库,表,字段)

  • 用于完成对数据库对象(数据表)进行管理

DDL-数据库操作

|代码|说明| |-|-| |SHOW DATABASES;|查询所有数据库| |SELECT DATABASE();|查询当前数据库| |CREATE DATABASE ;|创建数据库| |DROP DATABASE 名称;|删除数据库 | |use 数据库名;|使用当前数据库|

DDL-表操作

|代码|说明| |-|-| |show TABLES;|查询当前数据库表所有表| |DESC 表名;|查询表结构| |show CREATE TABLE NIEYU|查询指定表的建表语句| |ALTER TABLE cs RENAME to nieyu|修改数据表-表名| |alter table <表名>int set utf8|修改数据表-字符集| |alter table <表名> add <创建的表> vachar ALTER TABLE nieyu789 add COLUMN char;|添加数据表字段(列) | |ALTER TABLE <表名>CHANGE <> int|修改字段的列表和类型| |ALTER TABLE <表名>MODIFY qq varchar(400);|只修改字段类型| |ALTER TABLE <表名>drop qq ;|删除字段|

##创建数据表
##not null:这意味着该列不能包含 NULL 值,必须始终包含有效的数据。
##unique:表示该列的值在整个列中必须是唯一的,不允许重复值存在。

CREATE TABLE cs_1(
qq int not null UNIQUE
); 

DDL-表操作-数据类型

|数据类型|描述| |-|-| |INT|整数类型,可存储带符号的整数,包括整数和零| |TINYINT|小整数类型,范围为-128到127| |SMALLINT|短整数类型,范围为-32768到32767| |MEDIUMINT|中等整数类型,范围为-8388608到8388607| |BIGINT|大整数类型,范围为-9223372036854775808到9223372036854775807| |FLOAT|单精度浮点数类型,用于存储小数值| |DOUBLE|双精度浮点数类型,用于存储较大或较精确的小数值| |DECIMAL|用于存储精确的小数值,指定精度和小数位数| |CHAR|字符串类型,固定长度,最多255个字符| |VARCHAR|字符串类型,可变长度,最多65535个字符| |TEXT|长文本字符串类型,可存储最大长度为65535个字符| |BLOB|二进制大对象类型,可存储最大长度为65535个字节| |DATE|日期类型,格式为YYYY-MM-DD| |TIME|时间类型,格式为HH:MM:SS| |DATETIME|日期和时间类型,格式为YYYY-MM-DD HH:MM:SS| |TIMESTAMP|时间戳类型,用于存储自动更新的日期和时间| |ENUM|枚举类型,允许定义一组可能的值| |SET|集合类型,允许定义一组可能的值|

字段约束

在创建数相果的时候,指定的对数据表的列的教理限制性的费说《对表的列中的教泥进行限利)为什么要给表中的列添加约京呢?

  • 保证收是的有效性
  • 保证数据的完整性
  • 保证数据的正确性

字段常见的约束有哪些呢?

  • 非空约束(not Null):限制此列的值必须提供,不能为null
  • 唯一约束(unique):在表中的多条数据,此列不能重复
  • 主键约束(primary key):非空+唯一,能够唯一标识数据中的一条数据
  • 外键约束(foreign key):建立不同表之间的关联关系

非空约束

限制数据表中此列数据必须提供

CREATE TABLE cs_1(
qq int not null
); 

唯一约束

在列表多列中,不能出现相同的

CREATE TABLE cs_1(
qq int UNIQUE
); 

主键约束

主键就是数据表中记录的唯一标识,在一张表中只能有一个主键(主键可以是一个列,也可以是多个列的组合).

当一个字段声明为主键之后,添加数据时

此字段不能为空值

此字段不能为重复值
##第一种
CREATE TABLE cs_1(
qq int primary key
); 
##第二种
CREATE TABLE cs_1(
qq int 
primary key(qq)
); 
ALTER TABLE <表名> DROP PRIMARY KEY
ALTER TABLE <表名> MODIFY data_ny int PRIMARY KEY

定义主键自动增长

在我们创建一张数据表时,如果数据表中有列可以作为主键(例如:学生表的学号、图书表的isbn)我们可以直接这是这个列为主键;当有些数据表中没有合适的列作为主键时,我们可以额外定义一个与记录本身无关的列(ID)作为主键,此列数据无具体的含义主要用丁标识一条记录,在mysql中我们可以将此列定义为int,同时设置为自动增长,当我们向数据表巾新增一条记录时,无需提供ID列的值,它会自动生成。

定义int类型字段自动增长auto_incremen

CREATE TABLE cs_01(
id int PRIMARY KEY auto_increment,
qq int not null
);

自动增长是从1开始的,每添加一个记录,自动增长的列会加1,当我们把某个记录删除之后再添加数据,自动增长的数据也不会重复生成(自动增长只保证唯一性,不保证连续性 )

联合主键

联合主键-将数据表中的多列组合在一起设置为表的主键

CREATE TABLE cs_01(
id int,
qq int not null,
wx int,
PRIMARY KEY (qq,wx)
);

注意:在实际上企业项目的数据库设计中,联合主键使用频率不高

DML (Data Manipulation Language)数据操作语言,用来对数据库表中的数据进行增删改

用于完成对数据表中数据的插入,删除,修改操作

插入数据

##向数据表中指定的列添加数据(不允许为空的列必须提供数据)
INSERT INTO nieyu (data_ny,data_y) 
VALUES(20,30)
##数据表名的字段名列表顺序可以不予表中一致,但是Values中的值顺序必须与字段名顺序对应
##当向表中所有列添加数据时,数据表名后面的字段可以省略,但是values的值顺序要与数据表定义的字段保持一致
##不过在项目中,即使要向所有列添加数据,也建议将列名的列表方式显示出来(增强sql的稳定性)

删除数据

##从数据表中删除满足特定条件(所有)的数据
DELETE FROM nieyu789 WHERE qq<20
DELETE FROM nieyu789 WHERE qq=20
##如果删除语句里面没有where,则是删除整个数据表(敏感操作)
DELETE FROM nieyu789

修改数据

对数据表已添加的数据进行修改

##修改单个
UPDATE nieyu789 SET wx=110 WHERE zfb=987
##修改两个
UPDATE nieyu789 SET wx=110,qq=120 WHERE zfb=987
##修改多列
UPDATE nieyu789 SET wx=110,qq=120,ax=126,wqeq=789,WHERE zfb=987
##如果update里面没有wihere语句,则表示将那一列全部改成123
updata nieyu789 set qq=123
##修改单个
UPDATE nieyu789 SET wx=110 WHERE zfb=987
##修改两个
UPDATE nieyu789 SET wx=110,qq=120 WHERE zfb=987
##修改多列
UPDATE nieyu789 SET wx=110,qq=120,ax=126,wqeq=789,WHERE zfb=987

DQL(Data Query Language)数据查询语言,用来查询数据库中表的记录

从数据表中提取满足特定的记录

单表查询

多表联合查询

基础查询语法

##单个
SELECT 字段1,字段2,字段3 FROM 表名
##开发尽量不要带*
SELECT * FROM 表名;
//SELECT后指定要查询的哪些列
SELECT wx FROM nieyu789
##多个
SELECT wx,qq,zfb FROM nieyu789
##全部列查看可以用*号代替字段名
SELECT * FROM nieyu789

设置别名

SELECT 字段1[AS 别名1],字段2[AS 别名2],字段3[AS 别名3].... FROM nieyu789

  select id as '无语' from user

去除重复记录

SELECT DISTINCT 字段列表  FROM 表名;

条件查询where子句

//在删除修改及查询的语句后都可以添加where子句(条件)用于筛选满足特定的添加数据进行删除,修改及查询操作
//= 等于
SELECT * FROM nieyu789 WHERE wx=110
//!=&<>不等于 两种写法
SELECT * FROM nieyu789 WHERE wx!=110 & SELECT * FROM nieyu789 WHERE wx<>110
//> 大于
SELECT * FROM nieyu789 WHERE wx>110
//< 小于
SELECT * FROM nieyu789 WHERE wx<110
//>=
SELECT * FROM nieyu789 WHERE wx>=110
//<=
SELECT * FROM nieyu789 WHERE wx<=110
//判断有空值
SELECT * FROM nieyu789 WHERE is null;
//判断没有空值
SELECT * FROM nieyu789 WHERE is not null;
//查询年龄在多少岁到多少岁之间的年龄,并且关系 && 一般用and
SELECT * FROM nieyu789 WHERE age>=15 && age<=20;
//between后面接的是最小值,and后面接的是最大值
SELECT * FROM nieyu789 WHERE between 15 and 20;
//or 是或  查询年龄等于18或20或40
SELECT * FROM nieyu789 WHERE age=18 or age=20 or age=40;


//查询姓名是两个字的员工
SELECT * FROM nieyu789 WHERE name like '--';
//查询身份证后面有x的员工信息
SELECT * FROM nieyu789 WHERE idcard like '%x';

多条件查询

在where子句中,可以将多个条件通过逻辑运算符(and, or, not)进行连接,通过多个条件来筛选要操作的数据

聚合函数

1.介绍:将一列数据作为一个整体,进行纵向计算

2.常见的聚合函数

|函数|功能| |-|-| |count|统计数量| |max|最大值| |min|最小值| |avg|平均值| |sum|求和| |||

注意:所有null值不参与聚合函数的运算

//统计该员工的数量
SELECT count(*) FROM nieyu789;   
SELECT count(id) FROM nieyu789; 

//统计该企业员工的平均年龄
SELECT avg(age) FROM nieyu789; 

//统计该企业员工的最大年龄
SELECT max(age) FROM nieyu789; 

//统计该企业员工的最小年龄
SELECT min(age) FROM nieyu789; 

//统计西安地区员工的年龄之和
SELECT sum(age) FROM workaddress='西安'; 

分组查询

1.语法

SELECT 字段列表 FROM 表名[where 条件] GROUP BY 分组字段名 [HAVING 分组后过滤条件]

where和having的区别

–执行时机不同:where是分组之前进行过滤,不满足where条件,不参与分组,而having是分组之后对接过进行过滤

–判断条件不同,where不能对聚合函数进行判断,二having可以

//根据性别分组,统计男性员工 和 女性员工的数量
SELECT gender,count(*) FROM nieyu GROUP BY gender

//根据性别分组,统计男性员工 和 女性员工的平均年龄
SELECT gender,avg(age) FROM nieyu GROUP BY gender

//查询年龄小于45的员工,并根据工作地址分组,获取员工数量大于3的工作地址
SELECT workaddress,count(*) from emp where age<45 group by workaddress having count(*)>=3;

总结

–执行顺序:where > 聚合函数>having

–分组之后,查询的字段一般为聚合函数和分组,查询其他的字段无任何意义

排序查询

select 字段列表 from 表名 order by 字段 排序方式1,字段2,排序方式2

2.派逊方式

–asc:升序(默认值)

–desc:降序

注意:如果是多字段排序,当第一个字段值相同的时,才会根据第二个字段进行排序

//升序
select * from nieyu order by age
select * from nieyu order by age asc
//降序
select * from nieyu order by desc
//根据年龄对公司的员工进行升序,年龄相同,再按照入职时间进行降序排序
select * from nieyu order by age asc , entrdata desc;

分页查询

select 字段列表 from 表名 limit 起始索引,查询记录数

注意

–起始索引从0开始,起始索引=(查询索引-1)*每页显示记录数据

–分页查询是数据库的方言,不同的数据库有不同的实现,MySQL中是limit

–如果查询的是第一页数据,起始索引可以省略,直接谢伟limit 10

(页码-1)*页展示记录数

查询第一页员工数据,每页展示10条记录
select * from nieyu limit 0,10;
select * from nieyu limit 10;
查询第二页员工数据,每页展示10条记录
select * from nieyu limit 10,10; 

DQL执行顺序

数据库笔记-梦魂博客

DCL(Data Control Language)数据控制语言,用来创建数据库用户、控制数据库的访问权限

DCL用户管理

create  user  '用户名'@'主机名' identified  by '密码';
create user 'nieyu'@'localhost' identified by '123456';
create user '用户名'@'主机名改成%' identified by '密码';
create user 'heima'@'%' identified by '123456';
alter user '用户名'@'主机名' identified with  mysql_native_password by '新密码';
drop user 'heima'@'%';

注意:

— 主机名可以使%通配

— 这类sql开发人员操作的比较少,主要是DBA(database administrator 数据管理员)使用

DCL权限控制

mysql 中定义了很多种权限,但是常用的就以下几种

数据库笔记-梦魂博客
show grants for '3523864713'@'locahost'
grant all on cs_01.* to'3523864713'@'locarhost';
revoke all on cs_01.* from '3523864713'@'%'

函数

函数是指一段可以直接被另一段程序调用的程序或代码

字符串函数

数据库笔记-梦魂博客
// 字符串拼接
select concat('hell','worrd')
//字符串全部转为小写
select lower('Hell')
//字符串全部转为大写
select upper('Hell')
//左填充
select lpad('01',3,'+')
//右填充
select rpad('01',3,'-')
//去除字符串头部和尾部的空格
select trlm('01',3,'-')          
//返回从字符串str从谁有start位置起的len个长度的字符串
select substring('hello word',1,5)      

数值函数

常见数值函数

数据库笔记-梦魂博客
--向上取整
select ceil(1.1)
--向下取整
select floor(1.0)
-- 求模运算  求余
select mod(0,1)
--求随机数
select rand(0,1)
--四舍五入的值,保留y为小数
select round(2.145,2)
通过数据库的函数,生成一个六位数的随机验证码,
select lpad(round(rand()*100000,0),6,'0');

日期函数

数据库笔记-梦魂博客
-- 返回当前日期
select curdate();
-- 返回当前时间
select curtime();
-- 返回当前日期和时间
select now();
-- 获取指定data的年份
select year(now());
-- 获取指定data的月份
select month(now());
-- 获取指定data的日期
select day(now());
-- 返回一个日期/时间值增加上一个时间间隔expr后的时间值
select date_add(now() ,interval 70 day );
-- 返回起始时间data1和结束时间data2之间的天数   第一个时间减去第二个时间
select datediff('2025-12-6' ,'2025-10-11' );
//查询所有员工入职天数,并根据入职天数进行倒序排序
select name,datediff(curdata(),entrdata)as 'entrydata' from emp order by entrdays desc;

流程函数

数据库笔记-梦魂博客
-- 流程函数
    -- if
    select if(false ,'123','456');

    -- ifnull
    select ifnull('ok','no');
    select ifnull('','no');
    select ifnull(null,'no');

    -- case
        -- case when then else end
    select name,
        (case workaddress when '北京' ther '一线城市' else '二线城市' end)
        from emp; 

多表查询

多表关系

— 一对多(多对一)

案例:部门与员工的关系

关系:一个部门对应多个员工,一个员工对应一个部门

实现:在多的一方建立外键,指向一的一方的主键

— 多对多

案例:学生与课程的关系

关系:一个学生可以选修多门课程,一门课程也可以提供多个学生选择

实现:建立第三张中间表,中间表至少包含两个外键,分别关联两方主键

— 一对一

案例:用户 与 用户详情的关系

关系:一对一关系,多用与单表拆分,将一张表的基础字段放在一张表中,其他详情字段放在另一张表中,已提升操作效率

实现:在任意一方加入外键,关联另一方的主键,并且设置外键为唯一的(UNLQUE)

多表查询概述

概述:指从多张表中查询数据

笛卡尔积:笛卡尔乘积是指在数学中,两个集合a和集合b的所有组合情况.(在多表查询时,需要消除无效的笛卡尔积)

select * from emp, nieyu where emp.dep_id=dep.id;

多表查询的分类

连接查询

内连接:相当于查询A,B交集部分数据

外连接:

左外连接:查询左表所有数据,以及两张表交集部分数据

右外连接:查询右表所有数据,以及两张表交集部分数据

自连接:当前表与自身的连接查询,自连接必须使用表的别名

内连接

-- 
-- 隐式内连接
    -- 查询每个员工的姓名,及关联的部门名称(隐式内连接实现)
    select 字段列表 from 表一,表二 where 条件;

显式内连接

select 字段列表 from 表一[inner] join,表二 on 连接条件;
select 字段列表 from 表一 join,表二 on 连接条件;

外连接

select 字段列表 from 表一 left join,表二 on 连接条件;
select 字段列表 from 表一 rlght join,表二 on 连接条件;

自连接

自连接的时候必须给表起别名

select 字段列表 from 表一 别名A rlght join,表一 别名B on 连接条件;

联合查询

对于union查询,就是把多次查询结果合并起来,形成一个新的查询结果集

select 字段列表 from 表A ...
union[all]
select 字段列表 from 表B ...

对于联合查询的多张表的列数必须保持一致,字段类型也需保持一致.

union all 两个表合并

union 合并去重

子查询

概念

sql语句中嵌套select语句,称为嵌套查询,又称子查询

select * from t1 where couuml=(select column from t2);

子查询外部的语句可以是insert/uodata/delete/select的任何一个

根据子查询结果不听,分为

标量子查询(子查询结果为单个值)

子查询返回的结果是单个值(数字,字符串,日期等),最简单的形式,这种查询成为标量子查询

常用的操作符号:= <> > ≥ < ≤

![Snipaste_2024-05-29_15-30-13.png](https://tc-cdn.flowus.cn/oss/8689f099-1aab-47c7-9860-df1b602aaf55/Snipaste_2024-05-29_15-30-13.png?time=1729857600&token=358ada77fbebe0f9f60e03ee0f9e98d23e3be9813487589be50ce27df8b8b259&role=free)

列子查询(子查询结果为一列)

子查询返回的结果是一列(可以是多行),这种子查询叫做列子查询

常用的操作符号: in,not in,any,some,all

数据库笔记-梦魂博客
数据库笔记-梦魂博客
数据库笔记-梦魂博客

行子查询(子查询结果为一行)

子查询返回的结果是一行(可以是多列),正在子查询叫做行子查询

常用的操作符号:=, <>,in,not in

数据库笔记-梦魂博客

表子查询(子查询结果为多行多列)

常用的操作符:in

数据库笔记-梦魂博客

多表查询案例

事务

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容