• day11 协程 数据库 MYSQL


    协程

    '''
    并发的解决方案1:
        多进程
        多线程

    总结两点:
        什么叫并发:看起来同时运行,
        如何实现并发*
        进程线程都是由操作系统调度的

    并发的解决方案2:
        协程:单线程下实现的并发,应用程序级别的切换,操作系统无法感知
        找到一种解决方案:
            1、在多个任务直接切换+保存状态
            2、检测应用程序里的IO,实现遇到IO操作时才切换


    '''
    #串行执行
    import time
    def consumer(res):
        '''任务1:接收数据,处理数据'''
        pass

    def producer():
        '''任务2:生产数据'''
        res=[]
        for i in range(10000000):
            res.append(i)
        return res

    # start=time.time()
    # #串行执行
    # res=producer()
    # consumer(res)
    # stop=time.time()
    # print(stop-start) #



    #基于yield并发执行
    # import time
    # def consumer():
    #     '''任务1:接收数据,处理数据'''
    #     while True:
    #         print('consumer')
    #         x=yield
    #
    # def producer():
    #     '''任务2:生产数据'''
    #     g=consumer()
    #     next(g)
    #     for i in range(10000000):
    #         print('producer')
    #         g.send(i)
    #         time.sleep(1000)
    #
    # start=time.time()
    # #基于yield保存状态,实现两个任务直接来回切换,即并发的效果
    # #PS:如果每个任务中都加上打印,那么明显地看到两个任务的打印是你一次我一次,即并发执行的.
    # producer()
    #
    # stop=time.time()
    # print(stop-start)



    #
    import time
    from greenlet import greenlet
    def eat(name):
        print('%s eat 1' %name)
        time.sleep(1000)
        g2.switch('alex')
        print('%s eat 2' %name)
        g2.switch()
        print('%s eat 3' %name)
        g2.switch()

    def play(name):
        print('%s play 1' %name)
        g1.switch()
        print('%s play 2' %name)
        g1.switch()
        print('%s play 3' %name)


    g1=greenlet(eat)
    g2=greenlet(play)


    g1.switch('egon')
    # g2.switch('alex')



     

    Gevent模块

    #pip3 install gevent
    from gevent import monkey;monkey.patch_all() #写到文件的首部
    import gevent
    import time
    from threading import current_thread

    def eat(name):
        print('%s eat 1 %s' %(name,current_thread().getName()))
        time.sleep(2)
        # gevent.sleep(5)
        print('%s eat 2 %s' %(name,current_thread().getName()))
        return 10

    def play(name):
        print('%s play 1 %s' %(name,current_thread().getName()))

        time.sleep(3)
        # gevent.sleep(7)
        print('%s play 2 %s' %(name,current_thread().getName()))

        return 20

    start=time.time()
    g1=gevent.spawn(eat,name='egon')
    g2=gevent.spawn(play,'alex')

    # print(g1,g2)

    # g1.join()
    # g2.join()
    gevent.joinall([g1,g2])
    # print(g1.value)
    # print(g2.value)
    print(time.time()-start)

     

    数据库介绍

    文件夹:库

    文件:表(字段就是表的标题)

    一行内容:记录

    数据库管理软件:MySQL,Oracle,Sql server,DB2

    数据库服务器: 安装有数据库管理软件的一台机器


    yum install mysql-server mysql

     

    MySQL基本管理

    #设置密码
    mysqladmin -uroot -p password "123"
    mysqladmin -uroot -p123 password "123456"

    #破解密码:方式一
    关闭mysql
    启动mysql
    mysqld --skip-grant-tables # 跳过授权表启动

    mysql -uroot -p
    update mysql.user set password=password('123') where user='root' and host='localhost';
    flush privileges;
    关闭mysql
    启动mysql


    #破解密码:修改配置文件


    #创建账号
    grant select,update on 库.表 to "用户名"@"192.168.1.%"  identified by '123';
    grant all on 库.表 to "用户名"@"localhost"  identified by '123';
    grant all on 库.表 to "用户名"@"%"  identified by '123';
    grant all on *.* to "用户名"@"%"  identified by '123';

    flush privileges;














     

    基本的sql语句



    文件夹:库
        
            create database db1 charset utf8;
        
            show databases;
            show create database db1;
        
            alter database db1 charset latin1;
        
            drop database db1;


    文件:表
        切换文件夹(库):use db1:
        select database(); #查看当前所在的库

        
            create table t1(
                id int,
                name char
            )engine=innodb;
        
            show create table t1;
            show tables;
            desc t1;
        
            alter table t1 add age int;
            alter table t1 drop age;
            alter table t1 modify name char(4);
            alter table t1 change name xxxx char(4);
        
            drop table t1;

    一行内容:记录
        
            insert into db1.t1 values
            (1,'a'),
            (2,'e'),
            (3,'w');

            insert into db1.t1(name,id) values
            ('c',4);

            insert into db1.t1(name) values
            ('d');
        
            select * from t1;
            select name from t1;
        
            update t1 set name='A';
            update t1 set name='S' where id=3;
        
            delete from t1 where id >=2 and id < 4; #删某几条记录就用delete

            删除整张表所有记录
            delete from t1; #不要用
            要用
            truncate t2;


            create table t2(id int primary key auto_increment,name char(16));
            insert into t2(name) values
            ('alex1'),
            ('alex2'),
            ('alex3'),
            ('alex4'),
            ('alex5');

    查看帮助:
        help create

     

    存储引擎

    create database db2;

    use db2;

    create table t1(x char(4))engine=innodb;
    create table t2(x char(4))engine=myisam;
    create table t3(x char(4))engine=blackhole;
    create table t4(x char(4))engine=memory;


    insert into t1 values('aaa');
    insert into t2 values('aaa');
    insert into t3 values('aaa');
    insert into t4 values('aaa');

     

    数据类型

    数字类型
        整型:年龄,身份证号,ID号,等级
            tinyint
            int
            bigint
        浮点型:薪资,身高体重,体质参数
            float
            double

            decimal


    字符类型
        名字,描述性的信息
        char
        varchar

    时间类型
        date:2017-01-27
        time:11:11:11
        datetime:2017-01-27 11:11:11
        timestamp:2017-01-27 11:11:11
        year:2017

    枚举类型
        enum('male','female','mf')
        set('play','read','sleep',)




    =========================整型验证=======================
    create database db3;
    use db3;

    #整型默认是有符号
    create table t1(id int(1));

    insert into t1 values(-1);
    insert into t1 values(2147483647);
    insert into t1 values(2147483648); #报错

    指定无符号
    create table t2(id int(1) unsigned);

    insert into t2 values(-1);
    insert into t2 values(4294967295);
    insert into t2 values(4294967296);


    #整型的宽度指的是显示宽度,不是存储宽度

    create table t3(id int(10));
    insert into t3 values(2147483647);
    insert into t3 values(2147483648); #报错

    alter table t3 modify id int(10) zerofill;
    mysql> select * from t3;
    +------------+
    | id         |
    +------------+
    | 2147483647 |
    | 0000000001 |
    +------------+
    2 rows in set (0.00 sec)
    alter table t3 modify id int(1) zerofill;
    mysql> select * from t3;
    +------------+
    | id         |
    +------------+
    | 2147483647 |
    |          1 |
    +------------+
    2 rows in set (0.00 sec)



    create table t4(id int);

    =========================浮点验证=======================
    create table t5(salary float(255,30));
    create table t6(salary double(255,30));

    create table t7(salary decimal(65,30));

    insert into t5 values(1.1111111111111111111111111111111);
    insert into t6 values(1.1111111111111111111111111111111);
    insert into t7 values(1.1111111111111111111111111111111);

    mysql> select * from t5;
    +----------------------------------+
    | salary                           |
    +----------------------------------+
    | 1.111111164093017600000000000000 |
    +----------------------------------+
    1 row in set (0.00 sec)

    mysql> select * from t6;
    +----------------------------------+
    | salary                           |
    +----------------------------------+
    | 1.111111111111111200000000000000 |
    +----------------------------------+
    1 row in set (0.00 sec)

    mysql> select * from t7;
    +----------------------------------+
    | salary                           |
    +----------------------------------+
    | 1.111111111111111111111111111111 |
    +----------------------------------+
    1 row in set (0.00 sec)



    =========================字符类型验证=======================
    char(5)
    a    |aa   |aaa  |

    varchar(5)

    1bytes+a|1bytes+aa|1bytes+aaa



    create table t8(x char(5));
    create table t9(x varchar(5));


    insert into t8 values('a'); #'a    '
    insert into t9 values('a'); #'a'


    select char_length(x) from t8; #'a    '
    select char_length(x) from t9; #'a'

    mysql> set sql_mode='PAD_CHAR_TO_FULL_LENGTH';
    Query OK, 0 rows affected (0.00 sec)

    mysql> select char_length(x) from t8; #'a    '
    +----------------+
    | char_length(x) |
    +----------------+
    |              5 |
    +----------------+
    1 row in set (0.00 sec)

    mysql> select char_length(x) from t9; #'a    '
    +----------------+
    | char_length(x) |
    +----------------+
    |              1 |
    +----------------+
    1 row in set (0.00 sec)



    select * from t8 where x='a    ';
    select * from t8 where x='a';

    select * from t8 where x like 'a    ';



    =========================日期类型验证=======================

    时间类型
        date:2017-01-27
        time:11:11:11
        datetime:2017-01-27 11:11:11
        timestamp:2017-01-27 11:11:11
        year:2017



    create table student(
        id int,
        name char(16),
        birth date,
        class_time time,
        reg_time datetime,
        born_year year
    );

    insert into student values
    (1,'egon',now(),now(),now(),now());

    insert into student values
    (2,'alex','2017/01/02','11:11:11','2017-01-02 11:11:11',1973);

    =========================枚举类型验证=======================




     

    约束条件

    #not null default
    create table t10(name char(16) not null default "aaaa");
    insert into t10 values();



    #key

    #一张表只能有一个?
    #为何一张innodb表必须有一个主键?
    #干什么用?
    #primary key:not null unique

    create table t13(
        id int not null unique,
        name char(10) not null unique
        );


    create table t14(
        id int primary key,
        name char(10) not null unique
        );


    #unique:唯一
    create table t11(id int unique,name char(16));
    insert into t11 values
    (1,'alex'),
    (1,'egon');


    create table t12(
        id int,
        name char(16),
        unique(id)
    );
    insert into t12 values
    (1,'alex'),
    (1,'egon');


    #联合唯一
        联合主键
        联合唯一

    create table service(
        id int primary key auto_increment,
        host char(32),
        port int,
        unique(host,port)
    );

    insert into service(host,port) values
    ('1.1.1.1',3306),
    ('1.1.1.2',3306);

    #foreign key



    #index




    #auto_increment
    create table t15(id int primary key auto_increment);


    set global auto_increment_offset=3; #初始的偏移量为2
    set global auto_increment_increment=4; #步长为2

    create table t16(id int primary key auto_increment);
    insert into t16 values
    (),
    (),
    ();

    set global auto_increment_offset=1; #初始的偏移量为2
    set global auto_increment_increment=1; #步长为2










     

    表关系

    #多对一
    #先建被关联的表
    create table dep(
        id int primary key auto_increment,
        name char(64)
    );

    #再建。、。。
    create table emp(
        id int primary key auto_increment,
        name char(32),
        dep_id int,
        foreign key(dep_id) references dep(id)
        on delete cascade
        on update cascade
    );

    #先插部门表
    insert into dep(name) values
    ('IT'),
    ('HR'),
    ('SALE'),
    ('OPERATION')
    ;
    #再插。。。。
    insert into emp(name,dep_id) values
    ('egon',1),
    ('alex',1),
    ('mingyue',2),
    ('waiawi',3),
    ('dingding',3),
    ('yaya',3),
    ('xingxing',3),
    ('yuyu',3);


    delete from emp where dep_id=1;

    delete from dep where id=1;



    #多对多
    create table book(
        id int primary key auto_increment,
        name char(32),
        type char(64)
    );
    create table author(
        id int primary key auto_increment,
        name char(32)
    );

    create table author2book(
        id int primary key auto_increment,
        book_id int,
        author_id int,
        foreign key(book_id) references book(id)
        on delete cascade
        on update cascade,
        foreign key(author_id) references author(id)
        on delete cascade
        on update cascade
    );


    #一对一













     

    单表查询的语法

    #1、单表查询语法
    select distinct 字段1,字段2,... from 表
        where 约束条件
        group by 分组字段
        having 过滤条件
        order by 排序字段
        limit 显示条数
        ;


    #2、基本查询
    select * from emp;
    select id from emp;
    select id,name from emp;
    select name as 姓名,salary*12 as 年薪 from emp;



    select distinct post from emp;



    select concat('姓名: ',name,' ','年薪',salary*12) from emp;
    select concat_ws(':',name,salary*12) from emp;

    #3、约束条件where
    select * from emp where post='teacher';
    select * from emp where post='teacher' and salary > 8000;
    select * from emp where post='teacher' and salary > 8300 and salary < 10000;
    select * from emp where salary between 8300 and 10000;
    select * from emp where salary in (8300,10000,12000);
    select * from emp where salary not in (8300,10000,12000);


    select * from emp where name like '程咬_';
    select * from emp where name like '程__';
    select * from emp where name like '__';

    select * from emp where name like '程%';
    select * from emp where name regexp '^程.*$';


    select * from emp where post_comment is null;
    select * from emp where post_comment is not null;


    #4、分组group by
    select post,max(salary) from emp group by post;
    select post,min(salary) from emp group by post;
    select post,avg(salary) from emp group by post;
    select post,sum(salary) from emp group by post;
    select post,count(id) from emp group by post;

    select sex,count(id) from emp group by sex;



    select post,group_concat(name) from emp group by post;





    select post,max(salary) from emp where age > 20 group by post;
    select max(salary) from emp;
    select count(id) from emp;
    select * from emp where id > 1;

    select count(id) from emp;





    #平均工资超过10000的部门


    select post,avg(salary) as avg_num from emp group by post having avg(salary) > 150000;





    select post,avg(salary) as avg_num from emp group by post having avg(salary) > 1000;

    select post,avg(salary) as avg_num from emp group by post having avg(salary) > 1000
    order by avg(salary) asc;


    select post,avg(salary) as avg_num from emp group by post having avg(salary) > 1000
    order by avg(salary) desc;


    select post,avg(salary) as avg_num from emp group by post having avg(salary) > 1000
    order by avg_num desc;





    select * from emp order by age,salary desc;


    select * from emp order by id desc limit 3;
    select * from emp limit 0,20;
    select * from emp limit 20,20;
    select * from emp limit 40,20;




     

  • 相关阅读:
    PHP 计算程序运行的时间
    PHP 简易版生成随机码
    PHP读取FLASH 文件信息
    MongoDB基本使用
    PHP实现QQ达人信息抓取
    bjtuOJ 1188 素数筛选
    bjtuOJ 1139 Longest Common Subsequence
    BJTU1113扫雷问题
    C#线程池的使用详解
    C#域名解析的简单制作
  • 原文地址:https://www.cnblogs.com/huangtiandi001/p/7953715.html
Copyright © 2020-2023  润新知