数据库学习

SQL常用语句学习

1 创建数据库

create database+数据库名;

更改数据库名字
ALTER DATABASE test
modify name= test_1

2 使用数据库

use+数据库名;

3 查看数据库

查看mySQL中有哪些数据库:
show databases;

4 删除数据库

drop database + 数据库名;

5 创建表格

create table if not exists + 表名(列名+类型,
primary key(列名(,列名)),
constraint fk foreign key (sno,cno)
references student(sno)
references c(cno));


//为表添加约束
1 添加主键
alter table table_name
add constraint pk_yg primary key(列名);

2 添加外码
alter table table_name
add constraint fk_xinji foreign key(薪级编号) references 薪资表(薪级编号);

3 添加列
alter table table_name
add cat_categoryNo varchar(20);

6 查看表

show tables;

7 查看表创建

show create table +表名;

8 添加数据

insert into + 表名 (列名,列名,…,列名) values(列名对应值);或
Insert into student values(直接按照建表时列名的顺序写);

9 查询表的内容

select * from + 表名;

//按年份
YEAR(列名)='年份'

//按月份
month(date)='9'

//按日期
DAY(happentime)='01'



//集合查询

在两个查询语句之间加上连接词
union//intersect//except////查询mis专业,出生晚于1991年的学生信息
select * from student where major='MIS'
intersect
select * from student where birthyear>1991
  • 主键约束(primary key)
    • 被标记为主键的列,数据不能重复
    • 原则上一个表只能有一列被标记为主键
  • 自增约束(auto_increment)
    • 将该列设置为自增字段(相对于上一行+1),一般和主键放在一起设置
  • 非空约束(not null)
    • 被标记的列不能为空
  • 唯一约束(unique)
    • 被标记的列值不能重复 可以标记多行

10 更新数据

update teacher
set address = '北京'
where name = '赵六';

11 删除

delete from teacher
where name = '赵六';

--启用/禁用指定表所有外键约束   
alter table tbname  NOCHECK constraint all  
alter table tbname  CHECK constraint all
  
--禁用/恢复某个表的某个触发器
ALTER TABLE tbname DISABLE TRIGGER trigname
ALTER TABLE tbname ENABLE TRIGGER trigname
  
--禁用恢复某个表上的所有触发器
ALTER TABLE tbname DISABLE TRIGGER all
ALTER TABLE tbname ENABLE TRIGGER all**Mysql中**//关闭外键检测
SET FOREIGN_KEY_CHECKS=0;
//开启外键检测
SET FOREIGN_KEY_CHECKS=1;

//删除表
drop table 表名

12 查询

select *
from teacher;

结果只显示个别几列
select name,address
from teacher;

后面可以跟where子句
select name,gender
from teacher where tid > 2;

select * from teacher
where tid > 1 and gender = '女';

select *
from teacher
where tid > 2 or gender = '男';

where后面可以加order by排序
order by 列名 [排序方式]
select *
from teacher
where tid > 2 or gender = '男'
order by tid desc ;

limit+要显示的数量
limit 从第几行开始,显示多少行
select *
from teacher
where tid > 2 or gender = '男'
order by tid desc
limit 2,1;

//分组查询
select *
from teacher
group by depart;

HAVING 子句
//SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与聚合函数一起使用。
//HAVING 子句可以让我们筛选分组后的各组数据。

//员工数超过3人的部门的最高薪资和最低薪资
select depart,max(salary),min(salary),count(*)
from employee1
group by depart
having count(*) > 3;



//范围查询
between...and....:在...之间
select *
from Employee1
where salary between 6000 and 12000;


//集合查询in/not in:是否存在
select *
from Employee1
where depart in ('市场部','人事部');

//like:模糊查询
select *
from Employee1
where name like '张%'; //%后面只是占位 不算位数 代表一串字符

select *
from Employee1
where name like '张_'; //_代表一个字符


//TOP查询(my sql 中为limit查询)(此方法用于sql中)
top n [percent] [with ties]
SELECT TOP number|percent column_name(s)
FROM table_name



去重
distinct


//交查询
select sno from salebill
where sno in (
select sno from salebill where goodsno='gn001'
intersect
select sno from salebill where goodsno='gn002'
)group by sno


//并查询
select distinct sno from salebill
where sno in (
select sno from salebill where goodsno='gn001'
union
select sno from salebill where goodsno='gn002'
)

//差查询
select distinct sno from salebill
where sno in (
select sno from salebill where goodsno='gn001'
except
select sno from salebill where goodsno='gn002'
)

13 数据类型

数据类型 含义
CHAR(n) ,CHARACTER(n) 长度为n的定长字符串
VARCHAR(n),CHARACTERVARYING(n) 最大长度为n的变长字符串
INT,INTEGER 长整数(4字节)
SMALLINT 短整数(2字节)
BIGINT 大整数(8字节)
NUMERIC(p,d) 定点数,由p位数字(不包括符号、小数点)组成,小数后面有d位数字
DECIMAL(p, d), DEC(p,d) 同NUMERIC
DATE 日期,包含年、月、日,格式为YYYY-MM-DD
TIME 时间,包含一日的时、分、秒,格式为HH:MM:SS

14 聚合函数

聚合函数名及参数 功能
COUNT(*|<列名>) 统计元组个数
COUNT([DISTINCT|ALL]<列名>) 统计一列中值的个数
SUM([DISTINCT|ALL]<列名>) 计算一列值的总和(此列必须为数值型)
AVG([DISTINCT|ALL]<列名>) 计算一列值的平均值(此列必须为数值型)
MAX([DISTINCT|ALL]<列名>) 求一列中的最大值
MIN([DISTINCT|ALL]<列名>) 求一列中的最小值

15 逻辑运算符

逻辑运算符 描述
and &&
or
not !
xor 异或
& 位与
| 位或
^ 位异或
<< 位左移
>> 位右移

16 常用函数

函数 描述
CONCAT() 字符串拼接
LOWER/UPPER() 大小写改变
REPLACE() 字符串替换
SUBSTRING(): 截取子字符串
CEIL() 向上取整
FLOOR() 向下取整
rand() 生成随机数
select CONCAT('我是',name,depart)
from Employee1;

select LOWER('ASERDFTY');
select UPPER('qwertyyu');

select SUBSTRING('这是一个字符串',3,5);

select CEIL(3.3);

select FLOOR(3.3);

select rand();

17 列操作

增加列:
alter table tableName add columnName varchar(30);

修改列类型:
alter table tableName alter column columnName varchar(4000)  

修改列的名称:
EXEC  sp_rename   'tableName.column1' , 'column2'  (把表名为tableName的column1列名修改为column2)

删除列: 
alter table tableName drop column columnName

创建唯一值索引
ALTER TABLE `supplier` ADD UNIQUE (`supplierno`);//默认升序

添加降序唯一值索引
CREATE UNIQUE INDEX categoryname ON category (categoryname DESC);

删除列唯一值约束
ALTER TABLE student DROP CONSTRAINT weixin


mysql
查看表的字段信息:desc 表名;
查看表的所有信息:show create table 表名;
添加主键约束:alter table 表名 add constraint 主键 (形如:PK_表名) primary key 表名(主键字段);
添加外键约束:alter table 从表 add constraint 外键(形如:FK_从表_主表) foreign key 从表(外键字段) references 主表(主键字段);
删除主键约束:alter table 表名 drop primary key;
删除外键约束:alter table 表名 drop foreign key 外键(区分大小写);
修改表名:alter table t_book rename to bbb;
添加列:alter table 表名 add column 列名 varchar(30);
删除列:alter table 表名 drop column 列名;
修改列名MySQL: alter table bbb change nnnnn hh int;
修改列名SQLServer:exec sp_rename't_student.name','nn','column';
修改列名Oracle:alter table bbb rename column nnnnn to hh int;
修改列属性:alter table t_book modify name varchar(22);

视图

1 创建视图

create view v1 as
select * from A;

2 修改视图

alter view 视图名 as 新的查询语句
create or replace view 视图名 as 新的查询语句  //创建新的或者替换新的 

3 删除

drop view v1

4 修改

alter view v1 as select *  from A where A.id > 23;

5 查询视图

select * from v1;

6 数据操作

视图数据操作:直接对视图进行写操作(增删改)然后实现基表数据的变化

视图所有的数据操作都是最终对基表的数据操作
视图操作条件

​ 多基表视图:不允许操作(增删改都不行)。

​ 单基表视图:允许增删改

​ 新增条件:视图的字段必须包含基表中所有不允许为空的字段

with check option:操作检查规则
默认不需要这个规则(创建视图时指定)︰视图操作只要满足前面上述条件即可
增加此规则:视图的数据操作后,必须要保证该视图还能把通过视图操作的数据查出来(否则失败)

7 视图作用

1、简化数据查询

2、使用户多角度看待同一数据

3、提供一定程度的逻辑独立性

4、提供数据库安全性

游标

1 自定义

自定义数据类型

//创建自定义类型create type type_name from system_type [null | not null]

2 定义游标

declare coursor_name [insensitive] [scroll] cursor
for select_statement//(mysql只能在存储过程中使用)
DELIMITER//
CREATE PROCEDURE gsy()
as
BEGIN
DECLARE gs CURSOR
FOR
SELECT saleprice FROM goods
WHERE goods.categoryno=(SELECT categoryno FROM category WHERE categoryname='咖啡');
END//


declare @gname varchar(20),@gsalep float//定义数据变量
declare gs scroll cursor//定义游标   scroll可以自由移动游标insensitive表明会对选取的数据存放在临时表里,游标数据不随基本表改变而变
for select goodsname,saleprice//游标选取数据
from goods join categoryon category.categoryno=goods.categorynowhere category.categoryname='咖啡'
for update//可以更新数据   read only不允许更新数据
open gs//打开游标
fetch next from gs into @gname,@gsalep//通过游标取值while @@fetch_status=0//遍历条件
begin
update goods set saleprice=saleprice-saleprice*0.1
where current of gs
fetch next from gs//游标移动
end
close gs//关闭游标
deallocate gs//释放游标


游标遍历
while @@fetch_status=0

触发器

create trigger inst//定义触发器
on salebill//绑定对象
after insert//指明触发类型和操作 触发类型:(for和after)|instead of(替换) 操作类型:deleteupdateinsert
as  declare @numbe int//定义变量
declare @good varchar(10)
select @numbe=number from inserted//给变量赋值,可以用set语句
select @good=goodsno from inserted
if(select number from goods where goodsno=@good)<@numbe
begin
print '数量不足'
end  else
begin
update goods set number=number-@numbe where goodsno=@good
if(select number from goods where goodsno=@good)<10
begin
print '该商品数量小于10,低于安全库存量,请及时进货'
end
end
go
insert into salebill values('gn006','s04','2021-10-02 00:00:00.000',4)
drop trigger inst

存储过程

go
create procedure search//创建存储过程
@cate varchar(20) output//指定传入参数类型,是否有输出
as
if @cate in (select categoryname from category)//编写语句
begin
select * from goods
join category
on goods.categoryno=category.categoryno
where category.categoryname=@cate
end
else
print '没有此类商品' 

execute search '咖啡'//执行存储过程
drop procedure search//删除存储过程

函数

create function find(@start date,@end date)
returns table//返回类型as//后跟sql语句
return select goodsno,sum(number)as salenumber from salebill
where happentime between @start and @end
group by goodsno

select * from dbo.find('2020-01-01','2020-12-30')//dbo可以操作方法

关系数据理论

属于(元素与集合之间),包含(集合与集合之间)

关系模式的形式化定义

R(U,D,DOM,F)R:关系名U:属性名集合D:属性组U中属性所来自的域DOM:属性向域的映像集合F:属性间数据的依赖关系集合

关系模型常见问题

1、数据冗余

2、更新异常

  • 插入异常
  • 更新异常
  • 删除异常

侯选码

  • 候选码可以唯一地识别关系的元组。
  • 包含在任何一个候选码中的属性,叫做主属性。不包含在任何候选码中的属性称为非主属性或非码属性。
  • 最简单的情况下,候选码只包含一个属性。
  • 最复杂的情况下,候选码包含关系模式的所有属性,称为全码。

外码的定义

关系模式R中属性或属性组X并非R的码,但X是另一个关系模式的码,则称X是R的外部码,简称外码。

范式

第一范式

如果一个关系模式R的所有属性都是不可分的基本数据项(所有数据项不能再分),则R是第一范式,简称1NF

第一范式是对关系模式的最起码的要求。满足第一范式的关系称为规范化关系。不满足第一范式的数据库模式不能称为关系数据库。

第二范式

若关系模式R属于1NF,且每一个非主属性都完全函数依赖于码,则称R为第二范式,简称2NF

第二范式不存在部分函数依赖,可存在传递依赖

第三范式

如果关系R为2NF,并且R中每一个非主属性都不传递依赖于R的候选码,则称R为第三范式

第三范式不存在部分函数依赖,传递函数依赖

BC范式

关系模式是1NF,如果对于R的每个函数依赖X→Y,若Y不属于X时X必含有候选码,则称R为BC范式,简称BCNF

BCNF的定义可以这样理解:如果关系R为1NF,并且R中不存在任何属性对码的部分依赖或传递依赖,那么称R为BCNF。

第四范式

BCFN消除非平凡且非函数依赖的多值依赖

数据库管理

create login login1 with password ='stu1';//创建登录用户
createuser stu1 for login login1;
create login login2 with password ='stu2';
createuser stu2 for login login2;
create login login3 with password ='stu3';
createuser stu3 for login login3;

grantselect,inserton salebill to stu1;//赋予用户权限
grantselect,update,insert,deleteon student to stu1;
grantselect,update,insert,deleteon goods to stu1;

revoke select on salebill to stu1//移除用户权限
revoke update,insert on student to stu1
revoke delete on goods to stu1

drop login login1;//删除用户,登录用户
drop login login2;
drop login login3;
dropuser stu1;
dropuser stu2;
dropuser stu3;


//查看登录账号
execute sp_helplogins['login']//login指登录账号名
select * from sys.syslogins

//查看数据库用户
execute sp_helpuser['user_name']
select * from sys.sysusers
posted @   浮生阁阁主  阅读(346)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示