当前位置:网站首页>第4阶段 Mysql数据库

第4阶段 Mysql数据库

2022-07-06 09:15:00 @小蜗牛

目录

学习网址

点此跳转:https://www.educoder.net/shixuns/rx56kula/challenges

4-1MySQL数据库 - 初识MySQL

输入命令:mysql -u用户名 -p密码
在平台上连接数据库还需要加上一句-h127.0.0.1。

mysql -uroot -p123123 -h127.0.0.1
create database MyDb;
show databases;

注意别忘了末尾的分号;

第2关:创建表

数据库中的数据是存放在一张一张的表中的。
你可以想象数据库就像一个文件夹,而表你可以理解为一个excel表格,其实他们本来就挺像。

mysql -uroot -p123123 -h127.0.0.1
create database TestDb;
show databases;
use TestDb;
create table  t_emp (  
    id Int,  
    name VARCHAR(32),  
    deptId Int,
    salary FLOAT
);  
desc  t_emp;

第3关:使用主键约束

mysql -uroot -p123123 -h127.0.0.1
create database MyDb;
show databases;
use MyDb;
create table  t_user1 (  
    userId Int PRIMARY KEY,  
    name VARCHAR(32), 
    password VARCHAR(11),
    phone VARCHAR(11),
    email VARCHAR(32)
);  
desc  t_user1;
create table  t_user2 (  
    name VARCHAR(32), 
    phone VARCHAR(11),
    email VARCHAR(32),
    PRIMARY KEY(name,phone)
);  
desc t_user2;

第4关:外键约束

mysql -uroot -p123123 -h127.0.0.1
create database MyDb;
show databases;
use MyDb;
create table  t_class(  
    id Int PRIMARY KEY,  
    name VARCHAR(22)
);  
desc  t_class;
create table  t_student(  
    id Int PRIMARY KEY,  
    name VARCHAR(22),
    classId Int,
    CONSTRAINT fk_stu_class1 FOREIGN KEY(classId) REFERENCES t_class(Id)
);  
desc t_student;

第5关:添加常用约束

设置表的属性值自动增加 AUTO_INCREMENT
在这里插入图片描述

mysql -uroot -p123123 -h127.0.0.1
create database MyDb;
show databases;
use MyDb;
create table t_user(  
    id Int PRIMARY KEY auto_increment,  
    username VARCHAR(32) not null unique,
    sex VARCHAR(4) default '男'
)DEFAULT CHARSET=utf8;  

4-2MySQL数据库 - 数据库和表的基本操作(一)

第1关:查看表结构与修改表名

语法规则为:DESCRIBE 表名;  

大小写不敏感哟!

在这里插入图片描述
再告诉大家一个小诀窍,是不是觉得返回的结果排版有点乱。我们加上\G后效果就会有所改善哟,来看看!

在这里插入图片描述

USE Company;

#请在此处添加实现代码
########## Begin ##########

########## modify the table name ##########
alter table tb_emp rename jd_emp;


########## show tables in this database ##########
show tables;


########## describe the table ##########
desc jd_emp;


########## End ##########

第2关:修改字段名与字段数据类型

在这里插入图片描述
在这里插入图片描述

USE Company;

#请在此处添加实现代码
########## Begin ##########

########## change the column name ##########
alter table tb_emp change Id prod_id int(11);


########## change the data type of column ##########
alter table tb_emp modify Name varchar(30);


########## End ##########

DESCRIBE tb_emp;

第3关:添加与删除字段

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

USE Company;

#请在此处添加实现代码
########## Begin ##########

########## add the column ##########
alter table tb_emp add Country varchar(20) after Name;

 
########## delete the column ##########

alter table tb_emp drop Salary;

########## End ##########

DESCRIBE tb_emp;

第4关:修改字段的排列位置

在这里插入图片描述

USE Company;

#请在此处添加实现代码
########## Begin ##########

########## modify the column to top ##########

alter table tb_emp modify Name varchar(25) first;

########## modify the column to the rear of another column ##########

alter table tb_emp modify DeptId int(11) after Salary;
########## End ##########

DESCRIBE tb_emp;

第5关:删除表的外键约束

在这里插入图片描述

USE Company;

#请在此处添加实现代码
########## Begin ##########

########## delete the foreign key ##########

alter table tb_emp drop FOREIGN KEY emp_dept;

########## End ##########
SHOW CREATE TABLE tb_emp \G;

4-3MySQL数据库 - 数据库和表的基本操作(二)

第1关:插入数据

在这里插入图片描述
插入一列
在这里插入图片描述

ERROR 1062 (23000) at line 8: Duplicate entry ‘0’ for key ‘PRIMARY’
原因:主键字段有两条为0的记录,冲突。(设置主键自增解决)( duplicate重复)

USE Company;

#请在此处添加实现代码
########## Begin ##########

########## bundle insert the value ##########
insert into tb_emp (Id,Name,DeptId,Salary) 
values(1,'Nancy',301,2300),(2,'Tod',303,5600),(3,'Carly',301,3200);

########## End ##########
SELECT * FROM tb_emp;

第2关:更新数据

在这里插入图片描述

UPDATE Mall_products2  
SET country_name = "Pakistan", country_id = 92  
WHERE id = 2;  
USE Company;

#请在此处添加实现代码
########## Begin ##########

########## update the value ##########
update tb_emp 
set Name="Tracy",DeptId=302,Salary=4300.00
where Id = 3;


########## End ##########

SELECT * FROM tb_emp;

注意:最后一句要加分号;其次,单双引号要注意区分

第3关:删除数据

在这里插入图片描述
对表操作,用drop
对行操作,用delete

在这里插入图片描述

4-4MySQL数据库 - 单表查询(一)

第1关:基本查询语句

在这里插入图片描述

第2关带 IN 关键字的查询

在这里插入图片描述

第3关带 BETWEEN AND 的范围查询

在这里插入图片描述
在这里插入图片描述

4-5MySQL数据库 - 单表查询(二)

第1关带 LIKE 的字符匹配查询

在这里插入图片描述
在这里插入图片描述

第2关查询空值与去除重复结果

在这里插入图片描述
在这里插入图片描述

USE Company;

######### Begin #########
select *
from tb_emp
where DeptId is null;

######### End #########

######### Begin #########
select distinct Name
from tb_emp;


######### End #########


第3关带 AND 与 OR 的多条件查询

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

USE Company;

######### Begin #########
#使用关键字AND返回数据表中字段DeptId为301并且薪水大于3000的所有字段的内容,

select *
from tb_emp
where DeptId=301 and Salary>3000;
######### End #########

######### Begin #########
#使用关键字IN返回数据表中字段DeptId为301和303的所有字段的内容。
select *
from tb_emp
where DeptId in (301,303);
######### End #########


4-6MySQL数据库 - 单表查询(三)

第1关对查询结果进行排序

SELECT 字段名 FROM 表名 ORDER BY 字段名 [ASC[DESC]]; 

ASC 升序关键字
DESC 降序关键字

第2关分组查询

在这里插入图片描述

第3关使用 LIMIT 限制查询结果的数量

在这里插入图片描述

USE School;

#请在此处添加实现代码
########## Begin ##########

########## 查询班级中第2名到第5名的学生信息 ##########
select *
from tb_score
order by score desc
limit 1,4;#从第二条记录开始往后查看4条数据(不包含第一条):

########## End ##########

4-7MySQL数据库 - 使用聚合函数查询

第1关:COUNT( )函数

在这里插入图片描述

USE School;

#请在此处添加实现代码
########## Begin ##########

########## 查询该表中一共有多少条数据 ##########
select count(*)
from tb_class;

########## 查询此表中367班有多少位学生 ##########
select classid,count(*)
from tb_class
where classid=367;

########## End ##########

第2关SUM( )函数

在这里插入图片描述

USE School;

#请在此处添加实现代码
########## Begin ##########

########## 查询所有学生总分数 ##########
select sum(score)
from tb_class;

########## 查询学生语文科目的总分数 ##########
select course,sum(score)
from tb_class
where course="语文";



########## End ##########

第3关AVG( )函数

在这里插入图片描述

第4关MAX( )函数

在这里插入图片描述

第5关MIN( )函数

4-8MySQL数据库 - 连接查询

第1关内连接查询

在这里插入图片描述

USE School;

########## 查询数据表中学生姓名和对应的班级 ##########
#请在此处添加实现代码
########## Begin ##########
select tb_student.name as studentName, tb_class.name as className 
from tb_student join tb_class
on tb_student.class_id=tb_class.id;

########## End ##########


第2关外连接查询

在这里插入图片描述

USE School;

########## 使用左外连接查询所有学生姓名和对应的班级 ##########

#请在此处添加实现代码
########## Begin ##########

select tb_student.name as studentName, tb_class.name as className 
from tb_student left join tb_class
on tb_student.class_id=tb_class.id;


########## End ##########

########## 使用右外连接查询所有学生姓名和对应的班级 ##########

#请在此处添加实现代码
########## Begin ##########

select tb_student.name as studentName, tb_class.name as className 
from tb_student right join tb_class
on tb_student.class_id=tb_class.id;


########## End ##########

第3关复合条件连接查询

USE School;

########## 查询所有班级里分数在90分以上的学生的姓名和学生的成绩以及学生所在的班级 ##########
#请在此处添加实现代码
########## Begin ##########
select tb_student.name as studentName, score,tb_class.name as className 
from tb_student left join tb_class
on tb_student.class_id=tb_class.id
where score>90
order by score desc;

########## End ##########


4-9MySQL数据库 - 子查询

第1关带比较运算符的子查询

在这里插入图片描述
在这里插入图片描述

USE Company;

#请在此处添加实现代码
########## Begin ##########
#1.查询大于所有平均年龄的员工姓名与年龄
select name,age
from tb_emp
where age>all(
    select avg(age)
    from tb_emp);


########## End ##########

第2关关键字子查询

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

USE Company;
#请在此处添加实现代码
########## Begin ##########

#1.使用 ALL 关键字进行查询
select position,salary
from tb_salary
where salary>all(
    select max(salary)
    from tb_salary
    where position="Java"
);
#2.使用 ANY 关键字进行查询
select position,salary
from tb_salary
where salary>ANY(
    select min(salary)
    from tb_salary
    where position="Java"
);
#3.使用 IN 关键字进行查询
select position,salary
from tb_salary
where salary in (
    select salary
    from tb_salary
    where position="Java"
);
########## End ##########

4-10MySQL数据库 - 分组选择数据

第1关GROUP BY 与 聚合函数

在这里插入图片描述
在这里插入图片描述

USE School;

#请在此处添加实现代码
########## Begin ##########

#1.查询表中2,3,4年级中分别男女的总人数
select gradeId,sex,count(*)
from student
where gradeId in(2,3,4)
group by  gradeId,sex;


########## End ##########

第2关使用 HAVING 与 ORDER BY

在这里插入图片描述

USE School;

#请在此处添加实现代码
########## Begin ##########

#1.查询表中至少有两门课程在90分以上的学生信息
select sno,count(*)
from tb_grade
where score>=90
group by sno
having count(*)>=2;


#2.查询表中平均成绩大于90分且语文课在95分以上的学生信息
select sno,avg(score)
from tb_grade
where sno in(
    select distinct sno 
    from tb_grade
    where pno="语文" and score>=95)
group by sno
having avg(score)>=90;

########## End ##########

4-11MySQL开发技巧 - 分页和索引

第1关MySQL 分页查询

在这里插入图片描述
在这里插入图片描述

USE Products;
#请在此处添加实现代码
########## Begin ##########

#1.分页查询
select prod_id 
from products
limit 5,5;

#2.用子查询优化分页查询语句
select prod_id 
from products
where prod_id >=(
    select prod_id  
    from products
    limit 10,1
    )
limit 5;

########## End ##########

第2关索引(单列索引)

单列索引分类和创建
我们使用最常见的是单列索引,分为主键索引、普通索引和唯一索引。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

USE Students;
#请在此处添加实现代码
########## Begin ##########

#1.创建student表结构并且设置id为主键索引
CREATE TABLE student(  
    id  int(11) NOT NULL AUTO_INCREMENT,
    name varchar(20) NOT NULL,
    score int(10),
    PRIMARY KEY (id)
); 
#2.对name建立唯一索引
CREATE unique INDEX name_index on  `student`(`name`);

#3.对score建立普通索引
CREATE  INDEX score_index on  `student`(`score`);
SHOW INDEX FROM student;
########## End ##########

第3关索引(组合索引)

4-12数据库设计 - 博客系统

--创建数据库
CREATE DATABASE blog_db;
use blog_db;

--在blog_db库中创建t_user表 
--用户信息表
CREATE TABLE t_user
(
	userId BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '用户ID',--低版本编程环境不能识别AUTO_INCREMENT,换成IDENTITY(1,1)
	username VARCHAR(32) NOT NULL COMMENT'用户名',--COMMENT 备注
	password VARCHAR(32) NOT NULL COMMENT'密码',
	user_sex VARCHAR(6) NOT NULL DEFAULT '0' COMMENT'性别0代表男 1代表女',--设置默认值 DEFAULT
	email VARCHAR(64) COMMENT'邮箱',
	phone VARCHAR(11) NOT NULL COMMENT'手机号码',
	firstname VARCHAR(6) COMMENT'姓',
	lastname VARCHAR(12) COMMENT'名',
	avatar VARCHAR(255) COMMENT'头像地址',
	is_superuser INT(11) NOT NULL DEFAULT 0 COMMENT'是否是管理员 0代表不是 1代表是',
	last_login DATETIME COMMENT'上一次登录时间',
	user_register_time DATETIME COMMENT'上一次登录时间',
	PRIMARY KEY (userId)--主键
);

/*创建blog_type、t_blog、t_comment表,并建立表之间的关系博客类型表和博客信息表是一对多的关系, 博客评论表和博客信息表是多对一的关系,用户信息表与博客信息表、博客评论表是一对多的关系。*/
--博客类型表
CREATE TABLE blog_type
(
	type_id INT NOT NULL AUTO_INCREMENT COMMENT'类型id',
	type_name VARCHAR(32) NOT NULL COMMENT'类型名称',   
	PRIMARY KEY(type_id)
);

--博客信息表
CREATE TABLE t_blog 
(
	blog_id BIGINT NOT NULL AUTO_INCREMENT COMMENT'博客id',
	blog_title VARCHAR(100) NOT NULL COMMENT'博客标题',
	blog_content LONGTEXT NOT NULL COMMENT'博客内容',
	userid BIGINT COMMENT'创建人id',
	type_id INT COMMENT'类型id',
	blog_status INT NOT NULL DEFAULT '0' COMMENT'博客状态 1为发布 0为草稿',
	create_time DATETIME NOT NULL COMMENT'创建时间',
	update_time DATETIME NOT NULL COMMENT'更新时间',
	cover_image VARCHAR(255) COMMENT'封面图片',
	PRIMARY KEY(blog_id),
	CONSTRAINT FK_user_id FOREIGN KEY (userid) REFERENCES t_user(userId),--重命名外键
	CONSTRAINT FK_type_id FOREIGN KEY (type_id) REFERENCES blog_type(type_id)
);

--博客评论表
CREATE TABLE t_comment
(
	comment_id BIGINT NOT NULL AUTO_INCREMENT COMMENT'评论id',
	comment_content VARCHAR(500) NOT NULL COMMENT'评论内容',
	blog_id BIGINT NOT NULL COMMENT'评论内容',
	createtime DATETIME NOT NULL COMMENT'评论时间',
	userid BIGINT NOT NULL COMMENT'评论人ID',
	replyid INT NOT NULL COMMENT'评论回复人ID',
	PRIMARY KEY(comment_id),
	CONSTRAINT FK_comment_user_id FOREIGN KEY(userid) REFERENCES t_user(userId),
	CONSTRAINT FK_comment_blog_id FOREIGN KEY(blog_id) REFERENCES t_blog(blog_id)
);

--创建博客标签表(t_tag),并建立表之间的关系
CREATE TABLE t_tag
(
	tag_id INT(11) NOT NULL AUTO_INCREMENT,
	tag_name VARCHAR(32) NOT NULL,
	PRIMARY KEY(tag_id)
);

/*设计了一个中间表,分别与博客信息表和博客标签表是一对多的关系, 这样博客标签表(t_tag)就和博客信息表(t_blog)是多对多的关系了。*/
CREATE TABLE t_tag_blog
(
	tag_id INT(11),
	blog_id BIGINT(20),
	FOREIGN KEY(tag_id) REFERENCES t_tag(tag_id),
	FOREIGN KEY(blog_id) REFERENCES t_blog(blog_id)
);




4-13数据库查询 - 选课系统

USE School;

#请在此添加实现代码
########## Begin ##########
########## 插入学生表(Student)相应数据 ##########
insert into  student(Sno,Sname,Ssex,Sage,Sdept) 
values('9512101','李勇','男',19,'计算机系'),
        ('9512102','刘晨','男',20,'计算机系'),
        ('9512103','王敏','女',20,'计算机系'),
        ('9521101','张立','男',22,'信息系'),
        ('9521102','吴宾','女',21,'信息系'),
        ('9521103','张海','男',20,'信息系'),
        ('9531101','钱小平','女',18,'数学系'),
        ('9531102','王大力','男',19,'数学系');


########## 插入课程表(Course)相应数据 ##########
insert into course(Cno,Cname,Ccredit,Semster,Period)
values('C01','计算机文化学',3,1,41),
    ('C02','VB',2,3,61),
    ('C03','计算机网络',4,7,14),
    ('C04','数据库基础',6,6,24),
    ('C05','高等数学',8,2,19),
    ('C06','数据结构',5,4,55);

########## 插入学生选课表(DBSC)相应数据 ##########
insert into dbsc(ScID,Sno,Cno,Grade,isTec) 
values(1,9512101,'c01',90,'必修'),
    (2,9512101,'c02',86,'选修'),
    (3,9512101,'c06',45,'必修'),
    (4,9512102,'c02',78,'选修'),
    (5,9512102,'c04',66,'必修'),
    (6,9521102,'c01',82,'选修'),
    (7,9521102,'c02',75,'选修'),
    (8,9521102,'c04',92,'必修'),
    (9,9521102,'c05',50,'必修'),
    (10,9521103,'c02',68,'选修'),
    (11,9521103,'c06',56,'必修'),
    (12,9531101,'c01',80,'选修'),
    (13,9531101,'c05',95,'必修'),
    (14,9531102,'c05',85,'必修');
########## End ##########


########## 查询表数据 ##########
SELECT * FROM student;
SELECT * FROM course;
SELECT * FROM dbsc;

#********* Begin *********#
echo " select Sname,Sdept from student where Sdept='计算机系'; select Sno from dbsc where Grade<60; select Sname,Sdept,Sage from student where Sage between 20 and 23 and Sdept='信息系'; select Sno,Grade from dbsc where Cno='c02' order by Grade desc; select count(*) from student; "
#********* End *********#

第3关:进阶查询

#********* Begin *********#
echo " select student.* from student where Sname like '张%'; select Sname,Ssex,Sdept from student where Sdept in ('计算机系','信息系','数学系'); select Cno, count(*) from dbsc where isTec='选修' group by Cno; select Sno from dbsc group by Sno Having count(*)>3; select Sname, Cno, Grade from student,dbsc where student.Sno=dbsc.Sno and Sdept='计算机系'; "
#********* End *********#



在这里插入图片描述
也不能再echo中加入#注释

第4关:复杂查询

#********* Begin *********#
echo " select distinct student.Sno,student.Sname from dbsc,student where student.Sno=dbsc.Sno and isTec='选修'; select Sname,count(*),avg(Grade) from dbsc,student where student.Sno=dbsc.Sno group by dbsc.Sno Having avg(Grade); select avg(Grade),count(*) from dbsc group by Sno having count(*)>=4; select student.Sname, dbsc.Cno, dbsc.Grade from student left join dbsc on student.Sno=dbsc.Sno where student.Sdept='信息系' and dbsc.isTec='选修' and Cno='C02'; update dbsc set Grade = Grade+5 where Grade<60; "
#********* End *********#

原网站

版权声明
本文为[@小蜗牛]所创,转载请带上原文链接,感谢
https://blog.csdn.net/Manonll/article/details/124973230