zoukankan      html  css  js  c++  java
  • 初识MySql

       mysql(Relational Database Management System) 

    mysql是一种处理文件操作的一款软件,是关系型的数据库,关系型可以理解为“表格的概念”,一个关系型数据库由一个或多个表格组成

        

    --表头(header) 每一列的名称;
        --列 (row) 具有相同数据类型的数据的集合;
        --行 (col) 每一行用来描述个人或物的信息;
        --值 (values) 行的具体信息,每个值必须与该列的数据类型相同;
        --键 (key) 表中用来识别某个特定的人或物的方法,键的值在当前列中具有唯一性;

             服务端软件                                                                           

          socket服务端
          本地文件操作
          解析sql语句


             客户端软件                                                                           
          socket客户端
          发送指令
          解析sql语句

      PS:
          DBMS数据库管理系统
          SQL语句

        其他类似软件:
          --关系型数据库:sqllite,db2,oracle,access,sql server,mysql
          --非关系型数据库:MongoDB,redis

       Windows下的mysql安装,配置                                         

    安装

        www.mysql.com 官网下载
        1,安装windowns服务: mysqld --install
        2,初始化data文件:mysqld -- initialize -insecure

        初始化完后,会有一个默认的root用户,密码是空

          连接mysql服务器: net start mysql
          关闭mysql服务器:net stop mysql
          卸载mysql服务器:sc delete mysql

      使用 mysqladmin 方式:

        修改密码: mysqladmin -u root -p password 新密码
        set password for '用户名'@'IP地址' = Password('新密码')

       使用mysql                                                                             

    mysql数据类型:
    数字:unsigned加上是表示"无符号"
         

          整形
            int
              有符号:
                -21474836482147483647
              无符号:
                04294967295
            tinyint
    
              有符号:
                -128 ~127
              无符号:
                0255
    
    
          bigint
              有符号:
                -92233720368547758089223372036854775807
              无符号:
                018446744073709551615

    浮点型

            float 精度丢失,到了一定长度精度丢失
            double 精度丢失,比float大一倍左右才会丢失精度
            decimal 精度最高(可指定长度跟小数点位数)
              decimal(65,30) 最大值
              对于精确数值计算时需要用此类型
              decaimal能够存储精确值的原因在于其内部按照字符串存储。

    字符串:

            char 查找速度快
                用于表示固定长度的字符串,最多255字符
            varchr 节省空间
                不固定长度的字符串,最多255字符
    
    
            文本:text ,tinytext,mediumtext,longtext
                上传大文件:文件存硬盘
                路径存数据库
            enum 枚举类型
                五个列中,只能选择一个
            set 集合类型
                create table myset(col("a","b","c","d"))
                inert into myset (col) values("a",("c")),("d","a");
                可以多个组合
    
            二进制(存图片,音乐,视频等):tinyblob, blob,mediumblob

    时间类型:

            DATE
              年月日
            TIME
              时分秒
            DATETIME
              年月日时分秒
            TIMESTAMP
              从1970-01-01 00:00:00开始


          创建用户:                                                                     

        --登录:mysql -u 用户名 -p; (-p是密码)
        mysql -D 所选的数据库名 -u 用户名 -p
    
    
        --选择数据库连接:use 数据库名;
        --必须是登录的root用户
        --连接mysql数据库
        create user "用户名"@"IP地址" identifed by "密码";
    
        root1只能在192.168.0.1这个IP上登录
        create user "root1"@"192.168.0.1" identifed by "123";
    
        %是代表所有的ip都能登录
        create user "root1"@"%" identifed by "123";


      删除用户:                                                            

        drop user "用户名"@"IP地址";


        修改用户:                                                              
       

        rename user "用户名"@"IP地址" to "新用户"@"IP地址";

      授权:                                                                  

        给root1用户在所有的IP都能登录给root1用户 查看,插入, 更新的权限
        grant select,insert,update on 数据库名 to "root1"@"%";
    
        给root1用户在所有的IP都能登录,在db这个数据库的所有操作权限
        grant all privileges on db to "root1"@"%";

       数据库操作                                                                    


    查看:

        show databases; 


    创建:

        create database 数据库名 default charset utf8;
    
        default charset utf8指定字符编码

    删除:

        drop database 数据库名;

       表操作                                                                           

    查看:

        show tables;


    创建:

        create table 表名(列 类型 auto_increment primary key,
                 列 类型 )engine=innodb default charset utf8;
    
    
        create table 表名(id int auto_increment primary key,
                name char(10) not null,
                age tinyint unsigned not null)engine=innodb default charset utf8;
          解释:
            auto_increment 自增,
            primary key 约束(不能重复也不能为空)加速查找速度,
            两者是在一起用的,给一列数据用,
            engine=innodb 指定引擎 支持事物,原子性操作,不指定默认myisam
            not null 指定该列的值不能为空,必须要填
            null 可为空
            unsigned 修饰int类型,表示int是无符号

    清空表:

        delete from 表名; 删除表里的内容,表还存在,
        truncate table 表名; 删除表里的内容,表还存在


    删除表:

        drop table 表名; 删除整张表



       创建后表的操作:                                                                 

    --添加列:

         alter table 表名 add 新列名 新列数据类型;
    
         alter table 表名 add 新列名 新列数据类型 alter 插入位置;

         
    --修改列:

          修改列名
            alter table 表名 change 列名 新列名 新数据类型;
    
          修改列的数据类型
            alter table 表名 change 列名 列名 新数据类型;

    --删除列:

          alter table 表名 drop 列名;

    --重命名表:

          alter table 表名 rename 新表名;

    --添加主键:

           alter table 表名 add primary key(列名);

    --删除主键:

                    alter table 表名 drop primary key;
    
              alter table 表名 modify 列名 int,drop primary key;
    

       表内文件操作                                                                    

    增:

        插入部分数据
          insert into 表名(列名1,列名2....) values (值1,值2....)
    
        插入所有列的数据,表中有几列,就需要添加几个值
          insert into 表名 values (值1,值2,值3....);

    删:

        delete from 表名 where 删除条件;

    改:

        update 表名 set 列名=新值;
        update 表名 set 列名=新值 where 更新条件;


    查:

        select * from 表名; 查询表内所有信息;
    
        select 列名1,列名2 from 表名; 两列的信息;
    
        select * from 表名 where age>20; 从表中找出age>20的所有信息
         > = < >= <= != or and》等等
    1,条件 in, not in , between and
        select * from 表名 where id>10 and name != "钢弹" and password = "123";
    
        select * from 表名 where id in (12,22,43);
    
        select * from 表名 where id not in (12,22,32);
        
        select * from 表名 where id in (select id from 表名);
    
        select * from 表名 where between 5 and 10; -- 第五列到10列
    
    2,通配符 like
        
        select * from 表名 where name like "%hello%"; -- 中间有hello就行
    
        select * from 表名 where name like "he_" -- he后面的一个字符
    
        select * from 表名 where name like "he%" -- he后面的所有字符
    
    3,分页 limit
        
        select * from 表名 limit 10; -- 前10行
    
        select * from 表名 limit 10,10; -- 第10行后面的10行
        
        select * from 表名 limit 10 offset 10; -- 第10行后面的10行,跟上面一样
    
    
    4,排序 order by desc和asc
    
        select * from 表名 order by 列名 asc;  -- 从小到大
    
        select * from 表名 order by 列名 desc; -- 从大到小
    
        select * from 表名 order by 列名1 desc 列名2 asc; -- 列名1从大到小,如有重复的,在按照列名2的从小到大排序
    
    
    4, 分组 group by 二次筛选用having,不能用where
    
        select num from 表名 group by num; -- 过滤重复的
    
        select num,nid  from 表名 group by num,nid;
        
        -- 先把num分组,在把num大于10的全部找出来
        select num from 表名 group by num having num>10;    
    
        注意:where需要在group by前面才可以 ,order by在最后    
        select num from 表名 where id=1 group by num;
    
    
        count分完组总共有几行,sum求和,max最大数,min最小数,都是函数    
        select num,nid,count(*),sum(score),max(score),min(score) fromgroup by num,nid
    
    
    5,连表 ,left joinright joininner join
    
        无对应关系则不显示
        select A.num, A.name, B.name
        from A,B
        Where A.nid = B.nid
     
        无对应关系则不显示
        select A.num, A.name, B.name
        from A inner join B
        on A.nid = B.nid
     
        A表所有显示,如果B中无对应关系,则值为null
        select A.num, A.name, B.name
        from A left join B
        on A.nid = B.nid
     
        B表所有显示,如果B中无对应关系,则值为null
        select A.num, A.name, B.name
        from A right join B
        on A.nid = B.nid
    
    6,组合 ,union 
        
        组合,自动处理重合
        select nickname
        from A
        union
        select name
        from B
     
        组合,不处理重合
        select nickname
        from A
        union all
        select name
        from B
    其他查的操作

     
       视图:                                                                          

    视图是一个虚拟表(非真实存在的),其本质用SQL语句获取动态的数据集,用户使用时,只需用名称,就能获取到结果集,并可以将它当做临时表来用。

    SELECT
        *
    FROM
        (
            SELECT
                username,
                PASSWORD
            FROM
                userinfo
            WHERE
                id > 5
        ) AS A
    WHERE
        A.username > "j"
    临时表搜索

    1,创建视图:

     -- 格式:create view 视图名 as SQL语句
    
    create view v2 as select * from userinfo;
    View Code

    2,删除视图:

    -- 格式:drop view 视图名
    
    drop view v2;
    View Code

    3,修改视图:

    -- 格式:alter view 视图名 as SQL语句
    
    
    alter view v2 as select * from userinfo;
    View Code

    4,使用视图:

    使用视图时,当做临时表操作就行,由于视图时虚拟的,所以不能对它进行增加,修改,删除等操作,只能查询。

    -- 格式:select * from 视图名
    
    select * from v1;
    View Code

       触发器                                                                          

    对于某个表进行【增删改】操作的前后,如果想触发某个特定的行为时,可以使用触发器,触发器是用于用户对表的【增删改】操作的前后的行为。

    创建触发器的基本语法:

    -- 插入前
    
    delimiter //
    
    create trigger c1 before insert on userinfo for each row 
    
    BEGIN
    -- 插入完执行的SQL语句
    
    end //
    
    delimiter ;
    
    
    
    -- 插入后
    
    delimiter //
    
    create trigger c1 after insert on userinfo for each row 
    
    BEGIN
    -- 插入完执行的SQL语句
    
    end //
    
    delimiter ;
    
    
    
    -- 删除前
    
    delimiter //
    
    create trigger c1 before delete on userinfo for each row 
    
    BEGIN
    
    -- 删除完完执行的SQL语句
    
    end //
    
    delimiter ;
    
    
    -- 删除后
    
    delimiter //
    
    create trigger c1 after delete on userinfo for each row 
    
    BEGIN
    
    -- 删除完完执行的SQL语句
    
    end //
    
    delimiter ;
    
    
    -- 更新前
    
    delimiter //
    
    create trigger c1 before update on userinfo for each row 
    
    BEGIN
    
    -- 更新完执行的SQL语句
    
    end //
    
    delimiter ;
    
    
    -- 更新后
    
    delimiter //
    
    create trigger c1 after update on userinfo for each row 
    
    BEGIN
    
    -- 更新完执行的SQL语句
    
    end //
    
    delimiter ;
    View Code
    delimiter //
    
    create trigger t1 before insert on userinfo for each row 
    BEGIN
    
    INSERT INTO student(gender,class_id,sname) values("女",4,"铁锤");
    
    end //
    
    delimiter;
    
    
    -- 向userinfo 插入之前 触发 向student插入数据
    插入前触发器
    delimiter //
    CREATE TRIGGER t1 AFTER INSERT ON tb1 FOR EACH ROW
    BEGIN
        IF NEW. num = 666 THEN
            INSERT INTO tb2 (NAME)
            VALUES
                ('666'),
                ('666') ;
        ELSEIF NEW. num = 555 THEN
            INSERT INTO tb2 (NAME)
            VALUES
                ('555'),
                ('555') ;
        END IF;
    END//
    delimiter ;
    插入后触发器

    注意:NEW表示即将插入的数据行,OLD表示即将删除的数据行

    1,删除触发器:

    -- 格式: drop trigger 触发器名;
    
    drop trigger t1;
    View Code

    2,使用触发器:

    触发器无法由用户直接调用,而是由对表的【增删改】操作的时候被动的触发的。

    -- 运行时会自动引发触发器
    
    insert into userinfo(username,password) values("铁锤",123432);
    View Code

       存储过程                                                                    

    存储过程是一个SQL语句集合,当主动去调用存储过程时,其中内部的SQL语句会按照逻辑执行,还可以在内部添加函数,而视图时不能再内部添加函数的。主要用于代替程序员写SQL语句、是存在mysql服务端的

    存储过程的三种调用方式:

      1,MYSQL----》存储过程
    
        程序:调用存储过程
    
     
    
      2,MYSQL----》存储过程
    
        程序:SQL语句
    
     
    
      3,MYSQL-----》存储过程
    
        程序:类和对象(SQL语句)

    1,创建存储过程:                                                       

    -- 格式:
    
    delmiter //   -- 把SQL语句的结束符修改成//,为了避免与SQL语句冲突
    
    create procedure 存储过程名字()
    
    BEGIN  -- 语句开始
    
        SQL语句;
    
    END//  -- 语句结束
    
    delimiter ;
    
    
    
    
    -- 创建存储过程
    
    delimiter //
    
    create procedure p1()
    
    BEGIN
    
        select * from t1;
    
    END//
    
    delimiter ;
    
    
    
    
    -- 执行存储过程
    
    -- 格式:call 存储过程名字()
    
    call p1()
    无参数的存储过程

    对于存储过程,可以接收参数,其参数有三类:

    • in          仅用于传入参数用
      out        仅用于返回值用,存储过程中是没有返回值的,只是把out伪装成返回值
      inout     既可以传入又可以当作返回值
    -- in
    
    delimiter //
    create PROCEDURE p5(
            in n1 int,
            in n2 int
    )
    BEGIN
        SELECT * from student WHERE sid > n1;
    end //
    delimiter;
    
    -- 调用
    
    call p5(12,2)
    
    -- in 返回的是结果集
    有参存储过程--in
    delimiter //
    
    create procedure p3(
        in n1 int,
        inout n2 int
    )
    BEGIN
        set n2 = 123123;
        select * from student where sid > n1;
    END //
        delimiter ;
                
    
    -- 调用            
    set @_p3_0 = 12
    ser @_p3_1 = 2
    call p3(@_p3_0,@_p3_1)
    select @_p3_0,@_p3_1
    有参存储过程--out和input
    delimiter //
    
    create procedure p2(
           in n1 int,
           inout n3 int,
            out n2 int,
     )
    
    begin
           declare temp1 int ;
           declare temp2 int default 0;
    
           select * from v1;
           set n2 = n1 + 100;
           set n3 = n3 + n1 + 100;
    end //
    delimiter ;
    结果集和out返回值
    delimiter //
    create procedure p3()
    begin 
            declare ssid int; -- 自定义变量1  
            declare ssname varchar(50); -- 自定义变量2  
            DECLARE done INT DEFAULT FALSE;
    
    
            DECLARE my_cursor CURSOR FOR select sid,sname from student;
            DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
            
            open my_cursor;
                    xxoo: LOOP
                            fetch my_cursor into ssid,ssname;
                            if done then 
                                    leave xxoo;
                            END IF;
                            insert into teacher(tname) values(ssname);
                    end loop xxoo;
            close my_cursor;
    end  //
    delimter ;
    游标
    delimiter \
    CREATE PROCEDURE p4 (
           in nid int
    )
    BEGIN
              PREPARE prod FROM 'select * from student where sid > ?';
              EXECUTE prod USING @nid;
    
    END\
    delimiter ;
    
    
    -- 调用 
    
    call p4(12)
    动态执行SQL
    -- 事务用于将某些操作的多个SQL作为原子性操作,一旦有某一个出现错误,即可回滚到原来的状态,从而保证数据库数据完整性。
    
    
    
    delimiter \
    create PROCEDURE p5(
        OUT p_return_code tinyint
    )
    BEGIN 
        DECLARE exit handler for sqlexception -- 声明如果出现异常执行下面的代码块
        BEGIN 
            -- ERROR 
            set p_return_code = 1; -- 返回1 代表出异常了
            rollback; -- 回滚 ,回滚到原始状态
         END; 
                 
        START TRANSACTION;  -- 没出现异常,开始事务
              DELETE from userinfo;
              insert into userinfo(username)values('seven');
         COMMIT;  -- 提交事务
                 
        -- SUCCESS 
         set p_return_code = 2; -- 返回2 ,代表执行成功 
                 
    END\
    delimiter ;
    事务
    import pymysql
    
    conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123', db='db1')
    cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
    # 执行存储过程
    cursor.callproc('p1', args=(1, 22, 3, 4))
    # 获取执行完存储的参数
    cursor.execute("select @_p1_0,@_p1_1,@_p1_2,@_p1_3")
    result = cursor.fetchall()
    
    conn.commit()
    cursor.close()
    conn.close()
    
    
    print(result)
    pymysql执行存储过程

    2,删除存储过程:

    -- 格式:drop procedure 存储过程名;
    
    
    drop procedure p5;
    View Code

    3,执行存储过程:

    -- 无参数
    
    call p5()
    
    
    -- 有参数 in
    
    call p5(12,12)
    
    
    -- 有参数 in out inout
    
    set @t1=12;
    set @t2=12;
    
    call p5(12,12,@t1,@t2)
    View Code

       函数                                                                             

    MySql中提供了许多的内置函数

    CHAR_LENGTH(str)
        返回值为字符串str 的长度,长度的单位为字符。一个多字节字符算作一个单字符。
        对于一个包含五个二字节字符集, LENGTH()返回值为 10, 而CHAR_LENGTH()的返回值为5。
    
    CONCAT(str1,str2,...)
        字符串拼接
        如有任何一个参数为NULL ,则返回值为 NULL。
    CONCAT_WS(separator,str1,str2,...)
        字符串拼接(自定义连接符)
        CONCAT_WS()不会忽略任何空字符串。 (然而会忽略所有的 NULL)。
    
    CONV(N,from_base,to_base)
        进制转换
        例如:
                SELECT CONV('a',16,2); 表示将 a 由16进制转换为2进制字符串表示
    
    FORMAT(X,D)
        将数字X 的格式写为'#,###,###.##',以四舍五入的方式保留小数点后 D 位, 并将结果以字符串的形式返回。若  D 为 0, 则返回结果不带有小数点,或不含小数部分。
        例如:
                SELECT FORMAT(12332.1,4); 结果为: '12,332.1000'
    INSERT(str,pos,len,newstr)
        在str的指定位置插入字符串
                pos:要替换位置其实位置
                len:替换的长度
                newstr:新字符串
        特别的:
                如果pos超过原字符串长度,则返回原字符串
                如果len超过原字符串长度,则由新字符串完全替换
    INSTR(str,substr)
        返回字符串 str 中子字符串的第一个出现位置。
    
    LEFT(str,len)
        返回字符串str 从开始的len位置的子序列字符。
    
    LOWER(str)
        变小写
    
    UPPER(str)
        变大写
    
    LTRIM(str)
        返回字符串 str ,其引导空格字符被删除。
    RTRIM(str)
        返回字符串 str ,结尾空格字符被删去。
    SUBSTRING(str,pos,len)
        获取字符串子序列
    
    LOCATE(substr,str,pos)
        获取子序列索引位置
    
    REPEAT(str,count)
        返回一个由重复的字符串str 组成的字符串,字符串str的数目等于count 。
        若 count <= 0,则返回一个空字符串。
        若str 或 countNULL,则返回 NULLREPLACE(str,from_str,to_str)
        返回字符串str 以及所有被字符串to_str替代的字符串from_str 。
    REVERSE(str)
        返回字符串 str ,顺序和字符顺序相反。
    RIGHT(str,len)
        从字符串str 开始,返回从后边开始len个字符组成的子序列
    
    SPACE(N)
        返回一个由N空格组成的字符串。
    
    SUBSTRING(str,pos) , SUBSTRING(str FROM pos) SUBSTRING(str,pos,len) , SUBSTRING(str FROM pos FOR len)
        不带有len 参数的格式从字符串str返回一个子字符串,起始于位置 pos。带有len参数的格式从字符串str返回一个长度同len字符相同的子字符串,起始于位置 pos。 使用 FROM的格式为标准 SQL 语法。也可能对pos使用一个负值。假若这样,则子字符串的位置起始于字符串结尾的pos 字符,而不是字符串的开头位置。在以下格式的函数中可以对pos 使用一个负值。
    
        mysql> SELECT SUBSTRING('Quadratically',5);
                -> 'ratically'
    
        mysql> SELECT SUBSTRING('foobarbar' FROM 4);
                -> 'barbar'
    
        mysql> SELECT SUBSTRING('Quadratically',5,6);
                -> 'ratica'
    
        mysql> SELECT SUBSTRING('Sakila', -3);
                -> 'ila'
    
        mysql> SELECT SUBSTRING('Sakila', -5, 3);
                -> 'aki'
    
        mysql> SELECT SUBSTRING('Sakila' FROM -4 FOR 2);
                -> 'ki'
    
    TRIM([{BOTH | LEADING | TRAILING} [remstr] FROM] str) TRIM(remstr FROM] str)
        返回字符串 str , 其中所有remstr 前缀和/或后缀都已被删除。若分类符BOTH、LEADIN或TRAILING中没有一个是给定的,则假设为BOTH 。 remstr 为可选项,在未指定情况下,可删除空格。
    
        mysql> SELECT TRIM('  bar   ');
                        -> 'bar'
    
        mysql> SELECT TRIM(LEADING 'x' FROM 'xxxbarxxx');
                        -> 'barxxx'
    
        mysql> SELECT TRIM(BOTH 'x' FROM 'xxxbarxxx');
                        -> 'bar'
    
        mysql> SELECT TRIM(TRAILING 'xyz' FROM 'barxxyz');
                        -> 'barx'
    部分内置函数

    1,自定义函数

    -- 创建自定义函数
    
    delimiter \
    create function f1(
        i1 int,
        i2 int)
    returns int
    BEGIN
        declare num int;
        set num = i1 + i2;
        return(num);
    END \
    delimiter ;
    View Code

    2,执行函数

    --  获取返回值
    declare @i VARCHAR(32);
    select UPPER('alex') into @i;
    SELECT @i;
    
    
    -- 在查询中使用
    select f1(11,nid) ,name from userinfo;
    View Code

    3,删除函数

    -- 格式:drop function 函数名;
    
    drop function f1;
    View Code

       索引                                                                            

    索引,是数据库中专门用于帮助用户快速查询数据的一种数据结构。类似于字典中的目录,查找字典内容时可以根据目录查找到数据的存放位置,然后直接获取即可。

    MySql常见的索引有:

    • 普通索引
    • 唯一索引
    • 主键索引
    • 组合索引

    1,普通索引:

    普通索引只有一个功能:加速查询

    create table user(
        nid int not null auto_increment primary key,
        name varchar(32) not null,
        email varchar(64) not null,
        extra text,
        index ix_name (name)
    创建表+普通索引
    -- 格式:create index 索引名 on 表名(列名);
    
    -- 索引名不能是关键字
    
    create index in on user(name); -- 错误,索引名跟SQL关键字in冲突
    
    
    -- 正确
    
    create index in_name on user(name);
    创建普通索引
    -- 格式:drop index 索引名 on 表名;
    
    
    drop index in_name on user;
    删除普通索引
    -- 格式:show index from 表名;
    
    show index from user;
    查看索引

    注意:对于创建索引时如果是BLOB 和 TEXT 类型,必须指定length。

    create index in on user(extra(32));
    View Code

    2,唯一索引:

    唯一索引有两个功能:加速查找,唯一约束

    create table user(
        nid int not null auto_increment primary key,
        name varchar(32) not null,
        email varchar(64) not null,
        unique in (name)
    )
    创建表+唯一索引
    -- 格式:create unique index 索引名 on 表名(列名);
    
    create unique index in_name on user(name);
    创建唯一索引
    -- 格式:drop index 索引名 on 表名;
    
    drop index in_name on user;
    删除唯一索引
  • 相关阅读:
    .NET Core/.NET5/.NET6 开源项目汇总7:电商项目
    .NET Core/.NET5/.NET6 开源项目汇总6:框架与架构设计(DDD、云原生/微服务/容器/DevOps/CICD等)项目
    .NET Core/.NET5/.NET6 开源项目汇总5:(权限)管理系统项目
    .NET Core/.NET5/.NET6 开源项目汇总4:CMS、Blog项目
    .NET Core/.NET5/.NET6 开源项目汇总3:工作流组件
    .NET Core/.NET5/.NET6 开源项目汇总2:任务调度组件
    .NET Core/.NET5/.NET6 开源项目汇总1:常用必备组件
    .NET平台系列31:.NET团队送给.NET开发人员的云原生学习资源汇总
    .NET平台系列30:.NET Core/.NET 学习资源汇总
    .NET平台系列29:.NET Core 跨平台奥秘
  • 原文地址:https://www.cnblogs.com/gaoyuan111/p/6947508.html
Copyright © 2011-2022 走看看