zoukankan      html  css  js  c++  java
  • MySQL的定义、操作、控制、查询语言的用法

    MYSQL语句:有2种
            DDL, DML
                DDL: CREATE, ALTER, DROP
                DML:  INSERT, DELETE, UPDATE, SELECT
                DCL: GRANT(授权), REVOKE(撤销授权)
                mysql命令中不区分字符大小写,但命令要与操作对象区分大小写;一般命令用大写,操作对象用小写;

    例如:在centos 7
    > help create:查看使用创建的命令帮助;
    > HELP CREATE DATABASE

    > show collation; 查看支持的所有排序规则集;
    > show character set; 查看支持的所有字符集;

    > CREATE SCHEMA IF NOT EXISTS testdb; 创建名为testdb的数据库,且如果不存在就创建;
                    
                数据库管理:
                    创建数据库:
                        CREATE  {DATABASE | SCHEMA}  [IF NOT EXISTS]  db_name;
                            指明默认字符集:[DEFAULT]  CHARACTER SET [=] charset_name
                            指明默认排序规则:[DEFAULT]  COLLATE [=] collation_name
                            
                        查看支持的所有字符集:SHOW CHARACTER SET
                        查看支持的所有排序规则:SHOW  COLLATION
                            同一种字符集有不同的排序规则;
                        
                    修改数据库:
                        ALTER {DATABASE | SCHEMA}  [db_name]
                            [DEFAULT]  CHARACTER SET [=] charset_name
                            [DEFAULT]  COLLATE [=] collation_name

    例如:
    > help alter database 查看修改数据库命令帮助;

                            
                    删除数据库:
                        DROP {DATABASE | SCHEMA} [IF EXISTS] db_name

                        注意:mysql数据库没有回收站,谨慎删除操作;

    例如:
    > help drop database; 查看删除数据库命令帮助;

    ]# cd /var/lib/mysq:数据库在文件系统上是以文件形式存储的;
    可在此目录下看见,自己创建的数据库testdb;所以,也可在linux文件系统上创建一个数据库文件,在登录mysql也能看见,但里面不能存储数据;

    注意:两个数据库名不要不区分大小写的相同名称;
                        
                    查看数据库:
                        SHOW DATABASES LIKE  ‘PAT’; 查看模式中匹配的库;
                        SHOW DATABASES;  查看所有库;

                            
                表管理:
                    创建表:有3种方式
                        CREATE TABLE  [IF NOT EXISTS]  tbl_name  (create_defination)  [table_options]
                        
                        create_defination:
                            定义字段:col_name  data_type
                            定义键:
                                PRIMARY KEY (col1, col2, ...) 定义主键约束字段
                                UNIQUE KEY  (col1, col2,...) 定义唯一键约束字段
                                FOREIGN KEY (column) 定义字段为外键约束
                            定义索引:
                                KEY|INDEX  [index_name]  (col1, col2,...)
                                
                        table_options:
                            ENGINE [=] engine_name 指定存储引擎;
                            
                        查看数据库支持的所有存储引擎类型:
                            mysql> SHOW  ENGINES;
                            
                        查看某表的存储引擎类型:
                            mysql> SHOW  TABLES  STATUS  [LIKE  'tbl_name']

                        查看表
                            SHOW TABLES LIKE  ‘PAT’; 查看模式中匹配的库;
                            SHOW TABLES;  查看所有表;

    例如:
    > help create table 查看创建表命令帮助;
    > use testdb 先进入指定数据库中;
    > CREATE TABLE students(id  INT UNSIGNED NOT NULL, name CHAR(30) NOT NULL, age TINYINT UNSIGNED, gender ENUM('f','m'));
    创建表student,字段分别为id字段类型为无符号、整型、,不能为空,name字段定长为30字节、不能为空,age字段为微小整型、无符号,gender字段枚举只能使用f或m;
    注意:没有说明不能为空的字段,就可以为空;


    > DESC students; 查看表中的字段;

    > CREATE TABLE students(id  INT UNSIGNED NOT NULL PRIMARY KEY, name CHAR(30) NOT NULL, age TINYINT UNSIGNED, gender ENUM('f','m'));
    其中:指定单独的一个字段为主键,即在id字段后设置PRIMARY KEY即可;
    > DESC students

    > CREATE TABLE students(id INT UNSIGNED NOT NULL, name CHAR(30) NOT NULL, age TINYINT UNSIGNED, gender ENUM('f','m'), PRIMARY KEY(id,name));
    其中:指定多个字段为主键,即指定id和name字段为主键,在命令最后设置PRIMARY KEY(id,name)即可;
    > DESC students;

    注意:UNSIGNED在修饰类型的,必须跟在INT数据类型的后面设置;

    > show table statusG 查看默认的表存储引擎类型,垂直显示;
    > SHOW TABLE STATUS like 'students'G 查看指定表存储引擎类型;

                    修改表:
                        ALTER [ONLINE | OFFLINE] [IGNORE] TABLE tbl_name  [alter_specification [, alter_specification] ...]
                        
                        alter_specification:修改规范
                            字段修改:
                                添加字段:ADD  [COLUMN]  col_name  data_type  [FIRST | AFTER col_name ]
                                    FIRST:放在表的第一个字段;
                                    AFTER col_name:放在指定字段的后面,不指明默认放在最后字段;
                                删除字段:DROP  [COLUMN] col_name
                                修改:
                                    CHANGE [COLUMN] old_col_name new_col_name column_definition  [FIRST|AFTER col_name]  大改,可改字段名
                                    MODIFY [COLUMN] col_name column_definition  [FIRST | AFTER col_name] 小改,可改字段中的定义
                            键修改:
                                添加键:ADD  {PRIMARY|UNIQUE|FOREIGN}  KEY (col1, col2,...)
                                    注意:添加唯一键和外键时,键是有名字的;
                                删除键:
                                    主键:DROP PRIMARY KEY
                                    外键:DROP FOREIGN KEY fk_symbol
                                    唯一键:DROP {INDEX|KEY} index_name
                            索引修改:
                                添加索引:ADD {INDEX|KEY} [index_name]  (col1, col2,...)
                                删除索引:DROP {INDEX|KEY}  index_name
                                    注意:索引可以有名字;
                            表选项修改:
                                ENGINE [=] engine_name

                                注意:改引擎比较危险,是先创建表,再按照目标存储引擎,把原数据导入,需要大量时间;
                            
                        查看表上的索引的信息:
                            mysql> SHOW INDEXES FROM tbl_name;

    可修改的内容有create_defination中定义的内容、table_options中定义的内容等;
    > help alter table 查看修改命令帮助
    > show tables; 查看所有表
    > DESC students; 查看表中字段

    > ALTER TABLE students ADD class VARCHAR(100) NOT NULL; 在students表中添加class字段,类型为可变长字段、长度最大100个字节、此字段不能为空;
    > ALTER TABLE students DROP class; 删除表中的class字段

    > ALTER TABLE students ADD class VARCHAR(100) NOT NULL AFTER name; 指定把class字段添加在name字段后面
    > DESC students;

    > ALTER TABLE students MODIFY class VARCHAR(100) AFTER age; 小改,把class字段改在age字段后面
    > DESC students;

    > ALTER TABLE students DROP PRIMARY KEY; 删除主键
    > DESC students;

    > ALTER TABLE students ADD UNIQUE KEY (name); 添加name字段为主键,如果此字段要求不能为空,则字段变为唯一键
    > DESC students;

    > SHOW INDEX FROM students; 查看tudents表中索引信息

    > ALTER TABLE students DROP INDEX name; 删除students表中索引名为name

    > ALTER TABLE students ADD INDEX class (class); 添加字段class的索引为class,索引名和字段名可相同

    > SHOW INDEX FROM students; 查看表中的索引
    > ALTER TABLE students DROP INDEX class;
    > SHOW INDEX FROM students;
    > DESC students;

    注意:表是库中的,如果使用'use 库名'设定了默认库,可使用表的基名,如果没有设定默认库,则:
    > SHOW TABLES FROM testdb; 指明仓库testdb数据库中的表
    > CTEATE TABLE mydb.class 指明在mydb数据库中创建表名为class

    使用库名.表名为绝对路径,使用use 库名,设定默认库;

                            
                    删除表:
                        DROP  TABLE  [IF EXISTS]   tbl_name [, tbl_name] ...
    例如:
    > DROP TABLE students; 删除表studnets
                    
                    表的引用方式:
                        tbl_name 在使用use 库名设定默认库后,才能使用此方式;
                        db_name.tbl_name 即库名.表名是决对路径方式;
                
                    第二种表的创建方式:
                        复制表结构;
                        
                    第三种表的创建方式:
                        复制表数据;
                
                索引管理:
                    索引是特殊的数据结构;
                    
                    索引:要有索引名称;没有修改,只有删除;
                    
                    创建索引:
                        CREATE  [UNIQUE|FULLTEXT|SPATIAL] INDEX  index_name  [BTREE|HASH]  ON tbl_name (col1, col2,,...)

                            UNIQUE 创建唯一键索引;前面介绍unique key也可创建唯一键索引;
                            FULLTEXT 创建全文索引;后面介绍;
                            BTREE|HASH 索引类型;mysql中只有memory表有哈希索引;而memory表很少手动创建,其它表又都不支持,所以只可手动创建为btree索引;

    创建索引时,什么选项都不加默认创建为btree索引;
    索引有两种类型,一种是树状是索引,一种是hash索引;mysql使用的是btree索引,b树索引也叫平衡树;b树索有3种:b-树,b树,b+树;mysql用的是b+树;

    例如:
    > SHOW TABLES FROM testdb;
    > CREATE TABLE testdb.classesc 取消执行命令语句;
    > use testdb
    > SHOW INDEX FROM students; 没有任何索引;
    > CREATE INDEX name_and_class ON students (name,class); 添加name和class为索引,
    > SHOW INDEX FROM students; 查看表中的索引;为多值索引;
                    
                    删除索引:
                        DROP  INDEX index_name ON tbl_name

    例如:
    > help drop index; 查看删除索引命令帮助;
    > DROP INDEX name_and_class ON students; 删除索引;
    > SHOW INDEX FROM students;
                
                服务器端命令:数据管理

                DML:INSERT, DELETE, UPDATE, SELECT
                    
                    INSERT INTO命令:添加数据
                        INSERT  [INTO]  tbl_name  [(col1,...)]  {VALUES|VALUE}  (val1, ...),(...),...

                        col1对应val1,每个字段都应该对应一个值;可批量插入;
                        
                        注意:
                            字符型:必须用引号;
                            数值型:不能用引号;
    例如:
    > desc students;
    +--------+---------------------+------+-----+---------+-------+
    | Field  | Type                | Null | Key | Default | Extra |
    +--------+---------------------+------+-----+---------+-------+
    | id     | int(10) unsigned    | NO   |     | NULL    |       |
    | name   | char(30)            | NO   |     | NULL    |       |
    | class  | varchar(100)        | NO   |     | NULL    |       |
    | age    | tinyint(3) unsigned | YES  |     | NULL    |       |
    | gender | enum('f','m')       | YES  |     | NULL    |       |
    +--------+---------------------+------+-----+---------+-------+

    > INSERT INTO students VALUES (1,'kobe',96,38,'m'); 在表中(没指明字段)每个字段都插入数据;第一个字段为1,第二字段为kobe,以此类推;

    允许为空的字段,可以不给值;
    > INSERT INTO students (id,name) VALUES (2,'jodan'),(3,'oneal'); 只添加id和name字段的值;添加2个;
                            
                    SELECT命令:查询
                        (1) SELECT  *  FROM  tbl_name; 查看指定表中的所有字段;
                        (2) SELECT  col1, col2, ...  FROM  tbl_name; 查看指定表中的指定字段;这种方式叫投影;
                            显示时,字段可以显示为别名;
                                col_name  AS  col_alias
                        (3)  SELECT  col1, ...  FROM tbl_name  WHERE clause;
                            WHERE clause:用于指明挑选条件;一般为布尔型;
                                col_name 操作符 value:
                                    例如:age > 30;
                                    
                                操作符(1) :
                                    >, <, >=, <=, ==, !=
                                    
                                组合条件:
                                    and
                                    or
                                    not
                                    
                                操作符(2) :
                                    BETWEEN ...  AND ... 数值范围内的闭区间;
                                    LIKE 'PATTERN'  查询方式效率极低;
                                        通配符:
                                            %:任意长度的任意字符;
                                            _:任意单个字符;
                                    RLIKE  'PATTERN'
                                        正则表达式对字符串做模式匹配;
                                    IS NULL
                                    IS NOT NULL
                        (4) SELECT col1, ... FROM tbl_name  [WHERE clause]  ORDER BY  col_name, col_name2, ...  [ASC|DESC];
                            指定字段排序;
                            ASC: 升序排序;默认;
                            DESC: 降序序;

    内连接有如下三种:
    等值连接:让表之间的字段以“等值”建立连接关系;
    自然连接:等值连接不将重复属性去掉,而自然连接去掉重复属性,也可以说,自然连接是去掉重复列的等值连接。
    不等值连接:等值连接:主要用除了等号之外的操作符,比如:<>、>、<、>=、<=、LIKE、IN、BETWEEN…AND。

    学生表与班级表取左外连接
    
    select s.stuid,s.name,c.class from students as s left join classes as c on s.classid=c.classid;
    
    +-------+---------------+----------------+
    | stuid | name          | class          |
    +-------+---------------+----------------+
    |     1 | Shi Zhongyu   | Emei Pai       |
    |     2 | Shi Potian    | Shaolin Pai    |
    |     3 | Xie Yanke     | Emei Pai       |
    |     4 | Ding Dian     | Wudang Pai     |
    |     5 | Yu Yutong     | QingCheng Pai  |
    |     6 | Shi Qing      | Riyue Shenjiao |
    |     7 | Xi Ren        | QingCheng Pai  |
    |     8 | Lin Daiyu     | Ming Jiao      |
    |     9 | Ren Yingying  | Lianshan Pai   |
    |    10 | Yue Lingshan  | QingCheng Pai  |
    |    11 | Yuan Chengzhi | Lianshan Pai   |
    |    12 | Wen Qingqing  | Shaolin Pai    |
    |    13 | Tian Boguang  | Emei Pai       |
    |    14 | Lu Wushuang   | QingCheng Pai  |
    |    15 | Duan Yu       | Wudang Pai     |
    |    16 | Xu Zhu        | Shaolin Pai    |
    |    17 | Lin Chong     | Wudang Pai     |
    |    18 | Hua Rong      | Ming Jiao      |
    |    19 | Xue Baochai   | Lianshan Pai   |
    |    20 | Diao Chan     | Ming Jiao      |
    |    21 | Huang Yueying | Lianshan Pai   |
    |    22 | Xiao Qiao     | Shaolin Pai    |
    |    23 | Ma Chao       | Wudang Pai     |
    # |    24 | Xu Xian       | NULL           |
    # |    25 | Sun Dasheng   | NULL           |
    +-------+---------------+----------------+
    
    学生表与班级表取左外连接,并且减去学生表与课程表交集部分
    select s.stuid,s.name,c.class from students as s left join classes as c on s.classid=c.classid where c.classid is NULL;
    
    +-------+-------------+-------+
    | stuid | name        | class |
    +-------+-------------+-------+
    |    24 | Xu Xian     | NULL  |
    |    25 | Sun Dasheng | NULL  |
    +-------+-------------+-------+
    
    计算女生成绩的平均值
    select avg(age) from students group by gender having gender='F';
    


    例如:
    > SELECT * FROM students; 从students表中查看所有字段;
    +----+-------+-------+------+--------+
    | id | name  | class | age  | gender |
    +----+-------+-------+------+--------+
    |  1 | kobe  | 96    |   38 | m      |
    |  2 | jodan |       | NULL | NULL   |
    |  3 | oneal |       | NULL | NULL   |
    +----+-------+-------+------+--------+

    > SELECT id,name FROM students; 查看指定字段;即投影;
    +----+-------+
    | id | name  |
    +----+-------+
    |  1 | kobe  |
    |  2 | jodan |
    |  3 | oneal |
    +----+-------+

    > SELECT id as stuID,name FROM students; 显示时把id字段显示为别名为stuID;
    +-------+-------+
    | stuID | name  |
    +-------+-------+
    |     1 | kobe  |
    |     2 | jodan |
    |     3 | oneal |
    +-------+-------+

    > SELECT * FROM students WHERE id=1; 查询表中,id=1的所有信息;
    +----+------+-------+------+--------+
    | id | name | class | age  | gender |
    +----+------+-------+------+--------+
    |  1 | kobe | 96    |   38 | m      |
    +----+------+-------+------+--------+

    > SELECT * FROM students WHERE name='jodan'; 字符比较使用一个=也可以;
    +----+-------+-------+------+--------+
    | id | name  | class | age  | gender |
    +----+-------+-------+------+--------+
    |  2 | jodan |       | NULL | NULL   |
    +----+-------+-------+------+--------+

    > DESC students;
    +--------+---------------------+------+-----+---------+-------+
    | Field  | Type                | Null | Key | Default | Extra |
    +--------+---------------------+------+-----+---------+-------+
    | id     | int(10) unsigned    | NO   |     | NULL    |       |
    | name   | char(30)            | NO   |     | NULL    |       |
    | class  | varchar(100)        | NO   |     | NULL    |       |
    | age    | tinyint(3) unsigned | YES  |     | NULL    |       |
    | gender | enum('f','m')       | YES  |     | NULL    |       |
    +--------+---------------------+------+-----+---------+-------+

    注意:char类型不区分大小写;

    > SELECT name,age FROM students WHERE age > 30 and age < 80; 组合条件查询;
    > SELECT name,age FROM students WHERE age >= 30 and age =< 80; 显示age和name字段,且符合age的条件;
    > SELECT name,age FROM students WHERE age BETWEEN 30 and 80; 同上,between..and表示范围区间;

    > SELECT name FROM students WHERE name LIKE '%n%'; 使用mysql中的模式匹配查看name中包含n的字段;
    +-------+
    | name  |
    +-------+
    | jodan |
    | oneal |
    +-------+

    > SELECT name FROM students WHERE name RLIKE '^.*n.*$'; 使用正则式模式匹配;查询结果同上;

    > SELECT name,age FROM students WHERE age IS NULL; 查询age字段为空,只显示name和age字段;
    +-------+------+
    | name  | age  |
    +-------+------+
    | jodan | NULL |
    | oneal | NULL |
    +-------+------+

    > SELECT name,age FROM students WHERE age IS NOT NULL; age字段不为空的字段;
    +------+------+
    | name | age  |
    +------+------+
    | kobe |   38 |
    +------+------+

    > SELECT id,name FROM students ORDER BY name; 根据name字段排序,默认为升序,只显示id和name字段;
    +----+-------+
    | id | name  |
    +----+-------+
    |  2 | jodan |
    |  1 | kobe  |
    |  3 | oneal |
    +----+-------+

    > SELECT id,name FROM students ORDER BY name DESC; 根据name降序排序;

    注意:广义的查询,在增、删、查、改中都包含查询;

                    DELETE:
                        DELETE   FROM  tbl_name  [WHERE where_condition]  [ORDER BY ...]  [LIMIT row_count]
                        
                        (1) DELETE  FROM  tbl_name  WHERE where_condition
                        (2) DELETE  FROM  tbl_name  [ORDER BY ...]  [LIMIT row_count]

                        注意:慎用删除;删除指明条件;
    例如:
    > DELETE FROM students WHERE age IS NULL;  删除age字段为空的行;
    > SELECT * FROM students;
    +----+------+-------+------+--------+
    | id | name | class | age  | gender |
    +----+------+-------+------+--------+
    |  1 | kobe | 96    |   38 | m      |
    +----+------+-------+------+--------+
    注意:删除不指明条件,则整表都删除;

    退出数据库,在linux中批量添加;
    ]# for i in {1..100};do AGE=$[$RANDOM%100];mysql -e "INSERT INTO testdb.students (id,name,age) VALUES ($i,"stu$i",$AGE);";done

    ]# mysql
    > use testdb
    > SELECT * FROM  student; 显示添加了100个用户;
    > SELECT * FROM students ORDER BY age DESC; 手动排序,age字段为降序;
    > DELETE FROM students ORDER BY age DESC LIMIT 20; 删除age最大的前20个用户的行;
    > UPDATE students SET age=age-5 ORDER BY id DESC LIMIT 5; 只改id最大的前10个用户,把age字段-10;
    > SELECT name,age FROM students WHERE name NOT LIKE 'stu%'; 查找name,age字段,name不是stu开头的字段的行;
    +------+------+
    | name | age  |
    +------+------+
    | kobe |   38 |
    +------+------+

    > UPDATE students SET age=age-5 WHERE name NOT LIKE 'stu%';查找name字段,不是stu开头的字段,age-5;
    > SELECT name,age FROM students WHERE name NOT LIKE 'stu%';
    +------+------+
    | name | age  |
    +------+------+
    | kobe |   33 |
    +------+------+
                        
                    UPDATE:
                        UPDATE [LOW_PRIORITY] [IGNORE] table_reference  SET col_name1=value1 [, col_name2=value2] ... [WHERE where_condition]  [ORDER BY ...] [LIMIT row_count]
                        
                用户账号及权限管理:
                    
                    用户账号:'username'@'host'
                        host:主机名,此用户访问当前mysql服务器时,允许其通过哪些主机远程创建连接;
                            表示方式:IP,网络地址、主机名、通配符(%和_);
                            
                        禁止检查主机名:my.cnf
                            [mysqld]
                            skip_name_resolve = ON
                            
                    创建用户账号:
                        CREATE  USER   'username'@'host'  [IDENTIFIED BY  'password'];

    例如:
    > CREATE USER 'testuser'@'172.18.%.%.' IDENTIFIED BY 'testpass'; 创建用户testuser,密码为testpass;
    > FLUSH PRIVILEGES; 刷新授权表;

    ]# mysql -utestuser -h172.18.11.2 -p
    输入设置的密码登录成功;

    > show databases;


                        
                    删除用户账号:
                        DROP USER  'user'@'host' [, user@host] ...





                    授权:
                        权限级别:管理权限、数据库、表、字段、存储例程;
                        
                        GRANT  priv_type,...  ON  [object_type]  db_name.tbl_name  TO  'user'@'host'  [IDENTIFIED BY  'password'];
                            
                            priv_type: ALL  [PRIVILEGES],权限还可为CREATE, ALTER, DROP, INSERT, DELETE, UPDATE, SELECT;
                            db_name.tbl_name:库名.表名;
                                *.*:所有库的所有表;
                                db_name.*:指定库的所有表;
                                db_name.tbl_name:指定库的特定表;
                                db_name.routine_name:指定库上的存储过程或存储函数;
                                    如果db_name与routine_name同名,只能靠object_type来区别;
                            
                            [object_type]
                                TABLE 表
                                FUNCTION 函数
                                PROCEDURE 过程
                            
                        查看用户所获得的授权:
                            SHOW GRANTS FOR  'user'@'host' 查看指定用户所获得的授权:
                            
                            SHOW GRANTS FOR CURRENT_USER; 查看当前用户的权限;

    例如:
    > GRANT SELECT ON testdb.students TO 'testuser'@'172.18.%.%'; 授权testuser用户有SELECT权限,对testdb库中的students表;
    > FLUSH PRIVILEGES; 刷新授权;
    > exit

    ]# mysql -utestuser -h172.18.11.2 -ptestpass
    > SHOW DATABASES;
    > use testdb;
    > SELECT * FROM students;
    > INSERT INTO students (id,name) VALUES (101,'NIK YANG'); 不能插入,没有insert权限;

    > GRANT INSERT ON testdb.students TO 'testuser'@'172.18.%.%';
    > FLUSH PRIVILEGES;
    > INSERT INTO students (id,name) VALUES (101,'NIK YANG');  此时有权限插入;

    注意:授权时不影响原来的权限;授权是累加的;

    > SHOW GRANTS FOR 'testuser'@'172.18.%.%'; 查看指定用户的授权;
    > SHOW GRANTS FOR CURRENT_USER; 查看当前用户的权限;


                            
                        回收权限:
                            REVOKE  priv_type, ...  ON  db_name.tbl_name  FROM  'user'@'host';
                            
                        注意:MariaDB服务进程启动时,会读取mysql库的所有授权表至内存中;
                            (1) GRANT或REVOKE命令等执行的权限操作会保存于表中,MariaDB此时一般会自动重读授权表,权限修改会立即生效;
                            (2) 其它方式实现的权限修改,要想生效,必须手动运行FLUSH PRIVILEGES命令方可;

  • 相关阅读:
    【Q&A】pytorch中的worker如何工作的
    【教程】opencv-python+yolov3实现目标检测
    ubuntu使用scrcpy手机投屏-免费神器scrcpy【介绍、安装、使用】
    【从踩坑到教程】win10下ubuntu18.04双系统UEFI模式安装、Nvidia驱动安装
    Python引用与目录结构
    交流总结
    转载-趣图展现程序员职业生涯的11个阶段
    转载-在家工作,10招助你效率、生活两不误
    转载-新年寄望:从小做起,活在当下
    转载-成为明星程序员的10个提示
  • 原文地址:https://www.cnblogs.com/tanxiaojun/p/11298345.html
Copyright © 2011-2022 走看看