数据定义语言,用来定义数据库对象(数据库,表,字段)
全称
🥰MySQL概述
|名称|全称|简称| |-|-|-| |数据库|是存储数据的仓库,数据是有组织的进行存储|Database(DB)| |数据库管理系统|超纵和管理数据库的软件|Database Management System(DBMS)| |SQL|操作关系型数据库的编程语言,定义了一套操作数据库的统一标准|Structured Query Language(SQL)|
Mysql逻辑结构
关系型数据库(RDBMS)
概念 建立在关系模型基础上,由多张相互的二维表组成的数据库
特点
- 1.使用表存储数据,格式统一,便于维护
- 2.使用SQL语言操作,标准统一,使用方便
🥰SQL
sql通用语法
- SQL语句可以单行或多行书写,以分号结尾。
- SOL语句可以使用空格/缩进来增强语句的可读性。
- MySOL数据库的SOL语句不区分大小写,关键字建议使用大写。
- 注释:
- 单行注释:–注释内容 或 # 注释内容(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
暂无评论内容