第42篇 记录的操作 增删改查 子查询 单表查询 多表查询

1练习如何判断是函数还是方法?

from types import FunctionType,MethodType
class A:
def func(self):
pass
a = A()
print(isinstance(a.func,FunctionType))
print(isinstance(a.func,MethodType))
print(isinstance(A.func,FunctionType))
print(isinstance(A.func,MethodType))

  

2主键和外键的区别:
主键:一张表只能有一个主键,主键非空且唯一;
外键:一张表可以有多个外键,也可以重复

数据库语言的三大类:
DDL:
数据库定义语言:数据库,表的创建
create
alter
drop
show/desc


DML:Data Manipulation Language,
数据库操作语言:数据记录的操作
insert
update
delete
selete
DCL:
数据库控制语言 用户的创建以及授权
内容概览:
记录的操作:

  插入数据:
    insert into
  更新数据:
    update set
  删除数据
    delete from xx.xx where xxx
  查询数据:
    单表查询
    多表查询

单表查询:
select distinct
from
where
group by
having
order by
limit

多表查询:
select 字段
from 表1 inner/letf/right join 表2
on 表1.字段 = 表2.字段

交叉连接:
select * from employee,department;
内连接
inner join
左连接
left join
右连接
right join
全外连接
left join
union
right join
子查询:
IN关键字的子查询
带比较运算符的子查询
EXISTS关键字的子查询

create table employee(
id int not null unique auto_increment,
emp_name varchar(20) not null,
sex enum('male','female') not null default 'male',
age int(3) unsigned not null,
post varchar(50),
post_comment varchar(100),
salary double(15,2),
office int,
depart_id int
);

alter table employee add hire_date date not null after age;

insert into employee(emp_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),
('成龙','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);

select (
case
when emp_name = 'jiingliyang'
then emp_name
when emp_name = 'alex'
then concat(emp_name,'_bigSB')
else
concat(emp_name,'sb')
end) as new_name
from employee;

select concat ('<名字:',emp_name,'> <薪资:',salary) from employee;
select distinct post from employee;
select emp_name,salary*12 as annual_year from employee;
select emp_name from employee where post = 'sale';
select emp_name,salary from employee where post = 'teacher' and salary >10000;
select emp_name,salary from employee where salary between 10000 and 20000;


select emp_name,post_comment from employee where post_comment is null;

update employee set post_comment='good' where id < 5;

select emp_name,salary from employee where salary = 3000 or salary = 3500 or salary = 4000;


select emp_name,salary from employee where salary in (300,3500,4000,9000);

select emp_name,salary from employee where salary not in (300,3500,4000,9000);

select * from employee where emp_name like 'eg%';
select * from employee where emp_name like 'al__';


select emp_name,age from employee where post = 'teacher';

 

 

create table employee(
id int primary key auto_increment,
name varchar(20),
sex enum('male','female') not null default 'male',
age int,
dep_id int
);


insert into department values
(200,'技术'),
(201,'人力资源'),
(202,'销售'),
(203,'运营');


insert into employee(name,sex,age,dep_id) values
('egon','female',18,200),
('alex','male',48,201),
('wupeiqi','male',38,201),
('yuanhao','female',28,202),
('liwewzhou','male',18,200),
('jinliyang','female',18,204);
select employee.id,employee.name,employee.age,employee.sex,department.name from employee,department where employee.dep_id = department.id;

select * from employee left join department on employee.dep_id = department.id
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.name,employee.age,employee.sex department.name from employee inner join department
on employee.dep_id = department.id
where age > 25;


select employee.name as staff_name,department.name as 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;
select id,name from department where id in
(select dep_id from employee group by dep_id having avg(age) >25);
select id,name from employee where dep_id in
(select id from department where name = '技术');

select name from department where id not in
(select distinct dep_id from employee);

select name,age from employee where age >
(select avg(age) from employee);
select t1.name,t1.age from employee t1
inner join
(select dep_id,avg(age) avg_age from employee group by dep_id) t2
on t1.dep_id = t2.dep_id
where t1.age > t2.avg_age;


select employee.name,employee.age from employee;
alter table employee rename employee__1;


SELECT
*
FROM
employee AS t1
INNER JOIN (
SELECT
post,
max(hire_date) max_date
FROM
employee
GROUP BY
post
) AS t2 ON t1.post = t2.post
WHERE
t1.hire_date = t2.max_date;

select * from employee as t1
inner join
(select post,max(hire_date) max_date from employee group by post) as t2
on t1.post = t2.post
where t1.hire_date = t2.max_date;

source C:/Program Files/mysql-5.6.41-winx64/data/init.sql

create table department (id int ,name varchar(20));

create table employee (id int primary key auto_increment,
name varchar(20),
sex enum('male','female') not null default 'male',
age int,
dep_id int
);
insert into employee(name,sex,age,dep_id) values
('egon','male',18,200),
('alex','female',48,201),
('wupeiqi','male',38,201),
('yuanhao','female',28,202),
('liwenzhou','male',18,200),
('jingliyang','female',18,204)
;
insert into department values
(200,'技术'),
(201,'人力资源'),
(202,'销售'),
(203,'运营');

交叉连接 生成笛卡尔积
select * from employee,department;

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


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

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

select * from employee left join department on employee.dep_id = department.id
union
select * from employee right join department on employee.dep_id = department.id


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


select * from employee left join department
on employee.dep_id = department.id where age > 25 order by age desc;
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 distinct dep_id from employee);

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

select t1.name,t1.age from employee t1
inner join
(select dep_id,avg(age) avg_age from employee group by dep_id) t2
on t1.dep_id = t2.dep_id
where t1.age > t2.avg_age;

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


create table employee2(
id int not null unique 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_commenrt varchar(100),
salary double(15,2),
office int,
depart_id int);

 

insert into employee2(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),
('成龙','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)
;

找出每个部门中入职时间最久的员工
先按照部门分组 找出该部门中时间最久的职位select post,max(hire_date) max_hiredate from employee2 group by post
与原来的员工数据表连接 连接的关键字是post
然后再筛选
筛选的条件是入职时间相等
select * from employee2 as t1
inner join (select post,max(hire_date) max_hiredate from employee2 group by post) as t2 on t1.post = t2.post
where t1.hire_date = t2.max_hiredate;

 

SELECT
*
FROM
employee2 AS t1
INNER JOIN (
SELECT
post,
max(hire_date) max_date
FROM
employee2
GROUP BY
post
) AS t2 ON t1.post = t2.post
WHERE
t1.hire_date = t2.max_date;

 

 

猜你喜欢

转载自www.cnblogs.com/cavalier-chen/p/9754588.html