数据库基础总结(一)| 青训营

98 阅读10分钟

前言:本笔记是在学习过程中自己查找资料和视频完善的数据库笔记,笔记包括数据库基础、进阶、运维部分,可能不是特别全面,如有错误,望指正,共同进步。

一、SQL

1.DDL(数据定义语言)

1.DDL-数据库操作

 show databases;查看数据库
 create (if not exists)database 数据库名;创建数据库
 use 数据库名;使用数据库/切换数据库
 select database();查询当前处于哪个数据库
 drop (if)database 数据库名;删除数据库

2.DDL-表操作

 show tables;查询当前数据库所有表
 create table 表名(字段1、字段1类型,字段2、字段2类型 );
 desc 表名;查询字段
 show create table 表名;查询这张表的建表语句
 drop table 表名;删表
 truncate table(删表名) 表名; 删表重建
  • 表操作——修改

1.添加字段

alter table 表名 add 字段名 类型(长度)[ comment 注释 ] [约束];

 ALTER TABLE emp ADD nickname varchar(20) COMMENT '昵称';

2.修改数据类型

alter table 表名 modify 字段名 新数据类型 (长度);

3.修改字段名和字段类型

alter table 表名 change 旧字段名 新字段名 类型 (长度) [ COMMENT 注释 ] [ 约束 ];

 ALTER TABLE emp CHANGE nickname username varchar(30) COMMENT '昵称';

4.删除字段

alter table 表名 drop 字段名;

 alter table emp drop username;

5.修改表名

alter table 表名 rename to 新表名;

 ALTER TABLE emp RENAME TO employee;
  • 在MySQL中,comment的批注不会在select语句的结果中体现出来。comment的作用是提供关于表、列和索引的描述信息,以便开发者更好地理解代码和数据库结构。它们通常用于文档或版本控制等目的,而不是直接参与代码的执行过程。
  • 在数据库开发中却非常有用。虽然注释本身不会直接影响代码的执行,但它可以提高代码的可读性,减少代码阅读和理解上的困难,并且为数据库设计和文档提供重要的信息。此外,在大型项目或多人开发中,注释可以使协作更加顺畅,减少沟通成本和误解。因此,为表、列和索引添加注释是一种良好的实践,可以提高代码的质量和可维护性。
  • 在MySQL中,可以使用SHOW CREATE TABLE命令来查看表的定义和注释。通过这个命令,可以看到表、列和索引的注释。此外,在像phpMyAdmin这样的数据库管理工具中也可以方便地查看表、列和索引的注释,以及在SQL查询结果中呈现出来。在MySQL Workbench等其他图形化工具中也可以浏览表和列的注释。

3.数据类型

1.数值类型

类型大小描述
TINYINT1byte小整数值
SMALLINT2bytes大整数值
MEDIUMINT3bytes大整数值
INT/INTEGER4bytes大整数值
BIGINT8bytes极大整数值
FLOAT4bytes单精度浮点数值
DOUBLE8bytes双精度浮点数值
DECTMAL小数值(精确定点数)

2.字符串类型

类型大小描述
char0~255bytes定长字符串(需要指定长度)
VARCHAR0-65535 bytes变长字符串(需要指定长度)
TINYBLOB0-255 bytes不超过255个字符的二进制数据
TINYTEXT0-255 bytes短文本字符串
BLOB0-65 535 bytes二进制形式的长文本数据
TEXT0-65 535 bytes长文本数据
MEDIUMBLOB0-16 777 215 bytes二进制形式的中等长度文本数据
MEDIUMTEXT0-16 777 215 bytes中等长度文本数据
LONGBLOB0-4 294 967 295 bytes二进制形式的极大文本数据
LONGTEXT0-4 294 967 295 bytes极大文本数据

char 与 varchar 都可以描述字符串,char是定长字符串,指定长度多长,就占用多少个字符,和

字段值的长度无关 。而varchar是变长字符串,指定的长度为最大占用长度 。相对来说,char的性

能会更高些。

3.日期时间类型

类型大小格式描述
date3YYYY-MM-DD日期值
time3HH:MM:SS时间值或持续时间
year1YYYY年份值
datetime8YYYY-MM-DD HH:MM:SS混合日期和时间值
timestamp4YYYY-MM-DD HH:MM:SS混合日期和时间值,时间戳

二.DML(数据操作语言)

1、添加数据

1.给指定字段添加数据

 insert into 表名(字段1,字段2,...) values(值1,值2,...)[,(值1,值2,...)...];
 insert into employee(id,workno,name,gender,age,idcard,entrydate)
 values(1,'1','Itcast','男',10,'123456789012345678','2000-01-01');

2.给全部字段添加数据

 INSERT INTO 表名 VALUES (值1, 值2, ...);
 insert into employee values(2,'2','张无忌','男',18,'123456789012345670','2005-01-
 01');

3.批量添加数据

 INSERT INTO 表名 (字段名1, 字段名2, ...) VALUES (值1, 值2, ...), (值1, 值2, ...), (值
 1, 值2, ...) ;
 ​
 INSERT INTO 表名 VALUES (值1, 值2, ...), (值1, 值2, ...), (值1, 值2, ...) ;
 insert into employee values(3,'3','韦一笑','男',38,'123456789012345670','2005-01-
 01'),(4,'4','赵敏','女',18,'123456789012345670','2005-01-01');

2、修改数据

 update 表名 set 字段1=值1,字段2=值2 , ...[where 条件];
 修改id为1的数据,将name修改为itheima
 update employee set name = 'itheima' where id = 1;
 修改id为1的数据, 将name修改为小昭, gender修改为 女
 update employee set name = '小昭' , gender = '女' where id = 1;
  将所有的员工入职日期修改为
  2008-01-01update employee set entrydate = '2008-01-01';

3、删除数据

 delete from 表名 [where 条件];
 删除gender为女的员工
 delete from employee where gender = '女';
 删除所有员工
 delete from employee;

三.DQL(数据查询语言)

 SELECT    字段列表
 FROM      表名列表
 WHERE     条件列表
 GROUP BY  分组字段列表
 HAVING    分组后条件列表
 ORDER BY  排序字段列表
 LIMIT     分页参数

1、基本查询

1.查询多个字段
 SELECT 字段1, 字段2, 字段3 ... FROM 表名 ;
 select * from 表名;
2.字段设置别名
 select 字段1as 别名1),字段2as 别名2)... from 表名;
 select 字段1 (别名1), 字段2(别名2)...from 表名;
3.去除重复记录
 select distinct 字段列表 from 表名;

2、条件查询

 select 字段列表 from 表名 where 条件列表;

1.比较运算符

 >>=<=!=between and 、
 in(...)在in之后的列表中的值,多选一
 like 占位符('_'匹配单个字符 '%'匹配任意字符)、
 is null ;是NULL

2.逻辑运算符

 and (&&)、or(||) 、not(!)

3、聚合函数

函数功能
count ()统计数量
max ()最大值
min ()最小值
avg ()平均值
sum ()求和
 select 聚合函数(字段列表)from 表名;

null值不参与聚合函数运算。

4、分组查询

 select 字段列表 from 表名 (where 条件) group by 分段字段名 having 分组后过滤条件 ;
1.where 与 having区别

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

判断条件不同:where不能对聚合函数进行判断,而having可以。

group by 按照某一个字段进行分组,将相同的值分到一个组里,单元格里面的内容是多个值的,而关系数据库就是基于关系的,单元格中是不允许有多个值的,执行select*语句就会报错。因此就要结合聚合函数来输出。

5、排序查询

1.语法

 select 字段列表 from 表名 order by 字段1 排序方法,字段2,排序方法2
 select name , age from emp where age <= 35 order by age asc , entrydate desc; 

2.排序方法

asc :升序 (如果是升序,可以不指定排序方式asc) desc:降序 (如果是多字段排序,当第一个字段相同时,才会根据第二个字段进行排序)

6、分页查询

1.语法
 select 字段列表 from 表名 limit 起始索引,查询记录数;
2.起始索引
 起始索引从0开始,起始索引 = (查询页码 - 1)* 每页显示记录数。(想成第几条到第几条)
 分页查询是数据库的方言,不同的数据库有不同的实现,MySQL中是LIMIT。

7、执行顺序

1.编写顺序
 select     字段列表
 from       表名列表
 where      条件列表
 group by   分组字段列表
 having     分组后条件列表
 order by   排序字段列表
 limit      分页参数
2.执行顺序
 from       表名列表
 where      条件列表
 group by   分组字段列表
 having     分组后条件列表
 select     字段列表
 order by   排序字段列表
 limit      分页参数

对于新版的mysql来说,select中定义的别名可以在having后使用

四.DCL(数据控制语言)

1.查询用户

 select * from mysql.user;

host 表示当前访问的主机 localhost, 仅代表只能够在当前本机访问,是不可以远程访问的。

2、用户管理

 创建用户       create user '用户名'@'主机名' identified by'密码';
 修改密码       alter user '用户名'@'主机名' identified with          mysql_native_password by '密码';
 删除用户       drop user '用户名'@'主机名';
  • 在MySQL中需要通过用户名@主机名的方式,来唯一标识一个用户。
  • 主机名可以使用 % 通配。

3、权限控制

 查询权限  show grants for '用户名'@'主机名';
 授予授权     grant 权限列表 on 数据库名.表名 to '用户名'@'主机名';
 撤销权限  revoke 权限列表 on 数据库名.表名 from '用户名'@'主机名';
权限说明
ALL, ALL PRIVILEGES所有权限
select查询数据
insert插入数据
update修改数据
delete删除数据
alter修改表
drop删除数据库/表/视图
create创建数据库/表

查询权限:show grants for 'heima'@'%'; 授予权限:grant all on itcast.* to 'heima'@'%'; 撤销权限:revoke all on itcast.* from 'heima'@'%';

二、函数

一.字符串函数

CONCAT(S1,S2,...Sn)字符串拼接,将S1,S2,... Sn拼接成一个字符串
LOWER(str)将字符串str全部转为小写
UPPER(str)将字符串str全部转为大写
LPAD(str,n,pad)左填充,用字符串pad对str的左边进行填充,达到n个字符串长度
RPAD(str,n,pad)右填充,用字符串pad对str的右边进行填充,达到n个字符串长度
TRIM(str)去掉字符串头部和尾部的空格
SUBSTRING(str,start,len)返回从字符串str从start位置起的len个长度的字符串

二.数值函数

CEIL(x)向上取整
FLOOR(x)向下取整
MOD(x,y)返回x/y的模
RAND()返回0~1内的随机数
ROUND(x,y)求参数x的四舍五入的值,保留y位小数

三.日期函数

CURDATE()返回当前日期
CURTIME()返回当前时间
NOW()返回当前日期和时间
YEAR(date)获取指定date的年份
MONTH(date)获取指定date的月份
DAY(date)获取指定date的日期
DATE_ADD(date, INTERVAL exprtype)返回一个日期/时间值加上一个时间间隔expr后的时间值
DATEDIFF(date1,date2)返回起始时间date1 和 结束时间date2之间的天数

四.流程函数

IF(value , t , f)如果value为true,则返回t,否则返回f
IFNULL(value1 , value2)如果value1不为空,返回value1,否则 返回value2
CASE WHEN [ val1 ] THEN [res1] ... ELSE [ default ] END如果val1为true,返回res1,... 否 则返回default默认值
CASE [ expr ] WHEN [ val1 ] THEN [res1] ... ELSE [ default ] END如果expr的值等于val1,返回 res1,... 否则返回default默认值