数据库姓名的缺省值为未知姓名-压缩文件格式未知或者数据已经被损坏
前言
本博客使用mysql数据库进行数据操作,使用Navicat for mysql IDE进行可视化操作。 每条SQL语句都是经过个人实验验证,经过自己的思考。 可以保证sql语句的可运行性。
sql语句的命令是不区分大小写的,但是存储的数据是区分大小写的。 这里统一使用英文小写进行命令编辑。 如果喜欢大写,可以使用IDE编辑器的一键美化功能数据库姓名的缺省值为未知姓名,统一转换成大写。 并且会美化你的sql语句,比如自动换行等等。
创建删除(数据库,表)
创建数据库;
-- 创建名为dbtest数据库
create database dbtest;
use dbtest;
-- 创建表
create table `t_student`(
`stu_id` char(12) not null COMMENT '学生id',
`stu_name` varchar(12) not null comment '学生姓名',
`stu_sex` tinyint(2) unsigned default null comment '性别:0(男),1(女)',
`stu_age` tinyint(3) unsigned DEFAULT NULL COMMENT '年龄',
PRIMARY KEY (`stu_id`)
)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='学生基本信息表';
mysql中的数据类型
增加插入数据插入已知行(几行数据
-- 插入数据 insert values
insert into `t_student`
(`stu_id`,`stu_name`,`stu_sex`,`stu_age`)
values(1,"hjk","0",18);
-- insert set
insert into `t_student`
set `stu_id`=3,`stu_name`='hjk',`stu_sex`=1,`stu_age`=18
insert into `t_student` select `stu_id`,`stu_name`,`stu_sex`,`stu_age` from `t_student01`;
插入多行数据(100,000)
使用存储过程插入数据,在我们做实验的时候可能需要操作大量的数据,但是手工逐条添加的时候并不容易。 我们可以使用其他方式来插入数据(例如:连接jdbc,执行操作),但是这个插入几乎是一样的数据,这里我们使用存储过程,通过调用存储过程来插入大量数据!
-- 插入大量数据,使用存储过程
delimiter ##
create procedure insert_pro()
begin
declare i int default 4;
while i <=100000 do
insert into `t_student` values(i,'hjk','0','20');
set i = i+1;
end while;
end ##
-- 使用存储过程
call insert_pro();
-- 删除储存过程
DROP PROCEDURE IF EXISTS insert_pro;
删除
这里只记录删除表和删除数据库,其他的会在每次创建之后再写,比如给表添加字段,那么相应的,如何删除字段后面会写
删除表
-- 删除表
drop table `t_student`;
删除数据库
-- 删除dbtest数据库
drop database dbtest;
删除表数据
DELETE FROM [WHERE 子句] [ORDER BY 子句] [LIMIT 子句]
删除stu_id为1的数据
delete from `t_student` where `stu_id`="1";
清除表中的所有数据
truncate table `t_student`;
修改表结构(6个约束)和添加主键(三种方式)
create table `t_student`(
`stu_id` char(12) not null PRIMARY KEY COMMENT '学生id',
`stu_name` varchar(12) not null comment '学生姓名',
`stu_sex` tinyint(2) unsigned default null comment '性别:0(男),1(女)',
`stu_age` tinyint(3) unsigned DEFAULT NULL COMMENT '年龄'
)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='学生基本信息表';
-- 最后添加主键
alter table `t_student` add primary key(`stu_id`);
-- 删除主键约束
alter table `t_student` drop primary key;
添加外键约束
外键约束经常和主键约束一起使用来保证数据的一致性!
需要添加外键的有两张表,一张是主表,一张是从表。 这里我们使用主表位置t_student表,副表位置t_coruse表; 一种是在建表的时候就创建外键约束,一种是以后再添加外键约束;
首先:
"constraint fk_course_id foreign key(stu_id) references t_student(stu_id)"创建一个名为fk_course_id的外键,使得t_course表中的cou_id字段引用t_student表中的stu_id字段。 这里的逻辑是错误的,重点在语法上。
create table t_course(
`cou_id` char(8) primary key,
`stu_id` char(12) not null,
`cou_name` varchar(12) not null,
`semester` smallint ,
`credit` smallint,
constraint fk_course_id foreign key(`stu_id`) references t_student(`stu_id`)
);
第二种:
添加外键时表中最好不要有数据,否则可能会创建失败
alter table t_student
add constraint fk_student_id foreign key(`stu_id`) references t_course(`cou_id`);
alter table t_course
drop foreign key fk_course_id;
添加唯一检查默认值不为空约束
比如对t_student表的stu_name列添加唯一约束
-- 创建表
create table `t_student`(
`stu_id` char(12) not null PRIMARY KEY COMMENT '学生id',
`stu_name` varchar(12) unique,
`stu_sex` tinyint(2) unsigned default null comment '性别:0(男),1(女)',
`stu_age` tinyint(3) unsigned DEFAULT NULL COMMENT '年龄',
)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='学生基本信息表';
alter table `t_student`
add constraint un_age unique(`stu_age`);
alter table `t_student`
drop index un_age;
==其实你应该能看出来他们的语法格式差不多,可以在(1)建表时,(2)建表时Add and name with constraint后直接加关键字修饰约束最后,(3),建表后使用alter add添加约束,所以后面的约束就不详细写了。
check(`stu_age`>0 and `stu_age`<150)
alter TABLE `t_student` add constraint check_age check(`stu_age`<100);
alter table `t_student` drop check check_age;
非空约束和默认值的约束修改和上面的不一样,使用change修改
alter TABLE `t_student` change column `stu_sex` `stu_sex` tinyint(2) default '1';
alter TABLE `t_student` change column `stu_sex` `stu_sex` tinyint(2) default null;
修改表数据
-- 没有条件全部修改
update `t_student` set `stu_name` = 'kjh' ,`stu_age` = '19';
-- 有条件只修改符合条件的
update `t_student` set `stu_name` = 'kjh' ,`stu_age` = 25
where `stu_id` = 10;
查询
select distinct `stu_age` from `t_student`;
删除重复的年龄和姓名
select distinct `stu_name`, `stu_age` from `t_student`;
select * from `t_student`;
select * from `t_student` where `stu_name` = 'hjk';
select count(*) from `t_student` where `stu_name` = 'hjk';
select * from `t_student` where `stu_id` in
(select `stu_id` from `t_student` where `stu_age`=18);
子查询语句可以嵌套在 SQL 语句中的任意表达式中
在SELECT语句中,子查询可以嵌套在SELECT语句的列、表和查询条件中,即SELECT子句、FROM子句、WHERE子句、GROUP BY子句和HAVING子句。
SELECT (子查询) FROM 表名;
SELECT * FROM (子查询) AS 表的别名;
SELECT * FROM (SELECT * FROM result) AS Temp;
select * from `t_student` limit 10,20;
select * from `t_student` order by `stu_age`;
select * from `t_student` where `stu_name` like 'h%';
查询名称不以h开头的数据
select * from `t_student` where `stu_name` not like 'h%';
通配符 % 和 _ 的区别:
% 表示后面可以匹配任何字符。
_ 只替换一个字符
%"通配符可以匹配任意字符,但不能匹配NULL。也就是说,"%"不能匹配数据表中值为NULL的记录
如果查询内容包含通配符,可以使用“\”转义符
select * from `t_student` where `stu_age` between 17 and 19;
select * from `t_student` where `stu_age` is null;
select `stu_name`,`stu_sex` from `t_student` group by `stu_age`;
与 group_count(field) 一起使用
select `stu_name`,GROUP_CONCAT(`stu_sex`) from `t_student` group by `stu_age`;
having查询,这个是正确的,因为它代表了所有的字段,当然必须包含having条件的字段,但是如果这个地方换成具体的字段,没有stu_name,就会报错。
having 通常与 group by 一起使用
select * from `t_student` having `stu_name` = 'hjk';
一个MySQL视图(View)是一个虚拟表。 和真实的表一样,视图也是由列和行组成的,但是视图实际上并不存在于数据库中。 行和列数据来自定义视图的查询中使用的表,也是在使用视图时动态生成的。
数据库只存储视图的定义,不存储视图中的数据。 这些数据都存储在定义视图查询所引用的真实表中。 当使用视图查询数据时,数据库会从真实的表中取出相应的数据。 因此,视图中的数据依赖于真实表中的数据。 一旦真实表中的数据发生变化,视图中显示的数据也会发生变化。
视图可以从原表中选择对用户有用的信息,对用户无用或者用户没有权限了解的信息可以直接屏蔽掉,类似于过滤。 这样做既简化了应用程序,又保证了系统的安全性。
视图与数据表不同,因为它们在以下方面有所不同:
为什么要创建视图
比如student表包含了学生id,姓名等,curriculum表包含了学生选择的课程,上课时间等,如果我们查看class schedule,我们需要学生的姓名和上课时间当然,我们不需要其他无用的信息。 这样我们就可以在这两个表上建立一个视图数据库姓名的缺省值为未知姓名,我们可以直接从这个视图中获取信息。
创建视图
创建视图为
create view view_student_name
as select `stu_name` from `t_student`;
select * from view_student_name;
-- 以表的结构显示
desc view_student_name;
-- 以sql语句显示
SHOW CREATE VIEW 视图名;
-- 随便创个表
create table `t_course`(
`cou_id` int(11) primary key,
`s_id` char(12)
);
-- 创建多表视图
create view v_stu_cou (`stu_id`,`cou_id`)
as select `stu_id`,`cou_id` from `t_student` s,`t_course` c
where s.stu_id=c.s_id;
-- 查看视图结构
desc v_stu_cou
ALTER VIEW <视图名> AS
-- 直接删除,可能已经不存在,会报错
drop view v_stu_cou;
-- 判断是否存在,再删除
drop view if exists v_stu_cou;
指数
索引是由数据表中的一个或多个列组成的一种特殊的数据库结构,可以用来快速查询数据表中具有特定值的记录
通过索引,查询数据时不需要读取记录的所有信息,而只查询索引列。否则,数据库系统会读取每条记录的所有信息来匹配
该索引可以类比为新华字典的音序表。 比如你要查一个词,如果不用拼音顺序,就需要从字典的所有页码中一页一页地查。 但是,如果提取拼音形成顺序表,则只需要直接查找由顺序表确定的那些页面的顺序表即可。 这样可以节省很多时间。
索引的优点和缺点
索引有其明显的优势,也有其不可避免的劣势。
优势
索引的优点如下:
通过创建唯一索引可以保证数据库表中每一行数据的唯一性。
可以在所有 MySQL 列类型上设置索引。
可以大大加快数据的查询速度,这是使用索引的主要原因。
可以加速表与表之间的连接,实现数据的参照完整性。
在使用分组排序子句进行数据查询时,也可以显着减少查询中分组排序的时间
缺点
添加索引也有很多缺点,主要有以下几点:
创建和维护索引组非常耗时,并且随着数据量的增加而增加。
索引需要占用磁盘空间。 除了数据表占用数据空间外,每个索引也占用一定的物理空间。 如果有大量索引,索引文件可能比数据文件更快达到其最大文件大小。
当对表中的数据进行增删改查时,还必须动态维护索引,降低了数据维护的速度。
MySQL 支持以下类型的索引。
(1)B-Tree索引
(2)哈希索引
(3)空间数据索引(R-Tree)
(4)全文索引
(5)其他索引类别
创建索引
创建于 ( [] [ ASC | DESC])
一张表可以创建多个索引,但每个索引在表中的名称是唯一的
CREATE TABLE `t_student` (
`stu_id` char(12) NOT NULL COMMENT '学生id',
`stu_name` varchar(12) NOT NULL COMMENT '学生姓名',
`stu_sex` tinyint(2) unsigned DEFAULT NULL COMMENT '性别:0(男),1(女)',
`stu_age` tinyint(3) unsigned DEFAULT NULL COMMENT '年龄',
PRIMARY KEY (`stu_id`),
KEY `stu_id` (`stu_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='学生基本信息表'
创建唯一索引,还是在同一个位置,添加为唯一索引(字段)
查看索引
show index from `t_student`;
删除索引
删除索引
drop index stu_id on `t_student`;
如果觉得文不错,请三连质量:点赞+转发+关注。 我会努力写出更好的作品与大家分享。 更多进阶JAVA学习资料小编已经打包,可以关注私信找我领取!
原来的
cnblogs.com/hjk-airl/p/16014741.html