数据库基础知识

发布时间 2023-09-07 10:19:03作者: 是寻常

SQL的分类

名称 描述 举例
DDL 数据定义语言 create(创建)、alter(修改)、drop(删除)、rename(重命名)、truncate(清空)
DML 数据操作语言 insert(添加)、delete(删除)、update(修改)、select(查询)
DCL 数据控制语言 commit(提交)、rollback(撤销)、grant(赋予权限)、revoke(回收权限)

一、数据库的数据类型

数值

①整数

名称 含义 占用字节
tinyint 十分小的数据 1
smallint 较小的数据 2
mediumint 中等大小的数据 3
int 标准的整数(常用) 4
bigint 较大的数据 8

②小数

名称 含义 占用字节
float 单精度浮点数 4
double 双精度浮点数 8
decimal 字符串形式的浮点数(金融计算时使用,精度更高)

字符串

名称 含义 占用字节
char 固定字符串 0~255
varchar 可变字符串(常用) 0~65535
tinytext 微型文本 0~255
text 文本串(常用) 0~65535

char和tinyint的区别

char:在定义时必须填写大小,例:char[20],创建一个20个字节的char类型数据

tinytext:在定义时无须填写大小,固定为255字节

时间日期

名称 含义
date 日期格式:YYYY-DD-MM
time 时间格式:HH:mm:ss
datetime YYYY-DD-MM HH:mm:ss (常用)
timestamp 时间戳,1970.1.1到现在的毫秒数(较为常用)
year 年份表示

null

可以理解为空值

不要使用null进行运算,结果为null

二、运算符

2.1、算术运算符

运算符 含义
+ 加法
- 减法
* 乘法
/ 或 div 除法
% 或mod 取模、取余

模[余数]的正负,只与被模数[被除数的]正负有关,例:

-12 % 5 = -2 -12 % -5 = -2

2.2、逻辑运算符

运算符 语法 描述
and && a and b 或 a&&b 逻辑与(两个都为真,结果为真)
or || a or b 或 a||b 逻辑或(其中一个为真,结果为真)
not ! not a 或 !a 逻辑非(取反)

2.3、比较运算符

运算符 名称 作用 示例
is null 为空运算符 判断值、字符串或表达式是否为空 如果a为null,结果为真
is not null 不为空运算符 判断值、字符串或表达式是否不为空 如果a不为null,结果为真
between...and... 两值之间的运算符 判断一个值是否在两个值之间 若a在b和c之间,结果为真

三、操作数据库

-- 1、创建数据库
create database [if not exists] 数据库名;

-- 1、创建数据库并指明字符集
create database [if not exists] 数据库名 character set 'utf8';

-- 2、查看当前连接中的所有数据库
show databases;

-- 3、查看当前使用的数据库
select database()

-- 4、切换数据库
use 数据库名;

-- 5、删除数据库
drop database [if exists] 数据库名;

-- 6、更改数据库字符集
alter database 数据库名 character set 'utf8';

四、操作表

4,.1、创建表

-- 删除表
drop table [if exists] 表名;
-- 创建表
create table 表名(
	字段名 类型 约束(主键,非空,唯一,默认值),
    字段名 类型 约束(主键,非空,唯一,默认值),
    ...
    字段名 类型 约束(主键,非空,唯一,默认值)
)编码,存储引擎;

CREATE TABLE student
(
sid INT not null,
sname varchar(32),
sage INT, 
ssex varchar(8),
primary key (sid)
);

在SQL中,有如下约束:

  • not null -指示某列不能存储null值。
  • unique -保证某列的每行必须有唯一的值。
  • primary key -主键(非空,唯一,not null和unique的结合)。
  • foreign key -外键,保证一个表中的数据匹配另一个表中的值的参照完整性。
  • check -保证列中的值符合指定的条件。
  • default -规定没有给列赋值时的默认值。
-- 例
CREATE TABLE student
(
sid INT,
sname nvarchar(32),
sage INT, 
ssex nvarchar(8)
)engine=InnoDB default charset=utf8;

常用命令

show create database 数据库名; -- 查看创建数据库的语句
show create table 表名;--查看创建该表的语句
desc 表名; --查看表的结构

5.2、修改表

5.2.1、对表名进行修改

1、重命名表

-- 把表A的名字改为B
#方式一:
rename table A to B;
#方式二:
alter table A rename [to] B;

2、清空表

-- 清空表A内的数据
truncate table A;
5.2.2、对表内字段进行修改

alter:修改

1、添加列

-- 添加一个字段(默认添加到最后一列)
alter table 表名 add 字段名 [类型];

-- 添加到第一列
alter table 表名 add 字段名 [类型] first;

-- 添加到指定列的后面(放到A列后面)
alter table 表名 add 字段名 [类型] after A;

2、修改列

-- 修改字段的长度(把A的字符串长度改为10)
alter table 表名 modify A varchar(10);

--修改字段的长度(把A的字符串长度改为10,并添加默认值为a)
alter table 表名 modify A varchar(10) default 'a';

3、重命名列

-- 重命名字段(列名a改成b)
alter table 表名 change a b;

-- 重命名的同时,修改字符串的长度
alter table 表名 change a b varchar(20);

4、删除列

-- 删除一个字段(列)
alter table 表名 drop column a;

5.3、删除表

-- 删除表A
drop table if exists A;

五、操作数据

5.1、插入数据

-- 插入3条具体数据
insert into student(sid,sname,sage,ssex) values(1,'刘一',18,'男'),
(2,'钱二',19,'女'),
(3,'张三',17,'男')

-- 插入一个结果集(字段与字段类型要对应)
-- 查询语句的返回结果为:(3,2,72),插入到sc表中
insert into sc 
select sid,2,(SELECT AVG(score) FROM sc WHERE cid =2)
from student
where sid not in(select sid from sc where cid = 3)

5.2、更新数据(修改数据)

-- 格式:update 表名 set 数据 where 过滤条件
-- 例:把第3条数据的'叶平'改为'王艳'
UPDATE teacher set tname = '王艳' where tid=3;

-- 多表连接更新
UPDATE sc
JOIN (select cid,avg(score) AS avg
			from sc
			WHERE cid IN(SELECT cou.cid
									 FROM teacher tea,course cou
									 WHERE tea.tid = cou.tid AND tea.tname = '叶平')
			GROUP BY cid) AS SS
ON sc.cid =SS.cid
SET sc.score = SS.avg

修改数据时,由于约束的影响,可能会造成更新失败的情况

5.3、删除数据

-- 格式:delete from 表名 where 过滤条件
-- 把叶平删除
delete from teacher where tname = '叶平';

删除数据时,由于约束的影响,可能会造成更新失败的情况

5.4、查询数据

查询语句书写的结构

sql_执行顺序

查询语句执行的顺序

sql_select语句执行顺序

AS(alias) 别名

作用:有的时候,列名字不是那么见名知意,可以起一个别名

格式:字段名 AS 别名

-- 别名 给查询的字段起一个名字 AS
select sname as 学生姓名,sage as 学生年龄 from student;

distinct 去重

作用:去除select查询出来的结果中重复的数据,重复的数据只显示一条

格式:distinct 字段名

-- 查询有哪些学生参加了考试;
SELECT sid FROM sc;
-- 发现重复数据,去重
SELECT DISTINCT sid from sc;

where 条件子句

作用:检索数据中符合条件的值

--查询sid=1的学生的所有课程的成绩
SELECT sid,score FROM sc WHERE sid = 1;

in/not in

作用:在某个范围内

like

作用:模糊查询

_:表示单个字符

%:表示0或无数个字符

-- 查询姓李的学生
select sname from student where like '李%';
-- 查询名字中带国的学生
select sname from student where like '%国%';

order by

作用:子句排序,默认升序

  • ASC 升序
  • DESC 降序
-- 查询学生的所有成绩,并降序排列
select  * FROM sc ORDER BY score DESC; 

-- 一级排序、二级排序
-- 查询学生的所有成绩,并降序排列,当成绩相同时,按学生id升序排列
select  * FROM sc ORDER BY score DESC,sid ASC; 

limit

作用:分页

用法:limit n,m

n表示指针的偏移量

m表示每页显示几条数据

分页显示公式:n=(n-1)*m

例:第2页,每页显示5行

limit (2-1)*5,5

limit 5,5

-- 查询学生的所有成绩,以每页5行进行分页,并只展示第二页
SELECT * from sc LIMIT 5,5;

group by

作用:分组

having

作用:过滤数据

必须与group by连用

多表查询

等值连接、非等值连接

-- 等值连接 钱二的语文成绩是多少   79
SELECT student.sid,student.sname,course.cname,sc.score
FROM sc,student,course
WHERE sc.sid = student.sid AND sc.cid = course.cid AND student.sname='钱二' AND course.cname='语文';

-- 非等值连接 查询钱二的成绩在60~90之间的分数及学科
select student.sid,student.sname,course.cname,sc.score
FROM sc,student,course
WHERE sc.sid = student.sid AND sc.cid = course.cid AND student.sname='钱二' AND sc.score>60  AND sc.score<90;

自连接、非自连接

自连接:其核心在于把一个表复制成两个表,找到对应字段后,进行查询

sql-自连接

内连接、外连接

sql_左连接详情

六、函数

5.1、基本函数

下面列举其中一些基本函数

5.1.1、字符串函数
函数 用法
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,strat,len) 返回字符串str从start位置起的len个长度的字符串
5.1.2、数值函数
函数 用法
ABS(x) 返回x的绝对值
CEIL(x) 向上取整
FLOOR(x) 向下取整
MOD(x,y) 返回x除以y的余数
RAND() 返回0~1的随机值
RAND(x) 返回0~1的随机值,相同的x值会产生相同的随机数
ROUND(x) 返回x四舍五入后的整数
ROUND(x,y) 返回x四舍五入后的小数,小数点保留y位,y可为负数
-- RAND(x) 返回0~1的随机值,相同的x值会产生相同的随机数
select rand(1),rand(1),rand(2);

sql_rand函数

-- 生成6位验证码
lpad(round(rand()*1000000,0),6,'0')
5.1.3、日期函数
函数 用法
curdate() 返回当前日期(年月日)
curtime() 返回当前时间(时分秒)
now() 返回当前日期和时间
year('date') 获取指定date的年份(date格式:2023-6-19)
month('date') 获取指定date的月份
day('date') 获取指定date的日期
date_add('date',interval expr type) 返回一个日期/时间加上一个时间间隔expr后的时间值
datediff('day1','dat2') 返回起始时间date1和结束时间date2之间的天数
-- year(date) 获取当前时间的年份
select year(now())

-- month(date) 获取当前时间的月份
select month(now())

-- day(date) 获取当前时间的日期(日)
select day(now())

-- date_add(date,interval expr type)
-- 当前时间加上70天
select date_add(now(),interval 70 day)

-- datediff(day1,day2)
-- 前者减去后者
select datediff('2023-6-19','1996-8-7')
5.1.1、流程控制函数
函数 用法
if(values,a,b) 如果values为真,返回a,否则返回b
ifnull(values1,values2) 如果values为空(null),返回values1,否则返回values2
case when [val1] then [res1]...else [default] end 如果val1为真,返回res1,...否则返回default默认值
case [erp1] when [val1] then [res1]...else [default] end 如果erp1=val1,返回res1,...否则返回default默认值
-- ifnull(values1,values2)
-- 如果一个值为空(null)时,把它当成0来计算
select ifnull(values,0);

-- case when [val1] then [res1]...else [default]  end
-- 求某一个课程的及格率
SELECT sum(CASE WHEN cid =1 and score>60 THEN 1 ELSE 0 END)/sum(CASE WHEN cid =1 THEN 1 ELSE 0 END)
FROM sc

由于avg()、sum()、count()在计算时都不计算空(null)值,所以可以使用ifnull(values,0)转为0进行计算

5.2、聚合函数

常用的几个聚合函数

名称 作用
AVG() 求平均值 只适用于数值类型的字段/变量(不计算null值
SUN() 求和 只适用于数值类型的字段/变量(不计算null值
MAX() 求最大值 数值类型、字符串类型、日期类型
MIN() 求最小值 数值类型、字符串类型、日期类型
COUNT() 计算指定字段在查询结果中的个数 不计算null值

sql_count函数