1030 MySQL单表操作和多表操作

单表操作

分组

分组指的是,将所有的记录按照某个相同字段进行归类
group by
用法:
select 聚合函数,选取的字段 from employee group by 选取的字段;
加别名:
select 聚合函数 as 别名,选取的字段 from employee group by 选取的字段;
以性别分组为例:
select count(id),gender from employee group by gender;
group by:是分组的关键词
group by 必须和 聚合函数(count) 出现
count(计数),sum(求和),min(最小),max(最大)
having
表示对group by 之后的数据,进行第二次的筛选
select depart_id,avg(age) from employee group by depart_id; #第一次筛选
select depart_id,avg(age) from employee group by depart_id having avg(age) > 35; #having第二次筛选
where条件语句和group by分组语句的优先级
where > group by > having

升序和降序

order by
order by 字段名 asc(升序) desc(降序)
多字段进行排序
例:
age desc,id asc
表示:先对age进行降序,如果有相同age的,用id进行升序
select * from employee order by age desc,id asc;

分页

limit
limit offset, size
offset: 行数据索引
size: 取多少条数据
select * from employee limit 0,10;
select * from employee limit 10,10;

总结

使用顺序
select * from 表名 where 条件 group by 条件 having 条件 order by 条件 limit 条件;
where > group by > having > order by > limit

多表操作*******

外键

使用原因
减少占用的空间
只需要修改一次department表中的数据,其余的表中的数据会相应的跟着修改
一对多
使用方法
constraint 外键名 foreign key (被约束的字段) references 约束的表(约束的字段)

create table department(
    id int auto_increment primary key,
    name varcher(32) not null default ''
)charset=utf8;

insert into department (name) valuse ('研发部');
insert into department (name) valuse ('销售部');

create table userinfo(
    id int auto_incremrnt primary key,
    name varcher(32) not null default '',
    depart_id int not null default 1,
    constraint fk_user_depart foreign key (depart_id) references department (id),
    constraint fk_user_depart foreign key (被绑定列) references department (绑定列)
)charset=utf8;

insert into userinfo (name,depart_id) valuse ('name1',1);
insert into userinfo (name,depart_id) valuse ('name2',2);

多对多

create table boy(
    id int auto_increment primary key,
    bname varchar(32) not null default ''
)charset=utf8;

insert into boy (bname) values ('zhangsan'),('lisi'),('zhaoliu');

create table girl(
    id int auto_increment primary key,
    gname varchar(32) not null default ''
)charset=utf8;

insert into girl (gname) values ('cuihua'),('gangdan'),('jianguo');

create table boy_girl(
    id int auto_increment primary key,
    bid int not null default 1,
    gid int not null default 1,
    constraint fk_boy_girl_boy foreign key (bid) references boy(id),
    constraint fk_boy_girl_boy foreign key (gid) references girl(id)
)charset=utf8;

insert into boy_girl (bid,gid) values (1,1),(1,2),(2,3),(3,3),(2,2);

select * from boy left join boy_girl on boy.id = boy_girl.bid left join girl on gir.id = boy_girl.gid; #获取名字和id

select bname,gname from boy left join boy_girl on boy.id = boy_girl.bid left join girl on girl.id = boy_girl.gid; #获取名字

select bname,gname from boy left join boy_girl on boy.id = boy_girl.bid left join girl on gril.id = boy_gril.gid where bname = 'zhangsan'; #获取男名字是'zhangsan'的表

一对一

user :
id|name|age
:-:|:-:|:-:
1|x1|11
2|x2|12
3|x3|13
由于salary是比较敏感的字段,所以要把他独立出来
private:
id|salary|uid (外键+unique)
:-:|:-:|:-:
1|2000|1
2|3000|2
3|4000|3

create table user(
    id int auto_increment primary key,
    name varchar(32) not null default ''
)charset=utf8;

insert into user (name) values ('x1'),('x2'),('xx');

create table priv(
    id int auto_increment primary key,
    salary int not null default 0,
    uid int not null default 1,
    constraint fk_priv_user foreign key (uid) references user(id),
    unique(uid)
)charset=utf8;
#不能重复,不然会报错
insert into priv (salary,uid) values (2000,1);
insert into priv (salary,uid) values (3000,2);
insert into priv (salary,uid) values (4000,3);

多表连查

left join …… on ……

    select * from userinfo left join department on depart_id = department.id;
    select userinfo.name as uname,department.dname from userinfo left join department on depart_id = department.id; #无的不显示

right join …… on ……

    select userinfo.name as uname, department.name as dname from userinfo right join department on depart_id = departmrnt.id; #无的显示NULL

inner join(了解)

select * from department inner join userinfo on department.id = userinfo.depart_id;

原文地址:https://www.cnblogs.com/793564949liu/p/11768744.html

时间: 2024-11-05 22:54:41

1030 MySQL单表操作和多表操作的相关文章

mysql学习笔记——对数据记录查询操作的补充(单表内查询)

select ... from ... where ... group by ... having ... order by ... limit...; (顺序固定) 1.select 指定所要检索的字段(列) select 后加distinct关键字,则可去除重复的记录,其中,重复的记录是指 所有字段值都相同的记录 2.from 指定查询数据表,可以是表名,也可以是别名 通常是在一个表达式不易读取时,对其取别名: 表达式 as 别名; 3.where 前置过滤条件 --- 将表数据过滤掉一部分

python开发mysql:单表查询&多表查询

一 单表查询,以下是表内容 1 一 having 过滤 2 1.1 having和where 3 select * from emp where id > 15; 4 解析过程;from > where 找到数据 > 分组(没有默认一个组)> select 打印 where是出结果之前 5 select * from emp having id > 15; 6 解析过程;from > where 找到数据(没有约束条件,就是整个表)) > 分组(没有默认一个组)&

17-2 orm单表操作和多表操作

参考:https://www.cnblogs.com/liwenzhou/p/8660826.html 一  ORM单表操作 1 增删改查 1 1. 查询 2 1. 查所有 3 models.Publisher.objects.all() 4 2. 查某个具体的记录 5 models.Publisher.objects.get(id=1) --> 注意查询条件不成立就报错 6 2. 删除一条记录 7 models.Publisher.objects.get(id=1).delete() 8 3.

MySQL单表数据量过千万,采坑优化记录,完美解决方案

问题概述 使用阿里云rds for MySQL数据库(就是MySQL5.6版本),有个用户上网记录表6个月的数据量近2000万,保留最近一年的数据量达到4000万,查询速度极慢,日常卡死.严重影响业务. 问题前提:老系统,当时设计系统的人大概是大学没毕业,表设计和sql语句写的不仅仅是垃圾,简直无法直视.原开发人员都已离职,到我来维护,这就是传说中的维护不了就跑路,然后我就是掉坑的那个!!! 我尝试解决该问题,so,有个这个日志. 方案概述 方案一:优化现有mysql数据库.优点:不影响现有业务

MySQL单表的CRUD及多表查询

数据库表的增删改查操作: 增.删.改 查: 单表查询 简单查询.where约束.group by分组.聚合查询.having过滤.order by排序.limit限制.正则匹配 多表查询 连表查询:交叉查询.>內连查询.左外连接查询.右外连接查询.全外链接查询.连接结果筛选查询 子查询 :带关键字in的子查询.带比较运算符的子查询.带关键字exists的布尔判断结果查询 表记录增删改总结: MySQL数据操作: DML 在MySQL管理软件中,可以通过SQL语句中的DML语言来实现数据的操作,包

mysql单表限制

mysql单表的限制 一.MySQL数据库的MyISAM存储 引擎单表大小限制已经不是有MySQL数据库本身来决定(限制扩大到64pb),而是由所在主机的OS上面的文件系统来决定了. 在mysql5.0版本之前,myisam存储引擎默认表的大小4Gb,可以用一下命令来查看: [[email protected] test]# cd /data/mysql/mysql_3306/data/test [[email protected] test]# myisamchk -dv t2 MyISAM

MySQL单表百万数据记录分页性能优化

原文地址:http://www.cnblogs.com/lyroge/p/3837886.html MySQL单表百万数据记录分页性能优化 背景: 自己的一个网站,由于单表的数据记录高达了一百万条,造成数据访问很慢,Google分析的后台经常报告超时,尤其是页码大的页面更是慢的不行. 测试环境: 先让我们熟悉下基本的sql语句,来查看下我们将要测试表的基本信息 use infomation_schemaSELECT * FROM TABLES WHERE TABLE_SCHEMA = 'dbna

MySQL表的创建和表中数据操作

这篇文章主要介绍在navicat的命令界面操作mysql.主要涉及建立表结构,和对表中数据的增加删除修改查询等动作.站在一个新手角度的简单mysql表结构和数据操作. ☆ 准备工作 1,保证自己的电脑安装了mysql(my.ini下的字符集设置是utf8) 2,确保电脑同时安装navicat(任意版本) 3,保证mysql服务器已经启动 注:若对navicat操作不熟,请参照<<navicat从下载到使用>>这篇文章. ☆ 打开控制台 在navicat的tools(工具)菜单栏选择

mysql基本认识【关系型数据库和nosql、mysql操作流程和体系,库操作,表操作,数据的操作,字符集的操作,以及php作为client操作数据库】对连接本身没有疑问

1.关系型数据库永久性保存数据的仓库php的变量只是php脚本执行期间,临时性保存变量的空间[使用内存空间临时保存] 关系型数据库:利用二者的关系来描述实体的信息.[利用二维表字段名和字段值来进行描述][关系型数据库根本不是可以使用外键将两个表构建成关联的意思,而是实现描述实体的二维表的形式] nosql:not only sql[sql表示操作关系型数据的语言]所以nosql指的就是非关系型数据库[典型的是键值对型的数据(redis.memcache)][nosql可以视情况添加信息,不需要对