MySQL库和表的操作

news2024/11/23 10:40:41

1 什么是数据库?什么是SQL?

科学的组织和存储数据,如何高效获取和维护数据

2 一条SQL语句的执行过程

SQL语句就是一个数据库能够识别的指令语言 

 在实际操作过程中,创建连接,连接MySQL的server

mysql -uroot -P3308 -p

以管理员身份打开命令提示符,输入密码即连接成功

3 库的增删改查

# 查看库
show databases;
# 创建某个库
create database 库名 charset utf8;
# 查看某个库
show create database 库名;
# 修改库的编码
alter database 库名 charset
# 删除某个库
drop database 库名;

4 表的增删改查

create table stu(id int primary key auto_increment,name char(16) not null,age int not null)
# 数据类型
字符串 char(6) varchar(6)  sql_mode 截断 以空间换时间
整型	int
小数 float(5,2) decimal double
日期 date datetime
枚举:enum set()

# 约束条件
not null 
unique
primary key  索引密切相关 查询效率
foreign key

问题:

char与varchar的区别

1 定长和变长

2 存储方式

char存取速度快 varchar节省空间 

# 修改表的名称
alter table stu rename stu_new;
# 修改表的数据类型
alter table stu_new modify name varchar(16);
# 修改表的字段名及数据类型(修改完字段名需要带上数据类型和约束条件)
alter table stu_new change name name_new char(16) not null;
# 新增字段
alter table stu_new add sex enum("男","女");
# 删除字段
alter table  stu_new drop name, drop age;

# desc 表名
desc stu_new;
# show create table 表名 \G;
show create table stu_new \G;

# drop table 表名
drop table stu_new;

5 记录的增删改查

# 语法1:insert into 表名 values(值1,值2,值3....)
# 语法2:insert into 表名(字段1,字段2) values (值1,值2)

# 语法:update 表名 set 字段 = 新值 where 条件

delete from 表名 where 条件;

注:
	不加where条件就是清空表,一定要慎重使用delete

清空表:
       delete from t1; # 如果有自增id,新增的数据,仍然是以删除前的最后一样作为起始。
       truncate table t1;# 数据量大,删除速度比上一条快,且直接从零开始,

查(单表查询+多表查询)

单表查询

语法:
select distinct 字段1,字段2 [,...] from 表名
				where 条件
				group by field
				having 筛选条件
				order by filed
				limit 条数
注:
   group by field 根据什么进行分组,一般是某个字段或多个字段
   order by filed 根据什么进行排序,一般是某个字段或多个字段
   having主要配合group by使用,对分组后的数据进行过滤,里面可以使用聚合函数
   where是针对select查询的过滤,各有区别和用处
   
优先级:
	from
	where
	group by
	select
	distinct
	having
	order by
	limit
解释说明:
	1.先找到表:from
	2.拿着where指定的约束条件,去表中取出符合条件的一条条数据
	3.将取出的数据进行分组group by,如果没有group by,则每行为一组
	4.执行select 查询所指定的字段
	5.若有distinct 则去重
	6.将结果按照条件排序 order by
	7.限制结果的显示条数 limit

问题:为什么having后面可以跟聚合函数,而where却不可以

单表查询所需数据

create table emp(
	id int primary key auto_increment,
	emp_name char(20) not null,
	sex enum("male","female") not null default "male",
	age int(3) unsigned not null default 28,
	hire_date date not null,
	post char(50),
	post_comment char(100),
	salary double(15,2),
	office int,
	depart_id int);
	
-- 插入数据
-- 以下是教学部
insert into emp(emp_name,sex,age,hire_date,post,salary,office,depart_id) values
('huahua','male',18,'20170301','teacher',7300.33,401,1), 
('weiwei','male',78,'20150302','teacher',1000000.31,401,1),
('lala','male',81,'20130305','teacher',8300,401,1),
('zhangsan','male',73,'20140701','teacher',3500,401,1),
('liulaogen','male',28,'20121101','teacher',2100,401,1),
('aal','female',18,'20110211','teacher',9000,401,1),
('zhugelang','male',18,'19000301','teacher',30000,401,1),
('成龙','male',48,'20101111','teacher',10000,401,1),

-- 以下是销售部门
('歪歪','female',48,'20150311','sale',3000.13,402,2),
('丫丫','female',38,'20101101','sale',2000.35,402,2),
('丁丁','female',18,'20110312','sale',1000.37,402,2),
('星星','female',18,'20160513','sale',3000.29,402,2),
('格格','female',28,'20170127','sale',4000.33,402,2),

-- 以下是运营部门
('张野','male',28,'20160311','operation',10000.13,403,3), 
('程咬金','male',18,'19970312','operation',20000,403,3),
('程咬银','female',18,'20130311','operation',19000,403,3),
('程咬铜','male',18,'20150411','operation',18000,403,3),
('程咬铁','female',18,'20140512','operation',17000,403,3)
;

题目

1 查询姓名末尾的那个字符
substring(string,position,length); mid(文本,截止字符的起点,截多长)

例如:select emp_name,substring(emp_name,-1) as new_name from emp;


2 查询以"程"开头的三个字的员工信息(_ %)  excel(?*)

select * from emp where emp_name like "程__";


3 查询以"z"开头的员工信息

select * from emp where emp_name like "z%";


4 计算每个部门都有多少人?大于6个人的部门有哪些?

select post,count(emp_name) 人数 from emp group by post having count(emp_name) > 6;


5 计算每个部门的平均工资并从高到低排序

select post,avg(salary) as avg_salary from emp group by post;

6 更新

提示:

单独更新一个字段
update 表名 set 字段1 = 新值1,
			where 条件;

更新多个字段
update 表名 set 字段1 = 新值1,
			字段2 = 新值2
			where 条件;

如果部门为教学部,则post_comment填写:优质课程,优秀讲师,棒棒哒
如果部门为销售部,则post_comment填写:每个人都是公司的一张名片
如果部门为运营部,则post_comment填写:好的运营,一定是节约成本的同时带来最大的收益

 多表查询

准备数据

create table dep(
	id int primary key,
	name char(20)
);
create table emp(
	id int primary key auto_increment,
	name char(20),
	sex enum("male","female") not null default "male",
	age int,
	dep_id int
);

-- 插入数据
insert into dep values
(200,'技术'),
(201,'人力资源'),
(202,'销售'),
(203,'运营');

insert into emp(name,sex,age,dep_id) values
('ailsa','male',18,200),
('lala','female',48,201),
('huahua','male',38,201),
('zhangsan','female',28,202),
('zhaosi','male',18,200),
('shenteng','female',18,204)
;

题目

1 连表查询 查询每个部门的员工信息?查询每个员工所在部门信息?查询所有员工及所有部门的员工部门信息?
2 子查询 查询平均年龄在25岁以上的部门名
3 查询大于所有人平均年龄的员工与年龄

复杂的多表查询

准备数据

CREATE TABLE class (
  cid int(11) NOT NULL AUTO_INCREMENT,
  caption varchar(32) NOT NULL,
  PRIMARY KEY (cid)
) ENGINE=InnoDB CHARSET=utf8;

INSERT INTO class VALUES
(1, '三年二班'), 
(2, '三年三班'), 
(3, '一年二班'), 
(4, '二年九班');

CREATE TABLE teacher(
  tid int(11) NOT NULL AUTO_INCREMENT,
  tname varchar(32) NOT NULL,
  PRIMARY KEY (tid)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO teacher VALUES
(1, '张蒙老师'), 
(2, '李超老师'), 
(3, '刘颜老师'), 
(4, '朱西老师'), 
(5, '李湿老师');

CREATE TABLE course(
  cid int(11) NOT NULL AUTO_INCREMENT,
  cname varchar(32) NOT NULL,
  teacher_id int(11) NOT NULL,
  PRIMARY KEY (cid),
  KEY fk_course_teacher (teacher_id),
  CONSTRAINT fk_course_teacher FOREIGN KEY (teacher_id) REFERENCES teacher (tid)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO course VALUES
(1, '生物', 1), 
(2, '物理', 2), 
(3, '体育', 3), 
(4, '美术', 2);

CREATE TABLE student(
  sid int(11) NOT NULL AUTO_INCREMENT,
  gender char(1) NOT NULL,
  class_id int(11) NOT NULL,
  sname varchar(32) NOT NULL,
  PRIMARY KEY (sid),
  KEY fk_class (class_id),
  CONSTRAINT fk_class FOREIGN KEY (class_id) REFERENCES class (cid)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO student VALUES
(1, '男', 1, '理解'), 
(2, '女', 1, '钢蛋'), 
(3, '男', 1, '张三'), 
(4, '男', 1, '张一'), 
(5, '女', 1, '张二'), 
(6, '男', 1, '张四'), 
(7, '女', 2, '铁锤'), 
(8, '男', 2, '李三'), 
(9, '男', 2, '李一'), 
(10, '女', 2, '李二'), 
(11, '男', 2, '李四'), 
(12, '女', 3, '如花'), 
(13, '男', 3, '刘三'), 
(14, '男', 3, '刘一'), 
(15, '女', 3, '刘二'), 
(16, '男', 3, '刘四');

CREATE TABLE score (
  sid int(11) NOT NULL AUTO_INCREMENT,
  student_id int(11) NOT NULL,
  course_id int(11) NOT NULL,
  num int(11) NOT NULL,
  PRIMARY KEY (sid),
  KEY fk_score_student (student_id),
  KEY fk_score_course (course_id),
  CONSTRAINT fk_score_course FOREIGN KEY (course_id) REFERENCES course (cid),
  CONSTRAINT fk_score_student FOREIGN KEY (student_id) REFERENCES student(sid)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO score VALUES
(1, 1, 1, 10),
(2, 1, 2, 9),
(5, 1, 4, 66),
(6, 2, 1, 8),
(8, 2, 3, 68),
(9, 2, 4, 99),
(10, 3, 1, 77),
(11, 3, 2, 66),
(12, 3, 3, 87),
(13, 3, 4, 99),
(14, 4, 1, 79),
(15, 4, 2, 11),
(16, 4, 3, 67),
(17, 4, 4, 100),
(18, 5, 1, 79),
(19, 5, 2, 11),
(20, 5, 3, 67),
(21, 5, 4, 100),
(22, 6, 1, 9),
(23, 6, 2, 100),
(24, 6, 3, 67),
(25, 6, 4, 100),
(26, 7, 1, 9),
(27, 7, 2, 100),
(28, 7, 3, 67),
(29, 7, 4, 88),
(30, 8, 1, 9),
(31, 8, 2, 100),
(32, 8, 3, 67),
(33, 8, 4, 88),
(34, 9, 1, 91),
(35, 9, 2, 88),
(36, 9, 3, 67),
(37, 9, 4, 22),
(38, 10, 1, 90),
(39, 10, 2, 77),
(40, 10, 3, 43),
(41, 10, 4, 87),
(42, 11, 1, 90),
(43, 11, 2, 77),
(44, 11, 3, 43),
(45, 11, 4, 87),
(46, 12, 1, 90),
(47, 12, 2, 77),
(48, 12, 3, 43),
(49, 12, 4, 87),
(52, 13, 3, 87);

这五个表的联系

题目

1 查询成绩最好的前两名学生姓名

select * from stu where num = (select max(num) from stu)
union all
select * from stu where num = (select max(num) from stu where num<(select max(num) from stu));


2 查询每门课程成绩最好的前两名学生姓名

创建视图

虚拟的表

create view stu as

select s.sid,gender,sname,caption,cname,tname,num from student s
left join class c on s.class_id = c.cid
left join score s1 on s.sid = s1.student_id
left join course c1 on s1.course_id = c1.cid 
left join teacher t on t.tid = c1.teacher_id


第二题 查询每门课程成绩最好的前两名学生姓名
select s.* from stu s
left join
(select max(num) max_num,cname from stu group by cname ) s1 on s.cname = s1.cname
where num = max_num
union all

select s.* from stu s
left join

(select s.cname,max(num) second_num from stu s
left join
(select max(num) max_num,cname from stu group by cname ) s1 on s.cname = s1.cname
where num < max_num
group by s.cname) m on s.cname = m.cname
where s.num = second_num

order by cname,num desc

 6  窗口函数

实现 查询每门课程成绩最好的前两名学生姓名

select * from (select *,dense_rank() over(order by num desc) as rank_num from stu) as e where rank_num<=2;

介绍窗口函数

语法

完整语法
函数名([字段]) over(partition by 字段名 order by 字段名)
聚合函数:sum count avg max min
排名函数 row_number rank dense_rank ntile
其他:lag lead first_value last_value

聚合开窗的用法

-- 题目1 计算每个学生的及格科目数
select sname,count(sname) from stu  where num>=60 group by sname;

select *,count(sname) over(partition by sname) 及格的个数 from stu where num>=60
order by sname;

-- 每个人的成绩与自己总的平均分的差距
select *, avg(num) over(partition by cname order by cname) as avg_score from stu where num>0
;

排名开窗函数

select s.sid,s1.sname,s1.gender,c.cname,s.num,  row_number() over 
(partition by c.cname order by num desc) as row_number排名,   
rank() over (partition by c.cname order by num desc) as rank排名,   
dense_rank() over (partition by c.cname order by num desc) as dense_rank排名,   
ntile(6) over (partition by c.cname order by num desc) as ntile排名    
from score s   join student s1 on s.student_id = s1.sid   
left join course c on s.course_id = c.cid

作弊次数的案例

select uid,count(uid) 作弊次数 from 
(select *,lead(login_time,1) over(partition by uid order by login_time) as new_time,
TIMESTAMPDIFF(SECOND,login_time,(lead(login_time,1) over(partition by uid order by login_time) ))/60 相差秒数
from lag_table) as e
where 相差秒数<=2 group by uid

last_value

select s.sid,s1.sname,s1.gender,c.cname,s.num,
last_value(num) over(partition by c.cname order by c.cname) as last_value用法 
from score s   join student s1 on s.student_id = s1.sid   
left join course c on s.course_id = c.cid

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/457336.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PMP证书备考攻略+PMP知识点汇总

一&#xff0c;考PMP好处多 1.能力提升 大型项目&#xff0c;领导专业团队 2.升职加薪 晋升管理岗&#xff0c;优先升职加薪 3.招投标加分 具有PMP证书&#xff0c;企业招标有加分 4.转型利器 助力转型&#xff0c;拓宽职业发展 5.公司支持 企业鼓励学习&#xff0c;报销费用 6…

LVS负载均衡-DR

1.DR模式中每台主机都有一个VIP地址 虚拟网址放在lo网卡上&#xff08;回环网卡&#xff09; arp_ignore1 Arp_announce2 系统不使用IP包的源地址来设置ARP请求的源地址&#xff0c;而选择发送接口的IP地址 2.内核参数修改 3.vim /etc/rc.conf 开机自启动 Chmod x /etc/rc.d…

Spring Security实战(六)—— 跨域与CORS

跨域是一种浏览器同源安全策略&#xff0c;即浏览器单方面限制脚本的跨域访问。 一、认识跨域 跨域&#xff08;Cross-Origin&#xff09;指的是在Web开发中&#xff0c;当一个网页的内容要从不同源&#xff08;即不同的域名、协议或端口&#xff09;获取时&#xff0c;就会发…

时序分析与时序约束知识总结

文章目录 时序分析如何查看时序报告时序分析的分类和任务HOLD违例修复&#xff1a;SETUP违例修复&#xff1a;时序违例的修复 时序约束约束的分类时序约束的作用SDF文件OCVPVT共同路径悲观效应(CPP)setup time与hold time和什么有关clock Jitter与clock Skewsetup和hold裕度计算…

10.java程序员必知必会类库之邮件

前言 邮件功能在当前互联网应用中已经是很成熟的功能&#xff0c;也是作为java程序员应该掌握的技能。常见使用场景有&#xff1a; 电商软件开电子发票&#xff0c;需要发到用户邮箱里面生产实时报警&#xff0c;需要发到邮箱里面银行软件申请的征信报告&#xff0c;电子账单…

Django框架之Admin站点管理

Django的强大体现在其内置的Admin模块可以使得开发人员在不做任何编码的情况下就拥有网站后台管理功能。 概述 内容发布&#xff1a;负责添加、修改、删除内容 内容访问查看 配置admin应用 在settings.py中添加django.contrib.admin 默认已添加 创建管理员账户 python man…

九、1~8文章的阶段案例

一、案例 现在我们来做一个相对综合一点的练习&#xff1a;书籍购物车 案例说明&#xff1a; 1.在界面上以表格的形式&#xff0c;显示一些书籍的数据&#xff1b;2.在底部显示书籍的总价格&#xff1b;3.点击或者-可以增加或减少书籍数量&#xff08;如果为1&#xff0c;那…

【论文精读】ISBI 2022 - Retinal Vessel Segmentation with Pixel-wise Adaptive Filters

【论文精读】ISBI 2022 - Retinal Vessel Segmentation with Pixel-wise Adaptive Filters 【论文原文】&#xff1a;Retinal Vessel Segmentation with Pixel-wise Adaptive Filters 【作者信息】&#xff1a;Li, Mingxing and Zhou, Shenglong and Chen, Chang and Zhang, …

【Linux】线程-线程控制

线程控制 线程控制线程创建线程终止线程等待分离线程 线程控制 使用线程需要注意的是&#xff0c;需要引入头文件pthread.h&#xff0c;并且在编译的时候&#xff0c;需要使用-lpthread 线程创建 int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*…

QT中TCP的学习

文章目录 qt中TCP的实现 qt中TCP的实现 学习视频 QT中可以通过TCP协议让服务器和客户端之间行通信。服务器和客户端的具体流程 下方的信号都是系统提供的&#xff0c;我们只需要写相应的槽函数 A、服务器&#xff1a; 创建QTcpServer对象启动服务器&#xff08;监听&…

Flutter ListView组件详解

今天是2023年4月24日 今天重新复习了一下关于ListView的内容&#xff0c;现在就重新整理一下关于ListView的内容和理解 : (1)ListView和Column之间有什么区别&#xff1f; 在我理解中ListView和Column都是可以有很多子组件的组件&#xff0c;它们之间区别在于它们排列的形式和…

python实现AI写歌词GUI版本【文末源码】

**引言&#xff1a;**自然语言处理作为人工智能的一个重要分支&#xff0c;在我们的生活中得到了广泛应用。其中RNN算法作为自然语言处理的经典算法之一&#xff0c;是文本生成的重要手段。而今天我们就将利用RNN算法建立一个写歌词的软件。其中的界面如下&#xff1a; RNN指的…

使用binding时,LayoutSubscribeFragmentBinding报错

LayoutRecommendFragmentBinding是一个DataBinding类&#xff0c;它由编译器自动生成&#xff0c;用于访问布局文件中的视图。如果你在代码中看到LayoutRecommendFragmentBinding报红&#xff08;提示未解析的引用&#xff09;&#xff0c;可能有以下原因&#xff1a; 1. 检查…

Docker 的数据管理(dockerfile)

Docker 的数据管理&#xff08;dockerfile&#xff09; 管理 Docker 容器中数据数据卷数据卷容器端口映射 容器互联&#xff08;使用centos镜像&#xff09;Docker 镜像的创建1&#xff0e;基于现有镜像创建2&#xff0e;基于本地模板创建3&#xff0e;基于Dockerfile 创建镜像…

Android主流网络请求开源库的对比

目录 一、为什么要用网络请求开源库&#xff1f; 网络请求开源库是一个将网络请求的相关功能封装好的类库 没有网络请求框架之前 App想与服务器进行网络请求交互是一件很痛苦的事&#xff1a;因为Android的主线程不能进行网络请求&#xff0c;需另开1个线程请求、考虑到线程池…

软件工程开发文档写作教程(03)—开发文档的必备条件

本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl本文参考资料&#xff1a;电子工业出版社《软件文档写作教程》 马平&#xff0c;黄冬梅编著 必备条件概述 软件系统配备软件文档不仅对于公司非常有益&#xff0c;而且也能够让客户从中…

【Linux】【配置】网络连接

NetworkManager介绍 NetworkManager 是一个在 Linux 系统上管理网络连接的系统服务和工具。它可以自动配置和管理有线、无线、移动宽带和虚拟专用网络 (VPN) 连接&#xff0c;以及其他类型的网络连接。 NetworkManager 提供了一种简单且易于使用的方法来管理网络连接&#xff…

JSP、JSTL标签

<!-- JSTL的表达式的依赖--><dependency><groupId>taglibs</groupId><artifactId>standard</artifactId><version>1.1.2</version></dependency><!--Standard标签库--><dependency><groupId>java…

QGroundControl之安装调试

QGroundControl之安装调试 1. 源由2. 问题汇总2.1 摄像头播放问题2.2 Windows电脑录像和拍照保存位置2.3 Android设备录像和拍照保存位置 3. 打包资料4. 附录-QGroundControl-Video Streaming5. 附录-QGroundControl效果图6. 参考资料 1. 源由 开源软件的好处就是免费&#xf…

数字政府智慧政务一网通办解决方案2022(ppt可编辑)

本资料来源公开网络&#xff0c;仅供个人学习&#xff0c;请勿商用&#xff0c;如有侵权请联系删除。 建设成效 让政务服务全流程更“好办、智办” 智慧政务“111”架构 服务门户 统一入口、多端同步&#xff0c;一网融合、数据同源 服务门户 智能客服、智能问答、智能外呼实现…