站在左表的角度:
(1)一个员工 能不能在 多个部门? 不成立
(2)多个员工 能不能在 一个部门? 成立
只要有一个条件成立:多 对 一或者是1对多
如果两个条件都成立: 多对多 要创建第三张表进行关联
多对多    双向的多对一

#两张表： 用户表 （user）和 博客表(blog)
# 创建用户表
create table user(
id int primary key auto_increment,
name varchar(20)
);
# 创建博客表
create table blog(
id int primary key auto_increment,
url varchar(100),
user_id int unique,
);
#插入用户表中的记录
insert into user(name) values
('alex'),
('wusir'),
('egon'),
;
# 插入博客表的记录
insert into blog(url,user_id) values
('http://www.cnblog/alex',1),
('http://www.cnblog/wusir',2),
('http://www.cnblog/egon',3),

select 字段 from 表名
where 条件
group by field
having 筛选
order by field
limit 限制条数

from
where
group by
having
select
distinct
order by
limit

1.找到表 from
2.拿着where指定的约束条件,去表中取出一条条记录
3.将取出的一条条记录进行分组group by,如果没有group by ,则整体作为一组
4.将分组的结果进行having过滤
5.执行select
6.去重
7.将结果按条件排序:order by
8.限制结果的显示条数
create table employee(
id int primary key auto_increment,
name varchar(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 varchar(50),
post_comment varchar(100),
salary double(15,2),
office int,
depart_id int
);
insert into employee(name,sex,age,hire_date,post,salary,office,depart_id) values
('egon','male',18,'20170301','老男孩驻沙河办事处外交大使',7300.33,401,1),
('alex','male',78,'20150302','teacher',1000000.31,401,1),
('wupeiqi','male',81,'20130305','teacher',8300,401,1),
('yuanhao','male',73,'20140701','teacher',3500,401,1),
('liwenzhou','male',28,'20121101','teacher',2100,401,1),
('jingliyang','female',18,'20110211','teacher',9000,401,1),
('jinxin','male',18,'19000301','teacher',30000,401,1),
('xiaomage','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.where 约束:
* 比较运算符:> < >= <= <> !=;
* between 80 and 100 ;
*in(80, 90 ,100)
*like "xiaomage":pattern 可以是% 或 _ . % 任意多字符,_表示一个字符;
* 逻辑运算符:有多个条件可以直接使用逻辑运算符 and or not;
2.group by 分组查询:
(1) 首先明确一点: 分组发生在where 之后,即分组是基于where之后得到的记录而进行的;
(2) 分组指的是:将所有记录按照某个相同字段进行归类,比如针对员工信息表的职位分组,或者按照性别进行分组等.
(3)为何要分组?

(4).大前提:

select post from employee group by post; (只能看post字段)

SQL中提供的聚合函数可以用来统计、求和、求最值等等。
–COUNT()：统计行数量 count(1)
–SUM()：获取单个列的合计值
–AVG()：计算某个列的平均值
–MAX()：计算列的最大值
–MIN()：计算列的最小值

select post,count(id) from employee group by post;

select post,max(salary) from employee group by post;

select post,min(salary) from employee group by post;

select post,avg(salary) from employee group by post;

select post,sum(salary) from employee group by post;

select * from employee group by post;是以post字段查询了组中的第一条数据

3.having 过滤
(1)having发生在分组group by 之后,因而 having中可以使用分组的字段,无法直接取到其他字段,可以使用聚合函数
(2)where和having的区别
where 发生在分组group by 之前,因而where中可以有任意字段,但是绝对不能使用聚合函数;
(3)函数group_concat() 必须使用group by 才能使用此函数,

4.order by 查询顺序

SELECT * FROM employee ORDER BY age;
SELECT * FROM employee ORDER BY age ASC; (升序)
SELECT * FROM employee ORDER BY age DESC; (降续)

select * from employee order by age ASC,id DESC;
5.limit 限制查询的记录数

select * from employee order by salary DESC
limit 3;(默认初识位置为0)
SELECT * FROM employee ORDER BY salary DESC
limit 0,5;(从第0开始，即先查询出第一条，然后包含这一条在内往后查5条)
SELECT * FROM employee ORDER BY salary DESC
limit 5,5;(从第5开始，即先查询出第6条，然后包含这一条在内往后查5条)

select 字段列表 from 表1 inner/left/right join 表2 on 表1.字段 = 表2.字段;
1.交叉连接:不适用任何匹配条件,生成笛卡尔积

2.内连接:只连接匹配的行

select employee.id,employee.name,employee.age,employee.sex,department.name
from employee inner join department
on employee.dep_id=department.id;

select employee.id,employee.name,employee.age,employee.sex,department.name
from employee,department
where employee.dep_id=department.id;
3.外链接之左连接:优先显示左表全部记录

select employee.id,employee.name,department.name as depart_name
from employee left join department
on employee.dep_id=department.id;
4.外链接之右连接:优先显示右表全部记录

select employee.id,employee.name,department.name as depart_name
from employee right join department
on employee.dep_id=department.id;
5.全外链接:显示左右两个表全部记录

select * from employee left join department on employee.dep_id = department.id
union all
select * from employee right join department on employee.dep_id = department.id;
select * from employee left join department on employee.dep_id = department.id
union (union会去掉相同的记录)
select * from employee right join department on employee.dep_id = department.id

select employee.name,department.name from employee inner join department
on employee.dep_id = department.id
where age > 25;

select employee.id,employee.name,employee.age,department.name from employee,department
where employee.dep_id = department.id
and age > 25
order by age asc;

1.带in关键字的子查询

select id,name from department
where id in
(select dep_id from employee group by dep_id having avg(age) > 25);

select name from employee
where dep_id in
(select id from department where name='技术');

select name from department
where id not in
(select dep_id from employee group by dep_id);
2.带比较运算符的子查询

select name,age from employee where age >(select avg(age)from employee);

select t1.name,t1.age
from employee as t1 inner join (select dep_id avg(age) as avg_age from employee group by dep_id) as t2
on t1.dep_id =t2.dep_id
where t1.age>t2.avg_age;
3.带exists关键字的子查询
EXISTS关字键字表示存在。在使用EXISTS关键字时，内层查询语句不返回查询的记录。而是返回一个真假值。True或False

select * from employee where exists (select id from department where id=200);

- not null 和 default
- unique 唯一的
1.单列唯一
2.多列唯一
3.联合唯一

- 主键
primary key(索引)

1.单列主键
2.多列主键(有问题) 不允许
2.联合主键

primary key(id,name,age)

- 外键
foreign key

(1)先创建主表
(2)再去创建从表

innodb
myisam
memory
blackhole

- 整型 tinyint int bigint
- 小数 float double decimale
- 字符 char(定长 存储的速度快 浪费空间 char_length() length() sql_mode)
varchar(变长 节省空间 存储速度慢)

- 日期 year date time datetime

- 枚举 enum
- 集合 set

## python mysql 单表查询 多表查询的更多相关文章

1. python mysql索引 优化神器explain 慢查询

##############总结########## 数据库中专门帮助用户快速找到数据的一种数据结构 类似于字典的目录的索引 索引的作用:约束和加速查找 工作原理: b+树形结构 最上层是树根,中间是 ...

2. MySQL简单实现多字段模糊查询

我所做的商城项目前些时提了新需求,要求前台搜索商品除了能通过商品名称搜索到以外,还可以通过别个信息搜索,比如:商品编号.详情内容描述等等,类似于全文搜索了.我首先想到的就是lucene,但是对代码这样 ...

3. Python MySQL Where

章节 Python MySQL 入门 Python MySQL 创建数据库 Python MySQL 创建表 Python MySQL 插入表 Python MySQL Select Python M ...

4. python 3 mysql 单表查询

python 3 mysql 单表查询 1.准备表 company.employee 员工id id int 姓名 emp_name varchar 性别 sex enum 年龄 age int 入职 ...

5. python开发mysql:单表查询&amp;多表查询

一 单表查询,以下是表内容 一 having 过滤 1.1 having和where select * from emp where id > 15; 解析过程;from > where ...

6. python之路--MySQl单表查询

一.  关键字的执行优先级(重点) from where group by having # 使用是要放在group by 后面而且前面必须有group by select distinct # 去重 ...

7. Mysql 单表查询 子查询 关联查询

数据准备: ## 学院表create table department( d_id int primary key auto_increment, d_name varchar(20) not nul ...

8. mysql单表多表查询

单表查询语法: select 字段1,字段2... from 表名where 条 件group by fieldhaving 筛选order by 字段limit 限制条数 关键字的优先级:from  ...

9. MySQL单表查询

MySQL之单表查询 创建表 # 创建表 mysql> create table company.employee5( id int primary key AUTO_INCREMENT not ...

## 随机推荐

1. zerojs! 造出最好的 CMS 轮子

zerojs是一个基于nodejs.angularjs.git的CMS.在它之上可以继续开发出博客.论坛.wiki等类似的内容管理型系统. 拥抱开发者和社区 层次清晰,高度解耦.前后端即使分开也都是完 ...

2. spring in action 4th --- quick start

读spring in action. 环境搭建 quick-start依赖注入 面向切面 1.环境搭建 jdk1.8 gradle 2.12 Intelij idea 2016.2.1 1.1创建一个 ...

3. linux应用开发小结

这几天一直在看<在实践中学嵌入式linux应用程序开发>这本书,昨天下午的时候算是把这本书完全搞懂了.除了第一章的交叉编译环境的搭建和第七章linux设备驱动开发第八章的安卓应用开发和第九 ...

4. .NET程序与CA对接一直提示重定向

最可能问题:应用程序服务器与CA服务器时间不同步 解决方法: 打开时间,选择internet时间,操作如图,在.net程序服务器 输入CA服务器的IP ,或者CA服务器输入 .net程序部署服务器的I ...

5. C#学习笔记(二)

1.注释:注销,解释2.单行://多行:/**/文档注释:///按enter主食要保证 别人一看就明白3.快速对期待吗:ctrl+k+d,按住ctrl不放,按k,迅速抬起,再按d(按D得时候k已经抬起 ...

6. iOS项目中常见的文件

7. TortoiseSVN--clearup清理失败解决办法

工作中经常遇到update.commit 失败导致冲突问题,需要用clear up来清除问题,个别异常情况导致clear up失败,进入死循环!可以使用sqlite3.exe清理一下wc.db文件的队 ...

8. Python多线程的运行及time.sleep()的应用

已知小明和其弟弟小白每月都需要生活费,二人同时从同一个账户中取钱,两人每人每月需要1000元,账户中现有余额3200元,如果卡内余额大于2000元,则父母不会存入,如果卡内余额小于2000元,则父母当 ...

9. 编译你的第一个Java虚拟机--Centos 7 编译openJdk1.7源码

一.前言 最近在看<深入java虚拟机>,看完后,打算自己实际编译一个jvm出来看看,实践一下. 书上提到了Oracle JDK和OpenJdk的关系,Oracle Jdk7 和OpenJ ...