• MySQL学习入门总结(非常重要)


    MySQL数据库学习总结

    ——1、数据库概述
    1、MySQL数据库属于一种开源的关系型数据库,属于Oracle公司;
    2、MySQL数据库的登录与退出
    (1)MySQL可以在命令行工具shell的方式登录(MySQL自带命令行工具和cmd(mysql -h 127.0.0.1 -u root -p 然后输入密码)均可登录)
    (2)MySQL的退出:exit;quit;q;三种推出的方式
    3、MySQL修改提示符:MySQL默认的提示符为mysql>,可以通过prompt 所修改提示符来进行修改
    4、MySQL数据库语句语法:
    (1)关键字和函数大写;
    (2)其他一般小写;
    (3)语句以分号结尾
    5、常见的数据库语句:
    (1)创建数据库:create database test;(全语句:CREATE DATABASE IF NOT EXISTS t2 CHARACTER SET gbk;)
    (2)查看当前的数据库:show databases;
    (3)修改数据库:ALTER DATABASE T2 CHARACTER SET utf8;(数据库修改编码方式)
    (4)删除数据库:DROP DATABASE IF EXISTS T1;
    (5)超级用户:root;默认的端口号:3306

    ——2、数据库的数据类型和数据表操作
    1、MySQL的数据类型主要有:整型int、浮点型float、字符串型和时间日期型
    2、MySQL字符串类型的数据中ENUM("value1","value2"...)用来选择其中一个,而SET("value1","value2"...)用来选择其中数字的排列组合,更多,并非一个
    3、数据表的行称为记录,而列称之为字段
    4、USE是用来打开数据库的操作方法:USE DATABASE名称,之后可以使用SELECT DATABASE();来进行查看我们打开的数据库是否为我们需打开的数据库
    5、创建一个数据表,里面的细节列名称和数据类型(unsigned是指无符号位,从0开始):
    mysql> CREATE TABLE tb1(
    -> username varchar(20),
    -> age tinyint unsigned,
    -> salary float(8,2) unsigned
    -> );
    Query OK, 0 rows affected (0.04 sec)
    6、查看数据表格:show tables;(查看当前数据库里面包含的数据表);show tables from database-1;(查看database-1数据库里面包含的数据表)
    7、查看当前所处的数据库:select database();
    8、查看数据表的结构,即展示数据表格的列属性组成:show columns from tablename;
    9、数据表格记录的插入与查找:
    (1)插入:两种方式:全部插入与部分插入
    insert tb1 values("TOM","25","257863.25",...);
    insert tb1(username,salary) values("JONE","2304050.21")
    (2)查找:
    select * from tablename #展示整个表格的内容
    10、数据表字段特征的属性定义:NULL 字段值可以为空,NOT NULL 字符段禁止为空
    create table tb2(username varchar(20) not null,age tinyint null);
    11、为了防止记录的重复性,主键约束primary key和auto_increment自动编码方式,主键可以保证不可以出现重复的值,并且一个数据表只能拥有一个主键,属性为not null
    12、自动编号auto_increment必须和逐主键约束primary key一起使用,但是主键约束不一定和自动编号使用
    (1)CREATE TABLE tb3(id smallint unsigned auto_increment primary key,username varchar(20) not null);
    (2)CREATE TABLE tb4(id smallint unsigned primary key,username varchar(20) not null);
    13、唯一约束unique key :可以保证记录的唯一性,和主键约束类似,不过二者也有区别:
    (1)一个数据表可以包含多个唯一约束,但是只能拥有一个主键约束;
    (2)唯一约束可以为空null,主键约束不可以为空为not null;
    (3)二者创建索引的方式也不一样
    14、默认约束default:在写入记录时,如果没有明确的字段,系统赋值默认值
    create table tb6(
    -> id smallint unsigned auto_increment primary key,
    -> username varchar(20) not null unique key,
    -> sex ENUM("boy","girl","no") default "no");
    15、对于无符号数的字段,在属性规定时需要加上unsigned

    ——3、数据库的约束和相关操作(列操作)
    1、show create table province;可以用来展示新创建表格的引擎类型和基本信息内容
    2、外键约束主要是为了建立起来父表和子表之间的关系,必须为innoDB的存储引擎,主要有唯一约束,主键约束,外键约束,not null等
    3、另外对于父表和子表之间的参照列必须具有相似的属性(数字则相同,字符串则相似),具有外键约束的是字表,参照的父表
    4、外键列和参照列必须创建索引,如果不创建,MySQL将要自动创建
    5、显示数据表的索引语句:show indexes from tablenameG(表格形式展示)
    6、外键约束的参照操作:CASCADE、SET NULL、RESTRIC、NO ACTION等
    create table users1(
    -> id smallint unsigned primary key auto_increment,
    -> username varchar(10) not null,
    -> pid smallint unsigned,
    -> foreign key(pid) references province(id) on delete cascade);
    7、外键约束在操作数目的多少角度上可以划分为列级约束(1个列)和表级约束(多个列)
    8、not null 和default约束不存在表级约束,唯一,主键和外键约束既有表及约束,也有列级约束
    9、数据表添加列操作语句
    alter table users1 add age tinyint unsigned not null default 10;(默认往最后添加)
    alter table users1 add password varchar(30) not null after username;(after在某一列之后添加)
    alter table users1 add truename varchar(10) not null first;(first在数据表第一列添加)
    10、添加多列不能指定添加的位置,只可以添加子最后面
    11、数据表删除列语句:
    alter table users1 drop truename;(单列删除)
    alter table users1 drop id,drop age;(多列删除)
    12、添加约束:
    alter table users2 add constraint pk_users2_id primary key (id);添加主键约束
    alter table users2 add unique(username);添加唯一约束
    alter table users2 add foreign key(pid) references province(id);添加外键约束
    alter table users2 alter age set default 15;添加默认约束
    alter table users2 alter age drop default;删除默认约束
    13、删除约束:
    alter table users2 drop primary key;删除主键约束
    alter table users2 drop index username;删除唯一约束
    alter table users2 drop foreign key users2_ibfk_1;删除外键约束使用约束名称即可
    alter table users2 drop index pid;删除外键约束需要注意还要删除索引
    14、修改列定义(change和modify均可,change更加全面)
    (1)修改列的位置前后-modify
    alter table users2 modify id smallint unsigned not null first;把某一列放在前面
    alter table users2 modify id smallint unsigned not null after username;把某一列放在username列之后
    (2)修改列的属性定义,数据类型等-modify
    alter table users2 modify id tinyint unsigned not null first;修改列属性定义,数据类型等,从大类型到小类型注意一定要防止数据丢失
    (3)修改列名称-change
    alter table users2 change pid p_id tinyint unsigned not null;
    15.修改数据表的名称:
    (1)alter table users2 rename users3;
    (2)rename table users3 to users2;

    ——4、数据表的记录操作(行操作)
    1、insert插入操作
    (1)第一种方法 insert values方法
    insert user values(NULL,"john","456",45,"0");插入时,需要注意对于默认的字段或者自动编码的字段可以输入null或者default均可
    insert user values(default,"mary","4yjy6",15,1);
    insert user values(default,"my","4y6",default,1);对于默认值的字段,可以直接输入default设置为默认值
    insert user values(default,"my","4y6",default,1),(null,"yanjd",md5("123"),default,1);插入多个纪录语句,md5是指输出某一个字段的哈希
    insert tb1(username,salary) values("JONE","2304050.21");部分值插入
    (2)第二种方式 insert set 方法
    insert user set username="ben",passward="456",age=12,sex=1;
    (3)第三种方法 insert select语句
    通过查询的结果写入数据表
    2、updata数据表的更新-单表操作
    update user set age=age+5;直接更新某一列的值
    update user set age=age-id,sex=0;直接更新多列的值
    update user set age=age+10 where id%2=0;条件更新语句
    3、delete删除操作-单表操作
    delete from user where id=6;删除id=6这个记录,即整行删除
    4、查询表达式select语句
    select id,username from user;查找数据表中的某几列数据
    select * from user;查找所有的列数据
    select user.id,user.username from user;区别多个数据表中相同的字段列数据
    select id as userid,username as uname from user;可以修改输出字段名称
    5、where语句进行条件的判断
    delete from user where password="22";
    6、groupby函数主要对查询结果进行分组(默认进行升序)
    select sex from user group by sex(列名);
    select age from user group by age desc;(降序排列)
    7、having语句哟关于条件的指定
    select sex from user group by sex having count(id)>2;聚合函数不需要在前面select
    select sex,age from user group by age having age>30;普通情况需要在前面指定查找
    8、order by函数用于对于查询结果进行排序操作(asc/desc升降序,默认asc升序)
    select * from user order by id;默认按照id升序排列
    select * from user order by id desc;按照id降序排列
    select * from user order by age,id desc;按照age升排列age相同时按照id降序排列
    9、limit语句限制返回结果(抽取某一些行操作)
    select * from user limit 2; 取前两行数据
    select * from user limit 2,2 取第三行开始的后两行数据
    select * from user order by id desc limit 2,2; 按照id降序排列之后进行取第三行之后的2行数据
    10、字表插入语句insert select语句
    insert test(username) select username from user where age>=10;
    在test表格的username中插入从user表中查到的age>=10的记录的username


    ——5、MySQL子查询与连接
    1、set names gbk: 设置客户端的显示形式为gbk(如果之前设置是utf-8编码则显示出来文字不能识别)
    2、子查询指嵌套在查询内部,必须在圆括号里使用,返回值是一个标量、一行也开始是一个数据表
    3、子查询是指在另一个查询里面的select子句
    4、在进行数据表的写入时,默认是不允许写入汉字的,因此需要修改一下编码格式:
    show full columns from phplamp; 检查数据表所有字段的状态
    alter table phplamp change address address varchar(100) character set utf8 collate utf8_unicode_ci not null; 修改为utf8编码格式
    set names gbk;将客户端修改为gbk来显示数据字段
    5、子查询语句:
    select avg(goods_price)from tdb_goods;求取某一列的平均值
    select round(avg(goods_price),2) from tdb_goods;求取某一列的平均值,保留两位小数
    select goods_id,goods_name,goods_price from tdb_goods where goods_price>=5636.36;查找价格大于平均值的商品的id,name和price
    select goods_id,goods_name,goods_price from tdb_goods where goods_price>=(select round(avg(goods_price),2) from tdb_goods);子查询方式
    select goods_price from tdb_goods where goods_cate="超级本"; 选择输出超极本笔记本的价格
    select * from tdb_goods where goods_cate="超级本"G;列显示超极本笔记本的基本信息
    6、一些子查询关键字any/some/all/not in/in/
    select goods_id,goods_name,goods_price from tdb_goods where goods_price>=any(select goods_price from tdb_goods where goods_cate="超级本");如果子查询返回并非一列多个值时需要添加any,all,some
    select goods_id,goods_name,goods_price from tdb_goods where goods_price=any/some(select goods_price from tdb_goods where goods_cate="超级本");大于等于,小于等于可以使用any和all,但是等于只可以用some/any
    select goods_id,goods_name,goods_price from tdb_goods where goods_price not in(select goods_price from tdb_goods where goods_cate="超级本")G;not in和!=all是等效的
    select goods_cate from tdb_goods group by goods_cate;使用group by函数进行结果的分类统计
    insert tdb_goods_cate(cate_name) select goods_cate from tdb_goods group by goods_cate; insert-select语句查询
    7、多表更新函数
    多步更新:
    update tdb_goods inner join tdb_goods_cate on goods_cate=cate_name set goods_cate =cate_id; 内连接更新方式,多步更新—创键表-通过insert-select写入记录-表的更新
    一步更新方式:crested select函数:
    create table tdb_goods_band(
    -> band_id smallint unsigned primary key auto_increment,
    -> brand_name varchar(50)character set utf8 collate utf8_unicode_ci not null) 编码方式为utf8汉字可输入型
    -> select brand_name from tdb_goods group by brand_name;
    更新结束之后我们需要将数据列的名称和属性一起修改:
    alter table tdb_goods
    -> change goods_cate cate_id smallint unsigned not null,
    -> change brand_name brand_id smallint unsigned not null;
    将字符型修改为数字型,缩小占用空间
    8、多表连接
    内连接:只显示两个表符合连接条件的记录
    select goods_id,goods_name,cate_name from tdb_goods inner join tdb_goods_cate on tdb_goods.cate_id=tdb_goods_cate.cate_id;
    左外连接:显示左边全部记录以及右边符合条件的记录
    select goods_id,goods_name,cate_name from tdb_goods left join tdb_goods_cate on tdb_goods.cate_id=tdb_goods_cate.cate_id;
    右外连接:连接右表的全部记录以及左表符合条件的记录
    select goods_id,goods_name,cate_name from tdb_goods right join tdb_goods_cate on tdb_goods.cate_id=tdb_goods_cate.cate_id;
    多个表之间的连接(和两个表连接是相似的)
    select goods_id,goods_name,cate_name,brand_name,goods_price from tdb_goods as g inner join tdb_goods_cate as c on g.cate_id=c.cate_id inner join tdb_goods_band as b on g.brand_id=b.band_id;
    9、无线级分类表的设计(子结构连接)
    CREATE TABLE tdb_goods_types(
    type_id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    type_name VARCHAR(20) character set utf8 collate utf8_unicode_ci not null,
    parent_id SMALLINT UNSIGNED NOT NULL DEFAULT 0
    );
    自身连接方式-相互嵌套
    select s.type_id,s.type_name,count(p.type_name) from tdb_goods_types as s left join tdb_goods_types as p on s.parent_id=p.type_id;左表为子表
    select p.type_id,p.type_name,count(s.type_name) from tdb_goods_types as p left join tdb_goods_types as s on s.parent_id=p.type_id group by p.type_name order by p.type_id;右表为父表
    10、多表删除
    (1)记录重复合并操作:
    select goods_id,goods_name from tdb_goods group by goods_name; 以goods_name作为重复合并的字段
    (2)多表删除-对照删除
    delete t1 from tdb_goods as t1 left join (select goods_id,goods_name from tdb_goods group by goods_name having count(goods_name)>=2) as t2 on t1.goods_name=t2.goods_name where t1.goods_id>t2.goods_id;


    ——6、数据库运算符和函数
    1、字符函数:
    (1)concat:字符连接
    select concat("mysql","imooc");
    +-------------------------+
    | concat("mysql","imooc") |
    +-------------------------+
    | mysqlimooc |
    +-------------------------+
    (2)concat_ws()函数
    select concat_ws("|","mysql","imooc");
    +--------------------------------+
    | concat_ws("|","mysql","imooc") |
    +--------------------------------+
    | mysql|imooc |
    +--------------------------------+
    (3)format函数:数字格式化函数
    select format(1256.452,2);
    +--------------------+
    | format(1256.452,2) |
    +--------------------+
    | 1,256.45 |
    +--------------------+
    (4)lower(字母)函数:字母小写化;upper(字母):字母大写
    (5)left("mysql",2)和right()函数:获取左侧2位字符和和右侧字符
    (6)length()函数:获取字符串的长度
    (7)select ltrim/rtrim/trim(" mysql "):删除字符串前面/右面/前后都删的空格
    +--------------------+
    | ltrim(" mysql ") |
    +--------------------+
    | mysql |
    +--------------------+
    (8)trim()函数其他功能:
    select trim(leading "?" from "??mysql??");删除前面的问号)
    select trim(trailing "?" from "??mysql??");删除后面的问号
    select trim(both "?" from "??mysql??");删除前后的所有的问号
    +-------------------------------------+
    | trim(trailing "?" from "??mysql??") |
    +-------------------------------------+
    | ??mysql |
    +-------------------------------------+
    (9)select replace("??mys??ql??","?","");替换函数
    +-------------------------------+
    | replace("??mys??ql??","?","") |
    +-------------------------------+
    | mysql |
    +-------------------------------+
    (10)select substring("mysql",2,1);字符截取函数:从第2位截取,截取1位
    +------------------------+
    | substring("mysql",2,1) |
    +------------------------+
    | y |
    +------------------------+
    (11)not like/like 函数:模式匹配函数:%代表任意一个字符,_代表任意一个字符
    如果要匹配一个字符中是否含有某一个字母可用:
    select * from test where first_name like "%o%":找到含有o字母的记录
    如果是找含有%时需要注意,比较特殊:
    select * from test where first_name like "%1%%" escape "1";
    2、数值运算符函数
    (1)+-x/等四则运算函数
    (2)ceil(23.2):进1取整
    (3)floor(23.2):舍一取整
    (4)3 div 4:整数除法
    (5)5 mod 3取余数
    (6) select power(2,10)幂运算
    (7)round(3.25)四舍五入函数
    (8)select truncate(125.89,2);数字截取函数,截取到小数点后2位
    3、比较运算符和函数
    (1) select 15 between 1 and 20;数字15在1和20之间吗?
    (2) select 10 in(5,10,15,20);查看10是否在这个括号里面
    (3) select 0 is null;查看0是否为空
    4、日期时间函数:
    (1)select now();展示当前时间
    (2)select curdate 展示当前日期
    (3)select curtime 展示当前时间
    (4)select dataadd 展示时间的增加和减少
    select date_add("2014-3-12",interval 365 day);在2014年3月12日增加365天
    select date_add("2014-3-12",interval 5 month)在2014年3月12日增加5个月
    (5)select datediff("2013-3-12","2017-2-23");查询两个日期相差几天()
    (6)select date_format("2014-3-12","%m/%d/%Y");进行日期格式的转换
    +-------------------------------------+
    | date_format("2014-3-12","%m/%d/%Y") |
    +-------------------------------------+
    | 03/12/2014 |
    +-------------------------------------+
    5、信息函数:
    (1)select connection_id();返回连接ID
    (2)select database();返回当前数据库;
    (3)select user();返回当前用户
    +----------------+
    | user() |
    +----------------+
    | root@localhost |
    +----------------+
    (4) select version();返回当前的版本
    +------------+
    | version() |
    +------------+
    | 5.6.47-log |
    +------------+
    (5)select last_insert_id()返回最后写入的记录号,多条写入时只输出第一个写入记录时的id
    6、聚合函数
    (1)select AVG(id)from test 求其id平均值
    (2)select count(id)form test 求取id的数目
    (3)max()最大值
    (4)min()最小值
    (5)sum()求和函数
    7、加密函数
    MD5:加密函数-为web页面做准备
    select md5("admin");
    +----------------------------------+
    | md5("admin") |
    +----------------------------------+
    | 21232f297a57a5a743894a0e4a801fc3 |
    +----------------------------------+
    password:密码计算函数:修改密码set password=password("yjy2020")
    select password("admin");
    +-------------------------------------------+
    | password("admin") |
    +-------------------------------------------+
    | *4ACFE3202A5FF5CF467898FC58AAB1D615029441 |
    +-------------------------------------------+

    ——7、自定义函数
    1、自定义函数不一定含有参数,但是一定含有返回值
    2、MySQL函数的参数不能超过1024个参数
    3、调整时间格式:select date_format(now(),"%Y年%m月%d日 %H点%i分%s秒");
    +-------------------------------------------------+
    | date_format(now(),"%Y年%m月%d日 %H点%i分%s秒") |
    +-------------------------------------------------+
    | 2020年04月03日 11点31分54秒 |
    +-------------------------------------------------+
    4、创建时间格式转换函数,不含有参数:
    create function f1() returns varchar(30) character set utf8 collate utf8_unicode_ci
    -> return date_format(now(),"%Y年%m月%d日 %H点%i分%s秒");
    调用这个函数:
    select f2();
    +------------------------------+
    | f2() |
    +------------------------------+
    | 2020年04月03日 11点36分39秒 |
    +------------------------------+
    5、创建带有参数的自定义函数
    create function f3(num1 smallint unsigned,num2 smallint unsigned)
    -> returns float(10,2) unsigned
    -> return (num1+num2)/2;
    调用这个函数
    select f3(21,21)
    6、创建具有复合结构函数体的自定义函数
    结尾标志修改:delimiter//将结尾标志符号改为//
    创建复合型带参数的自定义函数
    delimiter//
    create function adduser(username varchar(20))
    -> returns int unsigned
    -> begin
    -> insert test(username)values (username);
    -> return last_insert_id();
    -> end
    -> //

    ——8、MySQL存储过程
    1、MySQL执行语句过程:SQL语句—>MySQL引擎—>语法分析—>编译为可识别命令—>执行命令—>输出返回值—>客户端
    2、存储过程是一种预编译,将结果存储在内存中,只有在第一次时会分析和执行,在之后直接调用相应的结果即可,效率更快,并且可以返回多个值
    3、存储过程的优点:
    (1)增强了SQL语句的功能和灵活性
    (2)实现较快的执行速度
    (3)减少网络流量
    4、创建不带参数的存储过程:
    create procedure sp1() select version();
    call sp1;调用存储过程(不带参数)
    call sp1();调用存储过程(不带参数)
    +------------+
    | version() |
    +------------+
    | 5.6.47-log |
    +------------+
    5、创建带有in类型参数的存储过程,不没有返回过程:
    create procedure removeuserbyid(in id int unsigned)
    -> begin
    -> delete from user where id=id;注意id传入参数和表中字段不能相同,不然将删除所有记录,而非本来id记录
    -> end
    -> //
    以上方式不正确,下面是正确方式
    delimiter //
    create procedure remove(in id1 int unsigned)
    -> begin
    -> delete from test1 where id=id1;
    -> end
    -> //
    call remove(2) 删除id为2的记录
    6、创建带有in和out的存储过程,带返回变量,其中返回变量可以使用用@num可以表示
    delimiter //
    create procedure remove1(in pid int unsigned,out usernum int unsigned)
    -> begin
    -> delete from test1 where id =pid;
    -> select count(id) from test1 into usernum;
    -> end
    -> //
    删除id记录之后,返回剩余数据表记录总数
    call remove1(2,@nums)//
    select @nums
    7、begin end 之间的变量属于局部变量,而set @i=7称之为用户变量
    8、select row_count();是指输出影响的记录数
    9、创建多个out参数的存储过程
    delimi//
    create procedure remove2(in age1 smallint unsigned ,out deletenum smallint unsigned ,out usercounts smallint unsigned)
    -> begin
    -> delete from test1 where age=age1;
    -> select row_count() into deletenum;
    -> select count(id) from test1 into usercounts;
    -> end
    -> //
    call remove2(22,@i,@j)// 调用存储过程
    select @i,@j// 输出多个out返回值
    10、存储过程和自定义函数的区别
    (1)存储过程功能更加复杂一些,而函数针对性更强
    (2)存储过程可以返回多个值,而函数只可以有一个返回值
    (3)存储过程一般独立来执行,而函数可以作为其他SQL语句组成部分来出现
    11、存储过程修改不了过程体,如要修改,则先删除再重新创建

    ——9、存储引擎简介
    1、查看一个数据表的存储引擎一般使用show create table test来进行查看,里面显示出来ENGINE=InnoDB,表明其存储引擎是InnoDB
    2、MySQL将数据以不同的技术将数据存储在文件或者内存中,这种技术称之为存储引擎
    3、MySQL支持的存储引擎主要有以下五种:MyISAM/InnoDB/Memory/CSV/Archive
    4、处理方式1:并发控制处理:共享锁(读操作)和排他锁(写操作)
    5、锁颗粒:表锁(开销最小锁策略)和行锁(开销最大锁策略)
    6、处理方式2:事务:事务用于保证数据库的完整性
    事务的特性:原子性、一致性、隔离性和持久性
    7、索引和外键均可保证数据的相关性、一致性和特性性
    8、不同存储引擎的特点是不一样的
    9、InnoDB存储引擎存储限制为64TB,支持事务安全和索引,支持行锁和外键,不支持数据压缩
    10、CSV不支持索引,是一种文本形式的存储方式,黑洞引擎一般写入的数据会消逝,一般用于数据复制过程中的中继
    11、一般使用最多的是InnoDB(适用于事务处理较多和使用外键的情况)和MyISAM引擎(适用于事务处理不多的情况)
    12、设置存储引擎的方法:
    (1) 创建数据表的时候设置引擎方式:
    create table t1(
    -> sa varchar(20))
    -> ENGINE=MyISAM;
    (2)在MySQ配置文件里面修改
    (3)修改存储引擎方法:
    alter table t1 engine=innodb;

    ——10、MySQL图形化管理方式
    1、MySQL的图像化管理方式主要有以下几种:MySQL workbench CE、Navicat以及PHPMyadmin
    2、最常见的最常用的还是Navicat for MySQL的图形管理方式

  • 相关阅读:
    NYOJ41三个数从小到大排序
    HDUOJ2115I Love This Game
    NYOJ56阶乘因式分解(一)
    NYOJ65另一种阶乘问题
    HDUOJ1234开门人和关门人
    NYOJ74小学生算术
    NYOJ11奇偶数分离
    HDUOJ3980取模运算
    HDUOJ2014 青年歌手大奖赛_评委会打分
    HDUOJ1860 统计字符
  • 原文地址:https://www.cnblogs.com/Yanjy-OnlyOne/p/12635901.html
Copyright © 2020-2023  润新知