mysql数据库:mysql增删改、单表、多表及子查询
insert [into] 表名[(可选字段名)] values(一堆值1),(一堆值2),.....
into 可以省略
表名后的字段可以选
如果写了 后面的values中的值必须与表名后的字段一一对应
如果没写 后面的values中的值必须与表的所有字段一一对应
values后面可以给多组值 用逗号隔开
delete from 表名[where 条件]
条件不写 是删除所有记录 是一行一行删除 注意自增id 不会归零
truncate 重建表 先记录表结构 删除整个表再重新建出来表 自增id 会归零
update 表名 set 字段名 = 值[,字段2 = 值2],[where 条件]
可以一次性修改多个字段的值用逗号隔开
条件如果不写 修改所有记录
不带关键字的查询
select {1.*|2.字段名|3.四则运行|4.聚合函数} from 表名 [where 条件]
1.* 表示查询所有字段
2.可以手动要查询的字段
3.字段的值可以进行加减乘除运算
4.聚合函数,用于统计
where 是可选的
数据准备
create table stu(id int primary key auto_increment,name
char(10),math float,english float);
insert into stu values(null,"赵云",90,30);
insert into stu values(null,"小乔",90,60);
insert into stu values(null,"小乔",90,60);
insert into stu values(null,"大乔",10,70);
insert into stu values(null,"李清照",100,100);
insert into stu values(null,"铁拐李",20,55);
insert into stu values(null,"小李子",20,55);
distinct 去除重复数据 所有数据全都重复才算重复
where 在逐行读取数据时的一个判断条件
group by 对数据分组
having 对分组后的数据进行过滤
order by 对结果排序
limit 指定获取数据条数
select [distinct] * from 表名
[where
group by
having
order by
limit
]
注意 在书写时 必须按照这个顺序来写 但是顺写顺写不代表执行顺序
数据库伪代码
def from():
打开文件
def where():
对读取的数据进行过滤
对数据分组
def having():
对分组后的数据进行过滤
def distinct():
去除重复数据
def order():
排序
def limit():
指定获取条数
def select(sql):
data = from()
data = where(data)
data = group by(data)
data = having(data)
data = distinct(data)
data = orderby(data)
data = limit(data)
return data;
指定显示格式:
concat()函数用于拼接字符串
select
(
case
when english + math > 120 then
concat(name," nice")
when english + math <= 130 then
concat(name," shit")
end
) ,english,math from stu; *完全不重要
create table emp (id int,name char(10),sex char,dept char(10),job
char(10),salary double);
insert into emp values
(1,"刘备","男","市场","总监",5800),
(2,"张飞","男","市场","员工",3000),
(3,"关羽","男","市场","员工",4000),
(4,"孙权","男","行政","总监",6000),
(5,"周瑜","男","行政","员工",5000),
(6,"小乔","女","行政","员工",4000),
(7,"曹操","男","财务","总监",10000),
(8,"司马懿","男","财务","员工",6000);
什么是分组
把一个整体 分割为多个部分
为什么分组
在数据库中分组为了统计 *****
分组后 组里的详细记录就被隐藏起来了 不能直接查看
dept 一分组 变成三条记录 每个组中却包含多条记录 没办法显示
一定要显示的话
可以使用group_concat(字段名)
可以将多个值拼接成一个字符串
2.聚合函数不能写在where的后面 where最先执行 它的作用硬盘读取数据并
过滤 以为数据还没有读取完 此时不能进行统计
重复性高的字段
性别分组
请查询每种岗位的平均工资
岗位分组
每后面就是分组的依据
在mysql 5.6中 分组后会默认显示 每组的第一条记录 这是没有意义的
5.7不显示 因为5.7中 sql_mode中自带 ONLY_FULL_GROUP_BY
group by 后面可以有多个分组与依据 会按照顺序执行
asc 表示升序 是默认的
desc 表示降序
by 后面可以有多个排序依据
limit 1,5
从1开始 到5结束 错误
从1开始 不包含1 取5条
每页显示3条 共有10条数据
if 10 % 3 == 0:
10 / 3
else:
10/3 +1
总页数4
select *from emp limit(0,3)
第二页
select *from emp limit(3,3)
第二页
select *from emp limit(6,3)
页数 - 1 * 条数
1 - 1 = 0 * 3 = 0
2 - 1 = 1 * 3 = 3
由于like只能使用% 和 _ 不太灵活
可以将like换为 regexp 来使用正则表达式
数据准备
create table emp (
id int,
name char(10),
sex char,
dept_id int
);
insert emp values(2,"老王","m",2);
insert emp values(3,"老李","w",30);
id int,
name char(10)
);
insert dept values(2,"财务");
insert dept values(3,"行政");
1.笛卡尔积查询
select *from 表1,表n
查询结果是
将坐标中的每条记录 与右表中的每条记录都关联一遍
因为 他不知道什么样的对应关系是正确 只能帮你都对一遍
a表有m条记录 b表有n条记录
笛卡尔积结果为m * n 记录
select *from emp,dept where emp.dept_id = dept.id;
select *from emp [inner] join dept;
select *from emp inner join dept where emp.dept_id = dept.id;
select *from emp left join dept on emp.dept_id = dept.id;
左表数据全部显示 右表只显示匹配上的
select *from emp right join dept on emp.dept_id = dept.id;
右表数据全部显示 左表只显示匹配上的
select *from emp full join dept on emp.dept_id = dept.id; ##mysql不支持
select *from emp left join dept on emp.dept_id = dept.id
union
select *from emp right join dept on emp.dept_id = dept.id;
union all 不会去除重复数据
在单表中where的作用是筛选过滤条件
在多表中where 连接多表 满足条件就连接 不满足就不连接
为了区分是单表还是多表 搞个新的名字 就是 on
只要是连接多表的条件 就使用on
create table tea(id int primary key auto_increment,name char(10));
create table tsr(
id int primary key auto_increment,
t_id int,s_id int,
foreign key(s_id) references stu(id),
foreign key(s_id) references stu(id));
insert into stu values(null,"张三"),(null,"李四");
insert into tea values(null,"egon"),(null,"yyh");
insert into tsr values(null,1,1),(null,1,2),(null,2,2);
on stu.id = tsr.s_id and tea.id = tsr.t_id
where tea.name = "egon";
1.把所有表都连起来
2.加上连接条件
3.如果有别的过滤条件 加上where
条件当一个查询的结果是另一个查询的时 这个查询称之为子查询(内层查询)
当一次查询无法得到想要结果时 需要多次查询
解决问题的思路
是把一个复杂的问题 拆分为多个简单的问题
是把一个复杂的查询 拆分为多个简单的查询
in (1,2)
查部门有哪些人?
第一步查到部门的id
第二部 拿着id去员工表查询
select *from dept join emp on dept.id = emp.dept_id;
# 使用子查询 得到 每个部门的id 以及部门的 最高工资 形成一个虚拟表 把原始表和 虚拟表连接在一起
(select dept_id,max(salary)as m from emp group by dept_id) as t1
# 如果这个人的部门编号 等于 虚拟表中的部门编号
on emp.dept_id = t1.dept_id
and
# 并且 如果这个人的工资 等于 虚拟表中的最高工资 就是你要找的人
emp.salary = t1.m;
char(10),salary double);
insert into emp values
(1,"刘备","男",26,1,"总监",5800),
(2,"张⻜飞","男",24,1,"员⼯工",3000),
(3,"关⽻羽","男",30,1,"员⼯工",4000),
(4,"孙权","男",25,2,"总监",6000),
(5,"周瑜","男",22,2,"员⼯工",5000),
(6,"⼩小乔","女",31,2,"员⼯工",4000),
(7,"曹操","男",19,3,"总监",10000),
(8,"司⻢马懿","男",24,3,"员⼯工",6000);
2018-10-01 2 2
2018-10-02 1 2
insert into emp2 values(2,"laoliba","男",26,"总监",5800);
insert into emp2 values(3,"laocheng","男",26,"总监",5800);
mysql数据库:mysql增删改、单表、多表及子查询的更多相关文章
- java jdbc 连接mysql数据库 实现增删改查
好久没有写博文了,写个简单的东西热热身,分享给大家. jdbc相信大家都不陌生,只要是个搞java的,最初接触j2ee的时候都是要学习这么个东西的,谁叫程序得和数据库打交道呢!而jdbc就是和数据库打 ...
- shell编程系列22--shell操作数据库实战之shell脚本与MySQL数据库交互(增删改查)
shell编程系列22--shell操作数据库实战之shell脚本与MySQL数据库交互(增删改查) Shell脚本与MySQL数据库交互(增删改查) # 环境准备:安装mariadb 数据库 [ro ...
- 【转载】通过JDBC对MySQL数据库的增删改查
通过JDBC进行简单的增删改查(以MySQL为例) 目录 前言:什么是JDBC 一.准备工作(一):MySQL安装配置和基础学习 二.准备工作(二):下载数据库对应的jar包并导入 三.JDBC基本操 ...
- 通过Loadruner对mysql数据库进行增删改查
操作mysql数据库,是在实现mysql数据源配置的基础上操作,可先阅读:loadrunner参数化使用mysql数据源失败解决方法 写之前先理一下,数据库访问流程:打开数据库 --> 数据库 ...
- Mysql数据库基础增删改查常用语句命令
Mysql增删改查常用语句命令 一.增删改查语句总览 创建: create(创建数据库) 增:insert(插入表数据) 删:drop.delete(删除表.删除表数据) 改:update.alter ...
- 通过jdbc连接MySql数据库的增删改查操作
一.获取数据库连接 要对MySql数据库内的数据进行增删改查等操作,首先要获取数据库连接 JDBC:Java中连接数据库方式 具体操作如下: 获取数据库连接的步骤: 1.先定义好四个参数 String ...
- 连接mysql数据库实现增删改查(一)
在python中我们通过pymysql来连接数据库,具体实现如下 ''' 连接mysql数据库 此类进行封装了一些基础的操作数据库方法 ''' import pymysql from Homework ...
- c#winform简单实现Mysql数据库的增删改查的语句
通过简单的SQL语句实现对数据库的增删改查. 窗口如下: 定义打开与关闭连接函数,方便每次调用: 增加指令: 删除指令: 修改指令: 查找指令: 表格情况:
- C++ API方式连接mysql数据库实现增删改查
这里复制的 http://www.bitscn.com/pdb/mysql/201407/226252.html 一.环境配置 1,装好mysql,新建一个C++控制台工程(从最简单的弄起,这个会了, ...
- 【C#】使用NHibernate连接MySQL数据库及增删改查
学习资料 http://www.sikiedu.com/course/51/task/891/show https://www.codeproject.com/Articles/26123/NHibe ...
随机推荐
- Kafka相关概念及核心配置说明
1. Kafka简介 Kafka是最初由Linkedin公司开发,是一个分布式.支持分区的(partition).多副本的(replica),基于zookeeper协调的分布式消息系统,它的最大的特性 ...
- ORACLE11G报错汇总
============安装类================= 安装Oracle 11g R2的过程中,在新建数据库实例时出现了该错误,如果选择"忽略"就会出现ora-28000 ...
- 等待数据库引擎恢复句柄失败 SqlServer2012安装时报错 Win10
上周,在一批Win10系统电脑上安装SqlServer 2012时,屡次发生报错,安装失败,显示的失败信息是:等待数据库引擎恢复句柄失败 如下图所示: 面对这样的错误,我的第一反应是百度,在百度上找了 ...
- 全部二进制脚本高可用--只有docker启动未成功
[root@test1 script]# cat k8s-docker-binary-py #!/usr/bin/python # -*- coding: utf-8 -*- from __futur ...
- java数据结构之CopyOnWriteArrayList和CopyOnWriteArraySet
一.什么是CopyOnWrite CopyOnWrite(写时复制)简称COW,这是一种利用读写分离的思想来实现线程安全的程序设计思路.顾名思义该思想就是在写的时候将原数据复制一份,然后在新的数据中进 ...
- Java虚拟机new对象
类加载检查java虚拟机在遇到一条 new 指令时,首先会检查是否能在常量池中定位到这个类的符号引用,并且是否已被加载过.解析和初始化过.如果没有,那必须先执行类加载过程 类加载的相关知识可参考:JV ...
- Unity Shader的形式
(1)表面着色器 表面着色器是Unity自身的一种着色器代码类型.它需要的代码量很少,Unity在背后做了很多工作,但渲染的代价比较大.但Unity在背后仍旧把表面着色器转换成对应的顶点/片元着色器. ...
- 《精通并发与Netty》学习笔记(03 - 客户端程序编写)
上节我们编写了netty服务端的程序,这节我们来写客户端程序 第一步:改造服务端程序为: (1)MyServer类: package com.ssy.netty.demo01; import io.n ...
- Stream系列(十四)parallet方法使用
并发 视频讲解:https://www.bilibili.com/video/av78408286/ EmployeeTestCase.java package com.example.demo; i ...
- Clone()方法详解
一.克隆的原理与应用 clone在堆上分配内存,分配的内存和源对象(即调用clone方法的对象)相同,然后再使用原对象中对应的各个域,填充新对象的域, 填充完成之后,clone方法返回,一个新的相同的 ...