目录
第一个问题:肉眼可见的离谱,明明只有画框的那行符合条件但是显示了好多结果
第一个问题:肉眼可见的离谱,明明只有画框的那行符合条件但是显示了好多结果
【解决】害~我的问题,人家是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
- 返回从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 全部课程信息表.课号=选课信息表.课号)
//选课信息表是桥梁,联系了课程信息和学生信息
)
以上是我对于本次实验的整理与记录,欢迎大佬的批评指正~