sql全称Structured query Language 结构查询语言sql是用于访问和处理数据库的标准的计算机语言sql对大小写不敏感DML数据 *** 作语言 Data Manipulation Language DML语句执行完成时,不会被自动提交,可以回滚DDL数据定义语言 Data DeFinition Language DDL语句执行完成时,会被自动提交,不能回滚DCL数据控制语言 Date Control Language DCL用来设置用户或者角色权限sqlServer数据类型
整型 bigint 从 -2^63 到 2^63-1 的整型数据 int 从 -2^31 到 2^31-1 的整型数据 smallint 从 -2^15 到 2^15-1 的整数数据 tinyint 从 0 到 255 的整数数据 bit 1 或 0 的整数数据浮点型 decimal 从 -10^38+1 到 10^38–1 的固定精度和小数位的数字数据 numeric 功能上等同于decimal货币 money 货币数据值介于 -2^63 到 2^63-1,精确到货币单位的千分之十 smallmoney 货币数据值介于 -214,748.3648 到 +214,748.3647,精确到货币单位的千分之十日期 datetime 从 1753 年 1 月 1 日到 9999 年 12 月 31 日的日期和时间数据 smalldatetime 从 1900 年 1 月 1 日到 2079 年 6 月 6 日的日期和时间数据,精确到分钟字符串 char 固定长度的非 Unicode 字符数据,最大长度为 8,000 个字符 varchar 可变长度的非 Unicode 数据,最长为 8,000 个字符 text 可变长度的非 Unicode 数据,最大长度为 2^31-1 个字符Unicode字符串 nchar 固定长度的 Unicode 数据,最大长度为 4,000 个字符 nvarchar 可变长度 Unicode 数据,其最大长度为 4,000 字符 ntext 可变长度 Unicode 数据,其最大长度为 2^30-1 个字符二进制字符串 binary 固定长度的二进制数据,其最大长度为 8,000 个字节 varbinary 可变长度的二进制数据,000 个字节 image 可变长度的二进制数据,其最大长度为 2^31-1 个字节其他的类型 cursor 游标的引用 table 一种特殊的数据类型,存储供以后处理的结果集 timestamp 数据库范围的唯一数字,每次更新行时也进行更新 uniqueIDentifIEr 全局唯一标识符GUID运行命令
打开查询分析器 isqlw,前提是环境变量path有sql的Bin路径打开和关闭MSsqlServer服务 启动默认实例 net start mssqlserver 启动命名实例 net start mssql$NewData 关闭默认实例 net stop mssqlserver 关闭命名实例 new stop mssql$NewData备份和还原数据库
备份库 backup database qnmis to disk='e:\qnmis20110101'还原库 restore database qnmis from disk='e:\qnmis20110101'标识符
@ 局部变量@@ 全局变量# 局部临时对象## 全局临时对象语法 distinct
取不重复的数据 select distinct Js_bh from d_xt_yhnewID()
随即取10条数据 select top 10 * from d_xt_yh order by newID()top
规定要返回的记录的数目返回前两条记录 select top 2 * from d_xt_yh select top 2 yh_bh,yh_mm from d_xt_yh返回前百分比记录 select top 50 percent * from d_xt_yh select top 50 percent yh_bh,yh_mm from d_xt_yhlike
用于在 WHERE子句中搜索列中的指定模式% 替代一个或多个字符 以"标段"结尾,"标段"前面有一个或者多个字符 select * from d_xt_yh where yh_mc like '%标段' 以"标段"开始,"标段"后面有一个或者多个字符 select * from d_xt_yh where yh_mc like 'B%'_ 仅替代一个字符 以"1标段"结尾,"1标段"前面有一个字符 select * from d_xt_yh where yh_mc like '_1标段' 以"A1标"开始,"A1标"后面有一个字符 select * from d_xt_yh where yh_mc like 'A1标_'[ ] 指定范围 [a-f]表示[abcdef]中的任何单个字符 以"1标段"结尾,"1标段"前面有一个字符,字符是abcdef任意一个 select * from d_xt_yh where yh_mc like '[a-f]1标段' 'abc[def]' 表示abcd,abce,abcf[^ ] 不属于指定范围的任何单个字符 以"1标段"结尾,字符不是bcdef任意一个 select * from d_xt_yh where yh_mc like '[^bcdef]1标段'运算符
andorinis nullbetween andnotnot inis not nullnot between andwaitfor
等待10秒钟再查询 waitfor delay '00:00:10' select * from d_dept等待到16时54分30秒再查询 waitfor time '16:54:30' select * from d_dept需要注意 delay 最多24小时time 必须是 datetime 类型,且不允许指定 datetime 值的日期部分排序
升序排列 select * from dbo.d_xt_yh order by yh_bh asc 降序排列 select * from dbo.d_xt_yh order by yh_bh desc 别名排序 select yh_bh as '用户编号' from dbo.d_xt_yh order by '用户编号' desc 列位置排序 select * from dbo.d_xt_yh order by 1 desc 多列排序 select * from dbo.d_xt_yh order by yh_bh desc,jg_bh asc连接
left join 左表为基础,左表全部显示出来,右表只显示符合条件的记录,右表记录不足均为nullright join 右表为基础,右表全部显示出来,左表只显示符合条件的记录,左表记录不足均为nullinner join 不以左右表为基础,只显示左右表匹配的full join 不以左右表为基础,只显示左右表匹配的union 合并两个或多个SELECT语句的结果集对表的 *** 作
创建表并带有自增列 create table d_emp( emp_ID int IDentity(1,1) primary key,emp_name varchar(50),emp_age int )删除表 delete from d_emp truncate table d_emp drop table d_emp 增加列 alter table d_emp add dept_ID int删除列 alter table d_emp drop column dept_ID 修改列的定义 alter table d_emp alter column emp_name varchar(100) 修改表列名 exec sp_rename 'd_emp.emp_name','name','column'修改表名 exec sp_rename 'd_emp','d_emp_tmp','object'创建临时表的几种方法
方法一 select * into #temp from d_emp方法二 insert into #temp select * from d_emp方法三 insert into #temp select 1,'李文超',2判断
declare @cph varchar(20)if @cph in ('',null,'null') begin set @cph='陕a88888' endelse begin set @cph='陕a12345' endselect @cphcase when
select emp_name,casewhen emp_age<18 then '未成年'when emp_age>=18 then '成年人'endas markfrom d_emp循环
declare @count intdeclare @index intset @index=1select @count=count(*) from d_xt_yhselect IDentity(int,1,1) as number,* into #temp from d_xt_yhwhile @index<=@count begin select * from #temp where number = @index set @index=@index+1 enddrop table #temp约束
对于基本表而言约束分为列约束:列约束是对某一列的约束,包含在列定义中,不必指定列的名称表约束:不包含在列定义中,通常用于多个列一起进行约束,必须指定列的名称主键约束
约束唯一标识数据库表中的每条记录增加1 create table d_emp( emp_ID int primary key not null,emp_age int,dept_ID int )增加2 create table d_emp( emp_ID int not null,dept_ID int,primary key (emp_ID) )增加3 create table d_emp( emp_ID int not null,constraint pk_d_emp primary key (emp_ID) )增加4 alter table d_emp add primary key (emp_ID)增加5 alter table d_emp add constraint pk_d_emp primary key (emp_ID)删除1 alter table d_emp drop constraint pk_d_emp如果不知道某个表的主键名称可以通过下面语句进行查找 select name from sysobjects where parent_obj=object_ID('d_emp') and xtype='pk'复合主键
增加1 create table d_emp( emp_ID int not null,emp_name varchar(50) primary key (emp_ID,emp_name) )增加2 create table d_emp( emp_ID int not null,emp_name varchar(50) constraint pk_d_emp primary key (emp_ID,emp_name) )增加3 alter table d_emp add constraint pk_d_emp primary key (emp_ID,emp_name)外键约束
foreign key约束 仅引用位于同一服务器上的同一数据库表,跨数据库的引用必须通过触发器来实现 可引用同一表的其他列,此行称为自引用 还可以定义为引用另一张表的unique约束列级foreign key约束 references子句只能列出一个引用列,引用列必须和定义约束列数据类型相同表级foreign key约束 references 子句可以列出多个引用列,引用列的个数,数据类型必须和定义约束列相同在临时表中不可以使用foreign key约束增加1 create table d_emp( emp_ID int not null,dept_ID int foreign key references d_dept(dept_ID) )增加2 create table d_emp( emp_ID int not null,foreign key (dept_ID) references d_dept(dept_ID) )增加3 create table d_emp( emp_ID int not null,constraint fk_d_emp foreign key (dept_ID) references d_dept(dept_ID) )增加4 alter table d_emp add foreign key (dept_ID) references d_dept(dept_ID)增加5 alter table d_emp add constraint fk_d_emp foreign key (dept_ID) references d_dept(dept_ID)删除1 alter table d_emp drop constraint fk_d_emp如果不知道某个表的外键名称可以通过下面语句进行查找 select name from sysobjects where parent_obj=object_ID('d_emp') and xtype='f'级联引用完整性约束
删除或者更新某一行,而该行被其他表外键所引用,则产生错误并回滚 alter table d_emp add foreign key (dept_ID) references d_dept(dept_ID) on delete no action on update no action删除或者更新某一行,则也将子表行删除 alter table d_emp add foreign key (dept_ID) references d_dept(dept_ID) on delete cascade on update cascade (2005特有)删除或者更新某一行,则子表行设置为空 alter table d_emp add foreign key (dept_ID) references d_dept(dept_ID) on delete set null on update set null(2005特有)删除或者更新某一行,则子表行设置为默认值 alter table d_emp add foreign key (dept_ID) references d_dept(dept_ID) on delete set default on update set default检查约束
约束用于限制列中的值的范围增加1 create table d_emp( emp_ID int not null,check (emp_age>18 and emp_age<60) )增加2 create table d_emp( emp_ID int not null,constraint chk_d_emp_emp_age check (emp_age>18 and emp_age<60) )增加3 create table d_emp( emp_ID int not null,dept_ID int constraint chk_d_emp_emp_age check (emp_age>18 and emp_age<60) )增加4 alter table d_emp add check (emp_age>18 and emp_age<60)增加5 alter table d_emp add constraint chk_d_emp_emp_age check (emp_age>18 and emp_age<60)删除1 alter table d_emp drop constraint chk_d_emp_emp_age 如果不知道某个表的检查约束名称可以通过下面语句进行查找 select name from sysobjects where parent_obj=object_ID('d_emp') and xtype='c'禁用检查约束 alter table d_emp nocheck constraint all默认约束
约束用于向列中插入默认值增加1 create table d_emp( emp_ID int not null primary key,emp_name varchar(50) default '李文超',dept_ID int )增加2 alter table d_emp add default('李文超') for emp_name增加3 alter table d_emp add constraint df_d_emp_emp_name default('李文超') for emp_name删除1 alter table d_emp drop constraint df_d_emp_emp_name 如果不知道某个表的默认约束名称可以通过下面语句进行查找 select name from sysobjects where parent_obj=object_ID('d_emp') and xtype='d'唯一约束
唯一标识数据库表中的每条记录主键约束和唯一约束的区别在于 一个表中可以定义多个唯一约束但只能定义一个主键约束 唯一约束允许一个null值,主键约束不允许增加1 create table d_emp( emp_ID int not null,emp_name varchar(50) unique,unique (emp_name) )增加3 create table d_emp( emp_ID int not null,constraint uq_d_emp_emp_name unique (emp_name) )增加2 alter table d_emp add unique (emp_name)增加3 alter table d_emp add constraint uq_d_emp_emp_name unique (emp_name)删除1 alter table d_emp drop constraint uq_d_emp_emp_name 如果不知道某个表的默认约束名称可以通过下面语句进行查找 select name from sysobjects where parent_obj=object_ID('d_emp') and xtype='uq'NOT NulL约束
指定该约束列不接受NulL值系统对象 系统表
sysobjects 在数据库每创建一个对象在表中占一行name sysname 对象名 ID int 对象标识号xtype char(2) 对象类型 C = CHECK 约束 D = 默认值或 DEFAulT 约束 F = FOREIGN KEY 约束 L = 日志 FN = 标量函数 IF = 内嵌表函数 P = 存储过程 PK = PRIMARY KEY 约束(类型是 K) RF = 复制筛选存储过程 S = 系统表 TF = 表函数 TR = 触发器 U = 用户表 UQ = UNIQUE 约束(类型是 K) V = 视图 X = 扩展存储过程uID smallint 所有者对象的用户IDparent_obj int 父对象的对象标识号(例如,对于触发器或约束,该标识号为表ID)crdate datetime 对象的创建日期系统存储过程
更新对象的名称 execute sp_rename 'd_dept','d_dept_new'查看可用的数据库 execute sp_helpdb查看对象定义内容 execute sp_helptext 'v_dept'强制在下次执行存储过程对其重新编译 execute sp_recompile 'p_dept'刷新视图 execute sp_refreshvIEw 'v_emp'查看视图的特征 execute sp_help 'v_emp'查看视图所依赖的对象 execute sp_depends 'v_emp'查看表中的索引 execute sp_helpindex 'd_dept'启动 itlwc数据库 直接递归触发器 execute sp_dboption 'itlwc','recursive_triggers',true系统函数
object_ID('') 返回对象的ID 得到d_emp表中主键约束 select name from sysobjects where parent_obj=object_ID('d_emp') and xtype='fk'对象 视图
视图不是真实存在的基础表而是一个虚拟表,视图所对应的数据并不实际以视图结构存储在数据库中,而是存储在视图所引用的表中视图的分类 标准视图: 索引视图: 分区视图:视图的作用 集中数据,定制数据,合并分隔数据,安全机制视图最多1024列创建视图 create vIEw v_emp as select * from d_emp 删除视图 drop vIEw v_emp 对视图的 *** 作 insert into v_dept values(1,'开发部') insert into v_dept values(2,'财务部') update v_dept set dept_name='人事部' where dept_ID=2 delete from v_dept where dept_ID=2存储过程
存储过程是存放在服务器端数据库中的子程序存储过程在第一次执行时,进行语法检测和编译,执行后他的执行计划就驻留在高速缓存中,用于后续调用存储过程的分类 系统存储过程:由系统提供,存放在MASTER数据库中,前缀为SP 用户存储过程:由用户创建系统存储过程主要包含 目录存储过程 复制类存储过程 安全管理类存储过程 分布式查询存储过程自定义的存储过程,应避免使用SP_为前缀.因为接收到SP_开头的存储过程,sql SERVER 首先会在 MASTER 数据库中寻找存储过程,这会影响执行效率存储过程最多可以有2100个参数,最大为128MB不带参数的存储过程 create proc p_dept as select * from d_dept带输入参数的存储过程 create proc p_dept @dept_ID int as select * from d_dept where dept_ID=@dept_ID带输入输出参数的存储过程 create proc p_dept @dept_ID int,@dept_name varchar(50) output as select @dept_name=dept_name from d_dept where dept_ID=@dept_ID存储过程中执行存储过程 create proc p_result @dept_ID int as declare @emp_name varchar(50) exec p_dept @dept_ID,@emp_name output select @emp_name函数
函数是由一个或者多个T-SQL语句组成的子程序,用于封装代码便于重新使用自定义函数只能返回单一值或者表函数不能对基表进行DML语句根据函数返回类型不同,将用户自定义的函数分为三种类型 标量函数:函数返回一个确定类型的标量值 内联表函数:以表的形式返回一个返回值 多语句表值函数:标量函数和内联表函数的结合体增加标量函数 create function fn_getDeptname(@dept_ID int) returns varchar(50) as begin declare @dept_name varchar(50) select @dept_name=dept_name from d_dept where dept_ID=@dept_ID return @dept_name end执行标量函数 select dbo.fn_getDeptname(1)删除标量函数 drop function fn_getDeptname增加内联表函数 create function if_d_dept(@dept_ID int) returns @temp table(ID int,name varchar(50)) as begin insert into @temp select dept_ID,dept_name from d_dept where dept_ID=@dept_ID return end执行内联表函数 select * from if_d_dept(1)删除内联表函数 drop function if_d_dept增加多语句表值函数 create function fnif_d_dept(@dept_name varchar(50)) returns @temp table(ID int,name varchar(50)) as begin --函数中使用临时表 declare @result table(ID int,name varchar(50)) insert into @result select dept_ID,dept_name from d_dept where dept_name=@dept_name insert into @temp select * from @result return end执行多语句表值函数 select * from fnif_d_dept('开发部')删除多语句表值函数 drop function fnif_d_dept触发器
触发器是一种与数据表紧密关联的特殊存储过程当数据表进行 insert delete update 事件发生时,所设置的触发器就会自动执行,保持数据库的完整性触发器在数据库以独立的对象存储(存储过程通过其他程序启动),触发器不能直接调用,只能通过事件来启动触发器不能传递或者接收参数触发器的类型 DML触发器:在数据库数据发生 *** 作语言(DML)事件时将调用 DML 触发器 after 触发器:在执行了 insert delete update 语句之后,after 触发器才会被激发 用于对变动数据进行检查,如果错误,将拒绝后者回滚 after 触发器只能在表上指定 每个触发 *** 作可以包含多个触发器 插入和删除表中的 text,ntext,image 列引用,不能使用 instead of 触发器:数据变动之前被激活,转而去执行触发器定义的 *** 作,并不再执行原来sql *** 作 instead of 触发器可以指定在视图和表上 每个触发 *** 作只能包含一个触发器 DDL触发器(2005):当服务器或者数据库发生数据定义语言(DDL)事件,将调用触发器 DLL触发器主要有,数据库作用域和服务器作用域 DLL触发器用来管理任务,例如审核和控制数据库 *** 作触发器的作用 DML触发器可以实现级联更改,保证数据的完整性触发器两个特殊虚表 inserted和deleted表,系统在内存中创建两张表,不存储在数据库中,两张表是只读的 这两表被触发的表结构相同,当触发完成之后两张表被删除 inserted 表存放增加的记录和存放更新后的记录 deleted 表存放被删除的记录和存放更新之前的记录测试特定列的 update *** 作 update 对某一个列的 update columns_update 对多个列的 update 返回一个布尔值嵌套触发器 当某一个触发器执行,能够触发另外一个触发器执行,这种情况称为嵌套触发器 如果一个触发器修改一张表,而这张表已经有了其他触发器,这时就使用了嵌套触发器 由于触发器在事务中执行,如果在一组嵌套触发器的任意层发生错误,则整个事务将被取消,回滚 触发器最多嵌套32级递归触发器 直接递归: 默认情况sql server是禁止 after 触发器的直接递归 如果需要开启,sp_dboption 'itlwc',true 间接递归触发器的激发顺序 execute sp_settriggerorder 'tigger_curd1','first','insert' execute sp_settriggerorder 'tigger_curd2','last','insert'创建 after 触发器 create table d_dept( dept_ID int,dept_name varchar(20) constraint pk_d_dept primary key (dept_ID) ) create table d_deptBackup( operate varchar(20),operateTime smalldatetime,dept_name varchar(20) ) --判断是否存在 if(object_ID('tigger_curd','tr') is not null) drop trigger tigger_curd go create trigger tigger_curd on d_dept after insert,delete,update as insert into d_deptBackup select '插入数据',getDate(),dept_ID,dept_name from inserted insert into d_deptBackup select '删除数据',dept_name from deleted创建 after delete 触发器 if(object_ID('tigger_curd','tr') is not null) drop trigger tigger_curd go create trigger tigger_curd on d_dept after delete as declare @rowcount int select @rowcount=@@rowcount --当前删除 *** 作影响的记录数 if @rowcount>1 begin rollback transaction --回滚取消 *** 作 raiserror('一次只能删除一条记录',16,1) --给出错误信息 end declare @dept_name varchar(20) set @dept_name = '开发部' if(@dept_name in (select dept_name from deleted)) begin rollback transaction --回滚取消 *** 作 raiserror('不能删除 开发部 ',1) --给出错误信息 end使用 update() if(object_ID('tigger_curd','tr') is not null) drop trigger tigger_curd go create trigger tigger_curd on d_dept after update as if(update(dept_ID) or update(dept_name)) begin rollback transaction --回滚取消 *** 作 raiserror('不允许更新该列信息',1) --给出错误信息 end创建 instead of 触发器 create table emp2005( emp_ID varchar(10),emp_name varchar(10) ) create table emp2006( emp_ID varchar(10),emp_name varchar(10) ) create table emp2007( emp_ID varchar(10),emp_name varchar(10) ) create vIEw v_emp as select * from emp2005 union all select * from emp2006 union all select * from emp2007 if(object_ID('tigger_curd','tr') is not null) drop trigger tigger_curd go create trigger tigger_curd on v_emp instead of insert as declare @emp_ID char(4) select @emp_ID = substring(emp_ID,4) from inserted if @emp_ID ='2005' begin insert into emp2005 select * from inserted end else if @emp_ID ='2006' begin insert into emp2006 select * from inserted end else if @emp_ID ='2007' begin insert into emp2007 select * from inserted end else begin rollback transaction --回滚取消 *** 作 raiserror('插入记录emp_ID不正确',1) --给出错误信息 end创建 递归触发器 insert into d_dept values(1001,'开发部') insert into d_dept values(1002,'开发部') insert into d_dept values(1003,'开发部') insert into d_dept values(1004,'开发部') insert into d_dept values(2001,'开发部') insert into d_dept values(2002,'开发部') insert into d_dept values(3001,'开发部') if(object_ID('tigger_curd','tr') is not null) drop trigger tigger_curd go --删除本身并且删除前一个和后一个 create trigger tigger_curd on d_dept after delete as declare @rowcount int set @rowcount = @@rowcount if @rowcount=1 begin declare @up_dept_ID int declare @down_dept_ID int select @up_dept_ID=dept_ID,@down_dept_ID=dept_ID from deleted set @up_dept_ID=@up_dept_ID-1 set @down_dept_ID=@down_dept_ID+1 delete from d_dept where dept_ID=@up_dept_ID delete from d_dept where dept_ID=@down_dept_ID end --测试:最后只剩下 2001,2002,3001 delete from d_dept where dept_ID=1002索引
概念 索引是对数据库表中一个或多个列的值进行排序的结构 建立索引目的是对表中记录的查询或者排序 当表中有别设置为 unique 的字段时,sql server 会自动建立一个非聚集的唯一性索引 当表中有 primary key 的字段时,sql server 会自动建立一个聚集索引索引的作用 索引相当与书的目录,无需对数据库进行整体扫描,加快数据检索速度 通过唯一索引,可以保证数据的唯一性 可以加速表与表之间的连接 在使用 order by 和 group by 子句进行检索数据,显著减少查询中排序和分组的时间 使用索引可以在检索数据的过程中使用优化隐藏器,提过系统的性能 使用索引 查询表中所有数据,使用索引是没有意义的 索引列应该在 where 子句中频繁使用的列 当用户要检索字段的数据包含很多数值或者很多控制 NulL 时,为该列创建索引会大大提高速度 经常排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序速度 索引占用数据库空间,在设计数据库应该把索引空间考虑进去 尽量把表和他的索引存在不同的磁盘上,这样会提高查询速度 不给数据较少和数据较大但不经常查询的表建立索引 多表连接查询的时候,最好能够为关联字段建立索引 当表数据以查询为主导,更新相对少,则要多采用索引,增加检索速度 当表数据更新为主导,查询相对少,则不要建立太多的索引,避免影响更新的速度 如果对表进行大量更新时,可以先销毁索引,等数据更新完成之后再创建索引 要在表的更新速度与查询速度之间寻求一个平衡点索引分类 聚集索引: 是按照数据存放的物理位置为顺序的 也就是说改变了表中数据存放的物理位置 对于多行检索的检索很快 在插入新行或者更新聚集索引一部分列时,DBMS将自动重新排序 非聚集索引: 独立于数据行的结构 非聚集索引包含键值和行定位器 对于单行的检索很快 一个表中可以创建多个非聚集索引,sql Server 查询优化器会自动决定使用哪个索引 创建简单索引 create index index_d_dept on d_dept(dept_name) 创建唯一索引 create unique index index_d_dept on d_dept(dept_name) 创建多列索引 create unique index index_d_dept on d_dept(dept_ID,dept_name) 删除索引 drop index d_dept.index_d_dept 禁用索引(2005) alter index index_d_dept on d_dept disable启用索引(2005) alter index index_d_dept on d_dept rebuild重命名索引 execute sp_rename 'd_dept.index_d_dept','d_dept.index_d_dept_new','index'查看表中的索引 execute sp_helpindex 'd_dept'自定义数据类型
增加自定义数据类型 execute sp_addtype lwctype,'varchar(60)','not null'删除自定义数据类型 execute sp_droptype lwctype总结
以上是内存溢出为你收集整理的SqlServer - 知识点全部内容,希望文章能够帮你解决SqlServer - 知识点所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)