zoukankan      html  css  js  c++  java
  • 数据库之mysql多表查询(连表)以及pymysql等相关内容-45

    1.多表查询

    #建表
    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 department values
    (200,'技术'),
    (201,'人力资源'),
    (202,'销售'),
    (203,'运营');

    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)
    ;


    #查看表结构和数据
    mysql> desc department;
    +-------+-------------+------+-----+---------+-------+
    | Field | Type | Null | Key | Default | Extra |
    +-------+-------------+------+-----+---------+-------+
    | id | int(11) | YES | | NULL | |
    | name | varchar(20) | YES | | NULL | |
    +-------+-------------+------+-----+---------+-------+

    mysql> desc employee;
    +--------+-----------------------+------+-----+---------+----------------+
    | Field | Type | Null | Key | Default | Extra |
    +--------+-----------------------+------+-----+---------+----------------+
    | id | int(11) | NO | PRI | NULL | auto_increment |
    | name | varchar(20) | YES | | NULL | |
    | sex | enum('male','female') | NO | | male | |
    | age | int(11) | YES | | NULL | |
    | dep_id | int(11) | YES | | NULL | |
    +--------+-----------------------+------+-----+---------+----------------+

    mysql> select * from department;
    +------+--------------+
    | id | name |
    +------+--------------+
    | 200 | 技术 |
    | 201 | 人力资源 |
    | 202 | 销售 |
    | 203 | 运营 |
    +------+--------------+

    mysql> select * from employee;
    +----+------------+--------+------+--------+
    | id | name | sex | age | dep_id |
    +----+------------+--------+------+--------+
    | 1 | egon | male | 18 | 200 |
    | 2 | alex | female | 48 | 201 |
    | 3 | wupeiqi | male | 38 | 201 |
    | 4 | yuanhao | female | 28 | 202 |
    | 5 | liwenzhou | male | 18 | 200 |
    | 6 | jingliyang | female | 18 | 204 |
    +----+------------+--------+------+--------+

    表department与employee
    多表联合查询
    # 方案1:链表
    把多张物理表合并成一张虚拟表,再进行后续查询

    #======>内链接:保留两张表有对应关系的记录
    select * from emp,dep where emp.dep_id=dep.id;
    select dep.name,emp.name from emp inner join dep on emp.dep_id=dep.id
       where dep.name = "技术";

    #======>左链接:在内链接的基础上保留左表的记录
    select * from emp left join dep on emp.dep_id=dep.id;

    #======>右链接:在内链接的基础上保留右表的记录
    select * from emp right join dep on emp.dep_id=dep.id;

    #======>全外链接:在内链接的基础上保留左右表的记录
    full join

    select * from emp left join dep on emp.dep_id=dep.id
    union
    select * from emp right join dep on emp.dep_id=dep.id;


    示例1:查询所有部门名及对应的员工个数
    select dep.name,count(emp.id) from emp right join dep on emp.dep_id = dep.id
    group by dep.name
    ;

    select dep.name,count(emp.id) from emp right join dep on emp.dep_id = dep.id
    group by dep.name
    having count(emp.id) < 2
    ;

    #示例2:即找出年龄大于25岁的员工以及员工所在的部门
    select emp.name,dep.name from emp inner join dep on emp.dep_id = dep.id where age > 25;


    #示例3:以内连接的方式查询employee和department表,并且以age字段的升序方式显示


    # 把多张表链接到一起:
    select * from
    (select emp.*,dep.name as dep_name  from emp inner join dep on emp.dep_id = dep.id) as t1
    inner join
    dep
    on t1.dep_id = dep.id
    ;

    select * from emp
    inner join dep
    on emp.dep_id = dep.id

    inner join dep as t1
    on t1.id = dep.id;


    # 查询部门内最新入职的员工
    select * from employee
    inner join
    (select depart_id,max(hire_date) as maxd from employee group by depart_id) as t1
    on employee.depart_id = t1.depart_id
    where employee.hire_date = t1.maxd
    ;


    # 方案2:子查询
    从一张表中查询出结果,用该结果作为查
    询下一张表的过滤条件
    select * from employee
    where hire_date = (select max(hire_date) from employee);


    #查询平均年龄在25岁以上的部门名
    select * from dep where id in
    (select dep_id from emp group by dep_id having avg(age) > 25);

    #查看技术部员工姓名
    select * from emp where dep_id in
    (select id from dep where name="技术");

    #查看不足1人的部门名(子查询得到的是有人的部门id)
    select * from dep where id not in (select distinct dep_id from emp);

    select * from dep where exists (select * from emp where id>3);

    2.pymysql

    import pymysql

    conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', password='123', database='db4', charset='utf8mb4')
    # 游标
    cursor = conn.cursor()  # 执行•完毕返回的结果集默认以元组显示

    # cursor.execute("insert into user(name,pwd) values('egon','123'),('tom','456'),('jack','111');")

    # sql="insert into user(name,pwd) values('%s','%s');" %('lili','123')
    # cursor.execute(sql)

    # %s不要加引号
    # cursor.execute("insert into user(name,pwd) values(%s,%s);",('kkk','123'))


    username = input("username>>>: ").strip()
    password = input("password>>>: ").strip()
    # sql = "select * from user where name='%s' and pwd='%s'" %(username,password)
    # select * from user where name='egon' -- hello' and pwd='%s'
    # select * from user where name='xxx' or 1=1 -- hello' and pwd='%s';
    # rows=cursor.execute(sql)

    rows = cursor.execute("select * from user where name=%s and pwd=%s", (username, password))

    if rows:
       print('ok')
    else:
       print('no')

    conn.commit()
    cursor.close()
    conn.close()

     

  • 相关阅读:
    HDU 4379 水题,大水,但我WA了很多次,做了很久
    HDU 1712分组背包 考试复习安排
    所谓的二维背包Triangular Pastures POJ 1948
    ZOJ 1203 Swordfish Kruskal算法求最小生成树
    POJ 2576 Tug of War二维背包恰好装满.
    O(n*m)复杂度的多重背包coinsPOJ 1742
    拓扑排序POJ 1094
    页面右键下拉表
    gb2312 unicode转换工具
    INPUT读出URL里的变量名称
  • 原文地址:https://www.cnblogs.com/usherwang/p/13634738.html
Copyright © 2011-2022 走看看