数据库作业小记

目录

第一个问题:肉眼可见的离谱,明明只有画框的那行符合条件但是显示了好多结果 

第二个问题:重命名视图,按照教程写会报错

第三个问题:删除索引,教程依然有误

第四个问题:重命名索引,教程有误

第五个问题:多表联合更新,教程有误

一些个基本语句(基础必备我不会,代码bug改不对)


第一个问题:肉眼可见的离谱,明明只有画框的那行符合条件但是显示了好多结果 

【解决】害~我的问题,人家是char,所以搜索内容需要加上'单引号',但是为什么不加单引号也会搜出来结果,我也没想清楚(欢迎大佬来指点一下);加上单引号后搜索结果正确:

 表结构如图(查看表结构:show create table client;):

第二个问题:重命名视图,按照教程写会报错,于是修改如下(c_view改名为v)

第三个问题:删除索引,教程依然有误,修改如下:

第四个问题:重命名索引,教程有误,修改如下:

第五个问题:多表联合更新,教程有误,修改如下:

一些个基本语句(基础必备我不会,代码bug改不对):

存在就删除并创建:Drop If exists 表名;

声明主键:id varchar(20) primary key;

声明非空:id int not null

声明独有:id char(20) unique;

插入数据:Insert into 表名(属性1,属性2) values (插入的属性1,插入的属性2);

设置默认值:id Int default null;

添加约束:Alter table 表名 ADD CONSTRAINT 检查名 CHECK (属性要满足的约束条件);

        eg:ALTER table finances_product ADD CONSTRAINT c_p_mount CHECK (p_amount >=0);

两条查询结果放一起:Select * from 表名 where属性  in (第一个查询结果) UNION (第二个查询结果);
select i_name,i_amount from insurance where i_amount in (select max(i_amount) from insurance)
union
select i_name,i_amount from insurance where i_amount in (select min(i_amount) from insurance);

创建视图:CREATE VIEW 视图名 AS 【筛选条件】;

//之后的操作把视图作为一个正常的表查询就可以(SELECT * FROM 视图名;)

        eg:CREATE VIEW v_client as SELECT c_id,c_name,c_id_card FROM client WHERE EXISTS (SELECT * FROM bank_card WHERE client.c_id = bank_card.b_c_id);

改变现有视图内容:CREATE OR REPLACE VIEW 视图名 AS 【筛选条件】;

        eg:CREATE OR REPLACE VIEW v_client as SELECT c_id,c_name,c_id_card FROM client WHERE EXISTS (SELECT * FROM bank_card WHERE client.c_id = bank_card.b_c_id and bank_card.b_type='信用卡');

现有视图重命名(MySQL):Rename table 原视图名 to 新视图名;

删除视图:DROP VIEW 视图名;//删表直接DROP TABLE 表名;

创建索引:CREATE INDEX 索引名 ON 表名(创建索引的属性);

        eg:CREATE INDEX idx_property ON property(pro_c_id DESC,pro_income,pro_purchase_time);

删除索引(MySQL):DROP INDEX 索引名 ON 索引的表名;

        eg:DROP INDEX idx_property ON property;

重命名索引(MySQL):Alter Table 表名 rename index 旧索引名 to 新索引名;

        eg:Alter table property rename index idx_property to idx_property_temp;

多表联合更新(MySQL):Update 表名1,表名2 SET 表名.属性 WHERE 【筛选条件】;

        eg: UPDATE bank_card,client SET bank_card.b_type='借记卡' where bank_card.b_c_id = client.c_id and bank_card.b_c_id<10;

删除表中数据:Delete From 表名 Where 【筛选条件】;

# 插播一条删除的神奇用法,本题为删除所有重复的email,并且保留id最小的email
DELETE b from Person a,Person b where a.email=b.email and a.id<b.id;

更改表中属性名:alter table 表名 change column 原属性名 新属性名 属性类型;

        eg:alter table employee change column dep_departno departno int;【把employee中的dep_departno属性改成departno,且新属性的类型是int】

上机笔记:

如果只想查询比如说我就要第二条和第三条记录,可以使用Limit进行限制:

SELECT * FROM TABLE LIMIT 1,2;//从第2条开始,选两条数据

IFNULL关键字:

select ifnull((select distinct salary from employee limit 1,2),null)  as SecondHighestSalary;

//比如说我要两条数据但是你没有,我只能给你返回个null

ISNULL关键字:判断如果是空的

select name from customer where isnull(referee_id) or referee_id<>2;

//如果referee_id是空的或者不等于2都返回值

SELECT中竟然可以加IF!!类似于三元表达式吧,写的有点放飞自我

select employee_id,if(name not like 'M%' and employee_id%2,salary,0) as bonus
 from employees order by employee_id;

一道交换性别的题(如果sex是f那就赋值为m,反之赋值为f):

update salary set sex=if(sex='f','m','f');#和上面的IF差不多
update salary set sex=(case sex when 'm' then 'f' else 'm' end);#头一次见记录一下
#在性能方面emm,因为每次运行的时间都不一样,貌似第一个快一点点

计算两个日期的差值:dateDiff

select * 
from 'calender' a,'calender' b 
where dateDiff(a.recordDate,b.recordDate)=1
//DATEDIFF('2022-06-01','2022-06-02');   # -1
//DATEDIFF('2022-06-02','2022-06-01');   # 1
  1. 返回从0000年到现在的天数
to_days("2022-06-01")//返回到00年的天数

计算时间差:

#计算相差天数:
select TIMESTAMPDIFF(DAY,'2022-05-20', '2022-05-21'); # 1

#计算相差小时数:
select TIMESTAMPDIFF(HOUR, '2022-06-22 12:00:00', '2022-06-22 18:00:00'); # 6

#计算相差秒数:
select TIMESTAMPDIFF(SECOND, '2022-06-22 07:00:00', '2022-06-22 7:01:00'); # 61

给当前时间增加指定的时间间隔:interval

select date_add(当前时间,INTERVAL 1 DAY)//明天
select date_sub(当前时间,INTERVAL 1 DAY)//昨天

查询选修了全部课程的学生(共三张表:学生信息表,课程信息表,学生选课信息表)

SELECT 学生信息 FROM 学生信息表 WHERE NOT EXISTS
    (SELECT * FROM 全部课程信息表 WHERE NOT EXISTS 
        (SELECT * FROM 选课信息表 WHERE 学生信息表.学号=选课信息表.学号 AND 全部课程信息表.课号=选课信息表.课号)
        //选课信息表是桥梁,联系了课程信息和学生信息
    )

以上是我对于本次实验的整理与记录,欢迎大佬的批评指正~

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值