数据库面试题

1.like用法
搜索以mian开头:
SELECT * FROM teble WHERE title LIKE ‘mian%’ 
搜索以mian结束:
SELECT * FROM teble WHERE title LIKE ‘%mian’ 
搜索包含mian:
SELECT * FROM teble WHERE title LIKE ‘%mian%’
注释:%表示0个或多个字符构成的字符串
_表示单个字符 


2.存储过程的优缺点是什么? 
优点:
1.由于应用程序随着时间推移会不断更改,增删功能,T-SQL过程代码会变得更复杂,StoredProcedure为封装此代码提供了一个替换位置。


2.执行计划(存储过程在首次运行时将被编译,这将产生一个执行计划-- 实际上是 Microsoft SQL Server为在存储过程中获取由 T-SQL 指定的结果而必须采取的步骤的记录。)缓存改善性能。
……..但sql server新版本,执行计划已针对所有 T-SQL 批处理进行了缓存,而不管它们是否在存储过程中,所以没比较优势了。


3.存储过程可以用于降低网络流量,存储过程代码直接存储于数据库中,所以不会产生大量T-sql语句的代码流量。


4.使用存储过程使您能够增强对执行计划的重复使用,由此可以通过使用远程过程调用 (RPC) 处理服务器上的存储过程而提高性能。RPC 封装参数和调用服务器端过程的方式使引擎能够轻松地找到匹配的执行计划,并只需插入更新的参数值。


5.可维护性高,更新存储过程通常比更改、测试以及重新部署程序集需要较少的时间和精力。


6.代码精简一致,一个存储过程可以用于应用程序代码的不同位置。


7.更好的版本控制,通过使用 Microsoft Visual SourceSafe 或某个其他源代码控制工具,您可以轻松地恢复到或引用旧版本的存储过程。


8.增强安全性:
a、通过向用户授予对存储过程(而不是基于表)的访问权限,它们可以提供对特定数据的访问;
b、提高代码安全,防止 SQL注入(但未彻底解决,例如,将数据操作语言--DML,附加到输入参数);
c、SqlParameter 类指定存储过程参数的数据类型,作为深层次防御性策略的一部分,可以验证用户提供的值类型(但也不是万无一失,还是应该传递至数据库前得到附加验证)。


缺点:


1.如果更改范围大到需要对输入存储过程的参数进行更改,或者要更改由其返回的数据,则您仍需要更新程序集中的代码以添加参数、更新 GetValue() 调用,等等,这时候估计比较繁琐了。


2.可移植性差


由于存储过程将应用程序绑定到 SQL Server,因此使用存储过程封装业务逻辑将限制应用程序的可移植性。如果应用程序的可移植性在您的环境中非常重要,则将业务逻辑封装在不特定于 RDBMS 的中间层中可能是一个更佳的选择。


3.内联、左联、右联 
例子


Table A
aid adate
1 a1
2 a2
3 a3


TableB


bid bdate
1 b1
2 b2
4 b4
两个表a,b相连接,要取出id相同的字段
select * from a inner join b on a.aid = b.bid这是仅取出匹配的数据.
此时的取出的是:
1 a1 b1
2 a2 b2


那么left join 指:
select * from a left join b on a.aid = b.bid
首先取出a表中所有数据,然后再加上与a,b匹配的的数据
此时的取出的是:
1 a1 b1
2 a2 b2
3 a3 空字符


同样的也有right join
指的是首先取出b表中所有数据,然后再加上与a,b匹配的的数据
此时的取出的是:
1 a1 b1
2 a2 b2
4 空字符 b4


LEFT JOIN 或 LEFT OUTER JOIN。
左向外联接的结果集包括 LEFT OUTER 子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值


二. left join/right join/inner join操作演示


表A记录如下:
aID aNum
1 a20050111
2 a20050112
3 a20050113
4 a20050114
5 a20050115


表B记录如下:
bID bName
1 2006032401
2 2006032402
3 2006032403
4 2006032404
8 2006032408


实验如下:
1. left join
sql语句如下:


SELECT * FROM A
LEFT JOIN B
ON A.aID = B.bID
结果如下:
aID aNum bID bName
1 a20050111 1 2006032401
2 a20050112 2 2006032402
3 a20050113 3 2006032403
4 a20050114 4 2006032404
5 a20050115 NULL NULL
(所影响的行数为 5 行)


结果说明:
left join是以A表的记录为基础的,A可以看成左表,B可以看成右表,left join是以左表为准的.
换句话说,左表(A)的记录将会全部表示出来,而右表(B)只会显示符合搜索条件的记录(例子中为: A.aID = B.bID).
B表记录不足的地方均为NULL.


2. right join
sql语句如下:


SELECT * FROM A
RIGHT JOIN B
ON A.aID = B.bID
结果如下:
aID aNum bID bName
1 a20050111 1 2006032401
2 a20050112 2 2006032402
3 a20050113 3 2006032403
4 a20050114 4 2006032404
NULL NULL 8 2006032408
(所影响的行数为 5 行)


结果说明:
仔细观察一下,就会发现,和left join的结果刚好相反,这次是以右表(B)为基础的,A表不足的地方用NULL填充.


3.inner join
sql语句如下:


SELECT * FROM A
INNERJOIN B
ON A.aID = B.bID
结果如下:
aID aNum bID bName
1 a20050111 1 2006032401
2 a20050112 2 2006032402
3 a20050113 3 2006032403
4 a20050114 4 2006032404


结果说明:
很明显,这里只显示出了 A.aID = B.bID的记录.这说明inner join并不以谁为基础,它只显示符合条件的记录.


-----------------[以下为网上的一点资料]------------------
LEFT JOIN操作用于在任何的 FROM 子句中,组合来源表的记录。使用 LEFT JOIN 运算来创建一个左边外部联接。左边外部联接将包含了从第一个(左边)开始的两个表中的全部记录,即使在第二个(右边)表中并没有相符值的记录。


语法:
FROM table1 LEFT JOIN table2 ON table1.field1 compopr table2.field2


说明:
① table1, table2参数用于指定要将记录组合的表的名称。
② field1, field2参数指定被联接的字段的名称。且这些字段必须有相同的数据类型及包含相同类型的数据,但它们不需要有相同的名称。
③ compopr参数指定关系比较运算符:”=”, “<", ">“, “<=", ">=” 或 “<>“。
④ 如果在INNER JOIN操作中要联接包含Memo 数据类型或 OLE Object 数据类型数据的字段,将会发生错误。


4.      几个SQL的面试题 


1. 解释一下SQL里面的null
答案:null代表一个unknown的值或者一个不存在的值
2. 如何用SQL判断一个值是不是null?
答案:可以用is null来判断一个值是不是null
3.    所有包含null的计算表达式的返回结果都是null, 这句话正确吗?比如5+ null返回null
答案:正确
4. 所有与null得比较运算都返回unknown正确吗?
答案:正确
5. (unknown or true) = true正确吗?
答案:正确
6. (unknown or false) = unknown正确吗?
答案:正确
7. (unknown or unknown) = unknown正确吗?
答案:正确
8. (true and unknown) = unknown正确吗?
答案:正确
9. (false and unknown) = false正确吗?
答案:正确
10. (unknown and unknown) = unknown正确吗?
答案:正确
11.   (not unknown) = unknown 正确吗?
答案:正确


5.说一下mysql, oracle等常见数据库的分页实现方案? 
1.Oracle:
select * from ( select row_.*, rownum rownum_ from ( query_SQL ) row_ where rownum =< max) where rownum_ >= min
2.SQL Server:
select top @pagesize * from tablename where id not in (select top @pagesize*(@page-1) id from tablename order by id) order by id


3.MySQL
select * from tablename limit position, counter


4.DB2
select * from (select *,rownumber() as ROW_NEXT from tablename) where ROW_NEXT between min and max


——————————————————————————————–
1.分页方案一:(利用Not In和SELECT TOP分页)效率次之
语句形式:
SELECT TOP 10 * FROM TestTable
WHERE(ID NOT IN (SELECT TOP 20  id FROM  TestTable  ORDERBY  id))   ORDERBYID
SELECT  TOP 页大小 * FROM TestTable
WHERE( ID NOT IN (SELECT  TOP  每页大小-1*待查询页数-1  id  FROM  表 ORDERBY  id)) ORDERBYID
思路:先查询出待查询页之前的全部条数的id,查询ID不在这些ID中的指定数量条数


2.分页方案二:(利用ID大于多少和SELECT TOP分页)效率最高
语句形式:
SELECT  TOP  10 *   FROM  TestTable
WHERE(ID>(SELECT MAX(id) FROM(SELECT TOP20 id  FROM  TestTable ORDERBYid)AS T))ORDERBY ID
SELECT  TOP  页大小* FROM  TestTable
WHERE(ID>(SELECT MAX(id) FROM(SELECT TOP 每页大小*待查询页数-1  id FROM 表  ORDERBY id)AS T)) ORDERBY ID
思路:先获得待查询页的之前全部条数id,获得它们当中最大的ID号,以此最大ID号为标志,查找比这个ID号大的指定条数


3.分页方案三:
SELECT TOP PageSize * FROM(SELECT TOP nPage*PageSize * from YOURTABLE order by id)as a order by id desc
SELECT TOP 每页条数 * FROM (SELECT TOP 待查询页*每页条数) * from YOURTABLE order by id)as a order by id desc
思路:先正排序查询出待查询页之前(包括当前页)的全部条数,然后将其倒排序,取指定条数


6.第一范式(1NF)、第二范式(2NF)和第三范式(3NF)之间的区别是什么? 
构造数据库必须遵循一定的规则。在关系数据库中,这种规则就是范式。范式是符合某一种级别的关系模式的集合。关系数据库中的关系必须满足一定的要求,即满足不同的范式。目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、第四范式(4NF)、第五范式(5NF)和第六范式(6NF)。满足最低要求的范式是第一范式(1NF)。在第一范式的基础上进一步满足更多要求的称为第二范式(2NF),其余范式以次类推。一般说来,数据库只需满足第三范式(3NF)就行了。下面我们举例介绍第一范式(1NF)、第二范式(2NF)和第三范式(3NF)。


3.4.1 第一范式(1NF)
    在任何一个关系数据库中,第一范式(1NF)是对关系模式的基本要求,不满足第一范式(1NF)的数据库就不是关系数据库。
     所谓第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。如果出现重复的属性,就可能需要定义一个新的实体,新的实体由重复的属性构成,新实体与原实体之间为一对多关系。在第一范式(1NF)中表的每一行只包含一个实例的信息。例如,对于图3-2 中的员工信息表,不能将员工信息都放在一列中显示,也不能将其中的两列或多列在一列中显示;员工信息表的每一行只表示一个员工的信息,一个员工的信息在表中只出现一次。简而言之,第一范式就是无重复的列。


3.4.2 第二范式(2NF)
    第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。第二范式(2NF)要求数据库表中的每个实例或行必须可以被惟一地区分。为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。如
图3-2 员工信息表中加上了员工编号(emp_id)列,因为每个员工的员工编号是惟一的,因此每个员工可以被惟一区分。这个惟一属性列被称为主关键字或主键、主码。
     第二范式(2NF)要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性,如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。简而言之,第二范式就是非主属性非部分依赖于主关键字。


3.4.3 第三范式(3NF)
    满足第三范式(3NF)必须先满足第二范式(2NF)。简而言之,第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。例如,存在一个部门信息表,其中每个部门有部门编号(dept_id)、部门名称、部门简介等信息。那么在图3-2
的员工信息表中列出部门编号后就不能再将部门名称、部门简介等与部门有关的信息再加入员工信息表中。如果不存在部门信息表,则根据第三范式(3NF)也应该构建它,否则就会有大量的数据冗余。简而言之,第三范式就是属性不依赖于其它非主属性。
所谓范式就是符合某一种级别的关系模式的集合。通过分解把属于低级范式的关系模式转换为几个属于高级范式的关系模式的集合。这一过程称为规范化。  
   
  1、   第一范式(1NF):一个关系模式R的所有属性都是不可分的基本数据项。  
  2、   第二范式(2NF):关系模式R属于第一范式,且每个非主属性都完全函数依赖于键码。  
  3、   第三范式(3NF):关系模式R属于第一范式,且每个非主属性都不伟递领带于键码。  
  4、   BC范式(BCNF):关系模式R属于第一范式,且每个属性都不传递依赖于键码。




武汉英思工程科技有限公司–ORACLE面试测试题目 
1.    解释FUNCTION,PROCEDURE和PACKAGE区别
答:function 和procedure是PL/SQL代码的集合,通常为了完成一个任务。procedure 不需要返回任何值而function将返回一个值在另一方面,Package是为了完成一个商业功能的一组function和procedure的集合。


2.    取某个序列的当前值的PL/SQL语句怎么写?
答:SELECT 序列名.CURRVAL  FROM  DUAL;


3.    说明ORACLE数据库实例与ORACLE用户的关系?
答:实例可以包含多个用户,一个用户只能在一个实例下


4.    创建数据库时,自动建立的tablespace名称?
答:SYSTEM tablespace


5.    创建用户时,需要赋予新用户什么权限才能使它连上数据库?
答:CONNECT


6.    IMPORT和SQL*LOADER这2个工具的不同点?
答:这两个ORACLE工具都是用来将数据导入数据库的。
区别是:IMPORT工具只能处理由另一个ORACLE工具EXPORT生成的数据。而SQL*LOADER可以导入不同的ASCII格式的数据源。


7.解释冷备份和热备份的不同点以及各自的优点?
答:热备份针对归档模式的数据库,在数据库仍旧处于工作状态时进行备份。而冷备份指在数据库关闭后,进行备份,适用于所有模式的数据库。热备份的优点在于当备份时,数据库仍旧可以被使用并且可以将数据库恢复到任意一个时间点。冷备份的优点在于它的备份和恢复操作相当简单,并且由于冷备份的数据库可以工作在非归档模式下,数据库性能会比归档模式稍好。(因为不必将archive log写入硬盘)


8.比较truncate和delete命令?
答:两者都可以用来删除表中所有的记录。区别在于:truncate是DDL(data defining language数据定义语言),它移动HWK,不需要rollback segment(处理事务回滚操作)而Delete是DML(data manufacturing language数据操作语言)操作,需要rollback segment(处理事务回滚操作)且花费较长时间。


9.给出数据的相关约束类型?
答:主键约束,外键约束,非空约束,唯一约束,检查约束。


10.说明索引的类型与作用?
答:索引类型上分为聚集索引,非聚集索引其作用是加快查询速度。


11.解释归档和非归档模式之间的不同和它们各自的优缺点
答:归档模式是指你可以备份所有的数据库 transactions并恢复到任意一个时间点。非归档模式则相反,不能恢复到任意一个时间点。但是非归档模式可以带来数据库性能上的少许提高。


12.解释$ORACLE_HOME和$ORACLE_BASE的区别?
答:ORACLE_BASE是oracle的根目录,ORACLE_HOME是oracle产品的目录。


13.获取某个字符字段的最后3个字符的函数是什么?
答:select substr (字段,(length(字段)-3)) from 表


14.取当前系统时间点日期(不包括年月)的SQL写法是怎样的?
答:Select substr (to_char(sysdate,’YYYYMMDDh24hh:MM:SS’),5) from dual;


15.返回大于等于N的最小整数值?
答:select ceil(N) from dual;


16.将根据字符查询转换后结果,规则为:’A’转换为’男’,’B’转换为’女’,其他字符转换为’未知’,请用一个SQL语句写出。
答:select decode(字符,’A’,’男’,’B’,’女’,’未知’) from dual;


17.如何搜索出前N条记录?
答:select * from 表 where  Rownum <= N;


18.如何搜索出第N~M条记录?
答:select * from 表 where Rownum <= M
Minus
select * from 表 where Rownum <= N;


19.有一个数据表(TEST),字段如下:
ID      number
PARENT_ID      number
NAME      Varchar(20)
请使用PL/SQL来按父子层次关系查询出该表的所有数据
答:Select * from test a, test b Where a.parent_id = b.id;


20.怎样用SQL语句实现查找一列中的第N大值?
答:select * from (select * from 表 order by 列名 Desc) where Rownum <= N
Minus
select * from (select * from 表 order by 列名 Desc) where Rownum <= N-1;


腾讯公司的一个sql题 
小小+霸霸+王王=小霸王 
小=?,霸=?,王=? 
用sql求证


参考答案:


declare @data int,@i int,@j int,@l int 
set @data=100 
while (@data<=999) 
begin 
   set @i=@data/100 
   set @j=@data/10 % 10 
   set @l=@data % 10 
   if((@i+@j+@l)*11=@data) 
   begin 
      Select @data data,@i i,@j j,@l l 
      break 
   end 
   set @data=@data+1 
end; 
分析: 
II+JJ+LL=IJL 
I*10+I +J*10+J+L*10+L   =   I*100+J*10+L 
(I+J+L)*11


什么是事务?事务有哪些性质?
答:事务:是用户定义的一个数据库操作序列,这些操作要么全做,要么全不做,是一个不可分割的工作单位。一个事务可以是一条SQL语句,也可以是一组SQL语句。
性质:
(1)原子性:事务是数据库的逻辑工作单位,被看做一个单一的、不可分割的操作单元。事务中包括的所有操作要么都做,要么都不做。
(2)一致性:事务执行的结果必须是使数据库从一个一致状态变到另一个一致状态。
(3)隔离性:一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对其他并发事务是隔离的,并发执行的各个事务之间不能互相干扰。
(4)持续性:指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其执行结果有任何影响。


SQL里面如何插入自动增长序列号字段?
INSERT时如果要用到从1开始自动增长的数字做唯一关键字, 应该先建立一个序列号.


CREATE SEQUENCE 序列号的名称 (最好是表名+序列号标记) INCREMENT BY 1 START WITH 1 MAXVALUE 99999 NOCYCLE NOCACHE;


其中最大的值按字段的长度来定,比如定义的自动增长的序列NUMBER(6) , 最大值为999999


INSERT 语句插入这个字段值为: 序列号的名称.NEXTVAL


例子: SQL> insert into s_dept(id, name, region_id) values (s_dept_id.nextval, ‘finance’, 2);


1 row created.


只有运行了序列号的名称. nextval后序列号的名称. currval 才有效才有值.


Oracle里面常用的数据字典有哪些? 
Dictionary  存放所有数据表,视图,同义词名称和解释


Dict_columns    数据字典里字段名称的和解释


Dba_users   用户    Dba_tablespaces     表空间


Dba_data_files  数据库的文件 Dba_free_space           空闲表空间


Dba_rollback_segs 回滚段


User_objects    数据对象 User_constraints    约束条件


User_sequences  序列号      User_views      视图


User_indexes    索引    User_synonyms       同义词


Session_roles   用户的角色   User_role_privs     用户的角色权限


User_sys_privs  用户的系统权限   User_tab_privs      用户的表级权限


V$session   实时用户情况 V$sysstat       实时系统统计


V$sesstat   实时用户统计 V$sgastat       实时SGA使用


V$locked_object 实时锁       V$controlfile       控制文件


V$logfile   日志文件 V$parameter     参数文件


1. Oracle安裝完成后的初始口令?  


   internal/oracle
   sys/change_on_install
    system/manager
    scott/tiger
    sysman/oem_temp   


  2. ORACLE9IAS WEB CACHE的初始默认用户和密码?   


   administrator/administrator  


  3. oracle 8.0.5怎么创建数据库?   


   用orainst。如果有motif界面,可以用orainst /m  


  4. oracle 8.1.7怎么创建数据库? 


   dbassist  


  5. oracle 9i 怎么创建数据库?  


   dbca   


  6. oracle中的裸设备指的是什么?   


   裸设备就是绕过文件系统直接访问的储存空间  


  7. oracle如何区分 64-bit/32bit 版本???  


  $ sqlplus ‘/ AS SYSDBA’
  SQL*Plus: Release 9.0.1.0.0 – Production on Mon Jul 14 17:01:09 2003
  (c) Copyright 2001 Oracle Corporation. All rights reserved.
  Connected to:
  Oracle9i Enterprise Edition Release 9.0.1.0.0 – Production
  With the Partitioning option
  JServer Release 9.0.1.0.0 – Production
  SQL> select * from v$version;
  BANNER
  Oracle9i Enterprise Edition Release 9.0.1.0.0 – Production
  PL/SQL Release 9.0.1.0.0 – Production
  CORE 9.0.1.0.0 Production
  TNS for Solaris: Version 9.0.1.0.0 – Production
  NLSRTL Version 9.0.1.0.0 – Production
  SQL>   


  8. SVRMGR什么意思?  


  svrmgrl,Server Manager. 


  9i下没有,已经改为用SQLPLUS了 


  sqlplus /nolog
  变为归档日志型的  


  9. 请问如何分辨某个用户是从哪台机器登陆ORACLE的? 


  SELECT machine , terminal FROM V$SESSION;   


  10. 用什么语句查询字段呢?  


  desc table_name 可以查询表的结构
  select field_name,… from … 可以查询字段的值
  select * from all_tables where table_name like ‘%’
  select * from all_tab_columns where table_name=’??’   


  11. 怎样得到触发器、过程、函数的创建脚本?  


  desc user_source
  user_triggers    


  12. 怎样计算一个表占用的空间的大小?  


  select owner,table_name,
  NUM_ROWS,
  BLOCKS*AAA/1024/1024 “Size M”,
  EMPTY_BLOCKS,
  LAST_ANALYZED
  from dba_tables
  where table_name=’XXX’;
  Here: AAA is the value of db_block_size ;
  XXX is the table name you want to check  


14. 如何查看系统被锁的事务时间?
  select * from v$locked_object ; 


  15. 如何以archivelog的方式运行oracle。
  init.ora
  log_archive_start = true
  RESTART DATABASE
  16. 怎么获取有哪些用户在使用数据库
  select username from v$session; 


  17. 数据表中的字段最大数是多少? 


  表或视图中的最大列数为 1000   


  18. 怎样查得数据库的SID ? 


  select name from v$database; 


  也可以直接查看 init.ora文件 


  19. 如何在Oracle服务器上通过SQLPLUS查看本机IP地址 ? 


  select sys_context(’userenv’,'ip_address’) from dual; 


  如果是登陆本机数据库,只能返回127.0.0.1,呵呵   


  20. unix 下怎么调整数据库的时间? 


  su -root 


  date -u 08010000 


如何找出EMP表里面SALARY第N高的employee? 
SELECT DISTINCT (a.sal) FROM EMP A WHERE &N = (SELECT COUNT (DISTINCT (b.sal)) FROM EMP B WHERE a.sal<=b.sal);
例如:-
输入&N的值为2 则输出结果为:
SAL
———
3700


如何删除一个表里面的重复行?
 delete from table_name where rowid not in (select max(rowid) from table_name group by duplicate_values_field_name);
或者
delete duplicate_values_field_name dv from table_name ta where rowid <(select min(rowid) from table_name tb where ta.dv=tb.dv);
或者
DELETE FROM table_name A WHERE rowid>(SELECT MIN(rowid) FROM table_name B WHERE A>key_values=B.key_values);


SQL里面IN比较快还是EXISTS比较快? 
EXISTS比较快因为EXISTS返回一个Boolean型而IN返回一个值。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值