[Mysql] 学习笔记 (挖坑待填)

学习笔记——从零开始学Mysql5.6

第一步,了解数据库的基本操作,包括
数据库的创建和删除
数据表的创建删除和表结构的修改
常用函数
数据查询
数据插入更新和删除
索引
视图
第二步,了解目前还没概念的一些东东,包括
触发器
用户管理
……

算了感觉第一步就够我喝好一壶了。就酱紫先

数据库操作

  • 查看数据库 show databases;
  • 创建数据库 create database <数据库名>;
  • 选择数据库 use <数据库名>;
  • 查看数据库定义 show create database <数据库名>
  • 删除数据库 drop database <数据库名>;
  • 查看存储引擎列表 show engines
  • 提升显示结果直观性 \G
Mysql存储引擎比较
功能MyISAMMemoryInnoDBArchive
存储限制256TBRAM64TBNone
支持事务NoNoYesNo
支持全文索引YesNoNoNo
支持数索引YesYesYesNo
支持哈希索引NoYesNoNo
支持数据缓存NoN/AYesNo
支持外键NoNoYesNo

数据表操作

创建数据表之前应该是用语句use db_name指定数据表操作所在的数据库。

  • 查看数据表列表show tables;
  • 创建数据表 create table <表名> (字段名1 数据类型 [约束条件] [默认值],字段名2 ……)
  • 约束条件
    • 主键约束:数据唯一/非空
      • 单字段主键约束:在定义列的同时定义主键 字段名 数据类型 primary key 或者定义完所有列之后指定主键 [constraint <约束名>]primary key[字段名]
      • 多字段主键约束:在定义完所有列之后指定主键primary key[字段1,字段2,……]
    • 外键约束:可以有多个外键,数据可以为空值,非空值必须等于另一个表(表B)的主键值。定义后,不可以删除表B中与本表数据有关联关系的行,从而保证数据完整和一致。
      • 语法:[constraint <外键名>]foreign key 字段名1 [,字段名2,……] references <主表名> 主键列1 [,主键列2,……]
        • 那是否可以修改表B中有关联关系的数据?兴奋翻到书本很后面看了下update语句试验下——发现由于外键约束的存在,外键字段以及B表中被关联的主键字段的数据都不可以更改,而两个表中的其他字段的数据都可以更改。当然删除外键约束后就可以随便改了。另外测试了下貌似如果定义有外键名的话删除语句中也需要加上字段名不然会报错——虽然我测试时只定义了一个外键
          -问题又来了,那能不能删除table的主键?能不能在定义表格完成后增加(如果原来没有)或修改主键?新增主键下文已经有方法了,至于修改。。。。挖坑待填
    • 非空约束: 字段名 数据类型 not null
    • 唯一性约束:字段名 数据类型 unique或者[constraint <约束名>] unique (<字段名>)
    • 默认约束:字段名 数据类型 default 默认值
    • 属性值自动增长:字段名 数据类型 auto_increment
  • 查看基本数据表结构: describe <表名>;desc <表名>;
  • 查看详细表结构:show create table <表名>;
  • 修改数据表
    • 修改表名: alter table <旧表名> rename [to] <新表名>;
    • 修改字段数据类型: alter table <表名> modify <字段名> <数据类型>;
    • 修改字段名(可以只修改字段名或数据类型): alter table <表名> change <旧字段名> <新字段名> <新数据类型>;
      • 修改表名用rename关键字,修改字段名用change关键字,那么能修改数据库名么?网上搜索了一下,额,感觉不是我现在能搞定的先pass
    • 添加字段:alter table <表名> add <新字段名> <数据类型> [约束条件] [first | after 已存在字段名];
      • 划重点:书上看到的约束条件例子只有非空约束,试了下默认约束和主键约束也可以这样操作,但是外键约束。。。。暂时不会
    • 删除字段:alter table <表名> drop <字段名>
    • 修改字段排列位置:alter table <表名> modify <字段1> <数据类型> first|after <字段2>;
    • 更改表的存储引擎:alter table <表名> engine=<更改后的存储引擎名>
    • 删除外键约束:alter table <表名>drop foreign key <外键约束名>
  • 删除数据表
    • 删除没有关联的表:drop table [if exists]表1,表2……
    • 删除被其他表关联的主表:先删除外键约束,再删除被关联的主表

数据类型(先挖个坑)

整数

浮点数

日期与时间

字符串

二进制

常用运算符

运算符优先级

汇总一下:
- 最低:=(赋值),:=
- ||, OR
- XOR
- AND, &&
- NOT
- BETWEEN…AND…, CASE, WHEN, THEN, ELSE (这些什么鬼没见介绍啊)
- =(比较运算), <=>, <>, !=, <=, <, >, >=, IS, LIKE, IN, REGEXP
- |
- &
- <<, >>
- -, +
- *, /, %
- ^
- -(负号),~
- 最高:!

算术运算符

  • 运算符(优先级由低到高):
    • +-,双目运算符(注意区分单目运算符负号-,后者比减号乘号优先级更高……虽然我还没想出这么定义有什么卵用)
    • */%(返回余数),其中/和%除数为0时都返回NULL

比较运算符

  • 运算符(优先级由低到高):
    • …between…and…(闭区间)
    • =,<=>(可以比较两个null),<>和!=(都表示不等于),>,>=,<,<=,is,like,in,regexp (正则表达式字符匹配)
    • 另外还有least,greatest,isnull,is null,is not null等单目运算符,没看到关于优先级的描述
  • 除了greatest和least外,其他运算符返回值均是0/1/null

逻辑运算符

  • 运算符(优先级由低到高):
    • OR,||,逻辑或
    • XOR,逻辑异或
    • AND,&&,逻辑与
    • NOT,逻辑非
    • !,逻辑非(所有运算符中运算级别最高,所以和NOT语句结果可能会有差别)
  • 返回值均为0/1/null

位运算符

  • 运算符(优先级由低到高):
    • |,逻辑或(二进制)
    • &,逻辑与
    • <<,>>,位左移(左边高位被抛弃,右边补0)和右移(右边低位被抛弃,左边高位补0)
    • ^,位异或
    • ~,位反转

常用函数

数学函数

  • abs(x), sqrt(x), mod(x,y) (求余) 
  • 幂运算
    • pow(x,y), power(x,y), exp(x) 已经见了好几个效果完全相同的函数和运算符,比如这里的powpower不知道是不是版本修改对前面版本的兼容导致。
  • 对数运算
    • log(x) (自然对数), log10(x) (10为底数)
  • 取整
    • ceil(x), ceiling(x) (不小于x的最小整数,右逼近), floor(x)(不大于x的最大整数,左逼近)
  • 四舍五入
    • round(x), round(x,y), truncate(x,y) 后俩保留小数点左右指定位数,不同的是truncate函数直接舍弃有效位数外的数字而不会四舍五入。
  • 随机数
    • rand(), rand(x) 产生[0,1]之间的随机浮点数,x应该是随机数种子。
  • 角度弧度转换
    • radians(x),返回弧度;degrees(x),返回角度.
  • 三角函数
    • sin(x)~asin(x); cos(x)~acos(x); tan(x)~atan(x); cot(x) 参数和反函数的返回值均为弧度。 
  • 圆周率
    • pi()
  • 符号函数
    • sign(x),返回值为-1/0/1

字符串函数

  • 字符串字符个数
    • char_length(x),多字节字符(比如汉字)算作一个字符
  • 字符串字节长度
    • length(x),一个汉字视作1个字符。可以比较select char_length('中国'), length('中国'); 结果是2,6
  • 字符串合并
    • concat(s1,s2,……):参数存在null值,返回null;参数含二进制字符串,返回二进制字符串;所有参数均非二进制字符串,返回非二进制字符串。不太明白这里关于二进制的说明,我用select concat(22,bin(5));测试了下输出是22101,不懂
    • concat_ws(x,s1,s2,……):类似concat,增加了参数连接符x
  • 字符串替换
    • insert(s1,x,len,s2):返回s1从x开始的长度len的字符串(即s1[x,x+len])被s2替换的字符。len超过s1长度限制就将x之后所有字符删除替换为s2;x超过s1长度限制函数直接返回s1;len和s2长度之间没关系,之前有误解以为会不会s2长度不够的话多次替换填充进去。感觉这样设计有函数健壮的考虑,怎么都不会出现异常
  • 大小写转换
    • lower(str), lcase(str)
    • upper(str), ucase(str)
  • 字符截取
    • left(s,n), right(s,n):n超过s长度,全部截取
  • 字符填充
    • lpad(s1,len,s2), rpad(s1,len,s2):s1的左(右)侧填充字符s2至字符串长度达到len,如果len小于s1的长度,则返回s1的前len个字符。测试了下,这里的字符长度是指字符个数char_length(str),如果s2长度和需要填取的字符长度不是整数倍数关系,截取n*s2[1:x]填充,x是需要填充的字符数
  • 删除两端空格
    • ltrim(str), rtrim(str), trim(str):左端/右端/两端,并不删除字符串中间的空格
  • 删除两端指定字符
    • trim(s1 from s):删除s两端的字符s1,连续的n个s1字符全部会被删去,中间的s1字符不受影响。
  • 生成重复字符串
    • repeat(str,n):返回n个连续的str(str可以是数字/二进制类型等),n<=0返回空,str或n为null,返回null
  • 生成空格
    • space(n),返回n个空格。发现如果n取bin(4)的话,会生成100个空格。二进制类型直接当数字用是这种效果么?暂时记下先。另外用浮点数比如4.7的话会返回四舍五入后的5个空格。前面从insert函数开始的整型参数如果选择二进制或者浮点数时都是这样处理
  • 比较字符串大小
    • strcmp(s1,s2),返回-1/0/1
  • 获取子串
    • substring(s,n,len) 和 mid(s,n,len):返回s从位置n开始的len长度字符串,n可以是负数表示逆向定位,len参数可选,缺失时截取n后面所有字符。
  • 匹配子串位置
    • locate(str1,str), position(str1 in str), instr(str,str1) 作用相同,注意参数位置,以及instr区别insert函数。返回值为整数代表str中匹配到str1的位置。
  • 字符串反转
    • reverse(s)
  • 返回指定位置的字符串
    • ELT(n,s1,s2,s3,……),返回字符串s_n,n大于字符串个数返回null。目前想不出有啥用的。
  • 返回指定字符串在字符串列表的位置
    • field(s,s1,s2,……):类似ELT,返回s在{s_n}列表中的位置,如果列表中不存在s或者s为null则返回0。试了下,列表中即便有null,s=null时返回值也是0。
    • find_in_set(s1,s2):类似field函数,不同的是field中的{s_n}序列和s参数是同类型,find_in_set函数的s1仍是字符串,s2则是不同字符串用'a,b,c'的形式表示的列表,a/b/c是不带引号的字符串。
  • 选取字符串
    • make_set(x,s1,s2,……):根据x的二进制值选取指定位置的字符串组成字符串,比如x=3,bit(3)=000000101,则选择s1和s3,返回字符串’s1,s3’

时间日期函数

日期函数除了date类型参数外,也会用datetime或timestamp类型参数,但会忽略时间部分的值。
同样,时间函数也a会采用这两类参数,但会忽略日期部分。
许多日期函数可以同时接受数和字符串两种类型的参数。

  • 获取当前日期和时间
    • curdate()和current_date():作用相同,返回当前日期,格式为YYYY-MM-DD或YYYYMMDD的字符串或数字日期,具体格式视语境决定,比如curdate()+0返回数值型。
    • curtime()和current_time():作用相同,返回当前时间,格式为HH:MM:SS或HHMMSS的字符串或数值。
    • current_timestamp(), localtime(), now(), sysdate()作用相同,返回当前日期和时间,格式为YYYY-MM-DD HH:MM:SS或YYYYMMDDHHMMSS。
  • Unix时间戳函数
    • unix_timestamp(date):无调用参数时,返回一个unix时间戳(格林尼治时间GMT’1970-01-01 00:00:00’之后的秒数)作为无符号整数。调用时间(可以是date字符串,datetime,datestamp或一个YYMMDD/YYYYMMDD格式的时间)时,返回该时间在上面GMT节点后的秒数。
    • from_unixtime(date):将调用的unix时间戳转换成普通格式时间,与unix_timestamp()互为反函数。
  • 返回UTC日期或时间的函数
    • UTC_date(), UTC_time():分别返回当前的UTC(世界标准时间)日期和时间,格式参考上面。
  • 月份
    • month(d), monthname(d):分别返回输入日期对应月份的数值和英文名。
  • 星期
    • dayname(d):返回指定日期的工作日名称(wednesday等)
    • dayofweek(d):返回指定日期对应的一周中的索引位置(1~7),1为周日,2为周一
    • weekday(d):返回指定日期对应的工作日索引(0~6),0为周一,6为周日
  • 获取星期数
    • week(d):返回当前日期是一年的第几周。另外有mode参数缺省可选,参数决定取值范围是0~53还是1~53,一周第一天是周日还是周一,第一周的标准是有三天以上还是第一次出现一周的第一日(周日或周一)乱的一笔啊
    • weekofyear(d):相当于week(d,3),取值范围1~53,第一天为周一,第一周要有三天以上。
  • 获取天数
    • dayofyear(d), dayofmonth(d):指定日期在一年或一月中的位置,范围从1开始。
  • 获取年份/季度/小时/分钟/秒
    • year(d),返回YYYY,范围1970~2069
    • quarter(d),返回1~4
    • minute(time),范围0~59
    • second(time),范围0~59
  • 获取日期指定值(yyyy,mm,dd,hh:mm:ss等)
    • extract(type from date):type比如year,year_month,day_second等,见下文的时间日期计算函数部分。吊诡的是我测验了下,day_minute或者day_second等格式输出结果并不包含日期,似乎日期和时间不能合在一起调用。不知道是不是书本版本老后面改版了,先记下来
  • 时间—秒转化
    • time_to_sec():将时间值转化为秒数
    • sec_to_time():将秒转化为hh:mm:ss或hhmmss。
  • 计算日期和时间
    • date_ADD(date, INTERVAL expr type)和ADDdate(date, INTERVAL expr type):返回date+expr后的时间expr type对应被加的时间及时间格式,具体参考资料,太长省略。若date是日期格式,计算时忽略时间部分,只返回date值。若date时日期时间格式即datetime,返回datetime格式。测试了下,若date只有time值,返回null。
    • date_SUB()和SUB_date():返回date-expr后的时间。
    • ADDtime(date,expr)和SUBtime():与上面函数类似,但是关注时间字段。测试了下,如果date中没有time值,结果看不懂并给出warning
    • datediff(date1,date2):计算两个日期相隔天数,返回值为date1-date2。
  • 格式化
    • date_format(date,format):返回指定format的日期时间值
    • time_format(date,format):返回指定format的时间,如果format中有日期属性,返回null。
    • get_format(val_type,format_type):返回指定format类型(比如USA, EUR, ISO)对应的数据类型(date,time,datetime)的format格式(%……)。可用来和date_format函数配合使用,作为后者的第二个参数被调用。
  • 咦,没有了,哈哈哈哈哈哈……

条件判断函数

  • if(expr,v1,v2):略……
  • ifnull(v1,v2):略……
  • Case expr When v1 Then r1 [When v2 Then r2] [Else rn] End
  • 以上函数返回值视语境决定。

系统信息函数

  • 暂时跳过,等工作接触了再看。

加密函数(什么鬼)

其他函数

数据查询

基本语句

Select
    {*|<字段列表>}     #*全部字段,或者字段列表,不同字段逗号隔开
    [    #表示可选字段
    From <table1>,<table2>…     #查询表单列表,单个或多个
    [where <表达式>]    #根据表达式过滤数据
    [Group by <group by definition>]    #按照指定字段分组显示
    [Having <expression> [{<operator><expression>}…]]    #分组筛选
    [Order by <order by definition>]    #排序,可以升序ASC或降序DESC
    [Limit [<offset>,] <row count>]    #指定每次显示的数据条数
    ]

Select [字段1, 字段2……字段n]
From [表或视图]
Where [查询条件]

where子句过滤数据

  • 条件判断
    • 使用=, <>, !=, <, >, <=, 等比较运算符
    • 使用in (a,b,c……),Between a And b,以及在前面加Not取逆
    • 使用Like语句字符匹配查询:可配合Like使用的通配符有%_。前者匹配任意数目的字符,后者匹配一个字符。
    • 使用Is Null 或 Is Not Null查询空值或非空值。Select * from table_name where 字段n Is Null
    • 使用AND/OR可以做多条件查询。Select * from table_name where 条件1 AND|OR 条件2 AND与OR搭配使用时注意运算优先级。

查询非重复数据

  • Select Distinct 字段名1,2… From 表名 Distinct必须放在所有字段前面,而且作用范围是整个字段列表。即字段1相同而字段2不同的数据不会被当作重复数据过滤掉。想实现这个效果需要借助Group by语句。

排序

  • Select 字段名1,2… From 表名 Order by 排序字段1 [DESC], 排序字段2… 先按字段1排序,再按字段2排序。
  • 默认按照升序排序。字段后面加上关键字DESC可以实现降序排序。DESC只对前面的一个字段降序,和Distinct不同。

分组查询

  • Select 字段名1,2… From 表名 Group by 分组字段 基本语句
  • 常常配合集合函数,比如max(),min(), sum(), avg(), count(), group_concat()等生成新字段。感觉不配合集合函数分组也没用,不分组集合函数也只能单用做整体描述。
  • Group by语句后数据筛选使用 Having语句过滤。Where语句用于分组前。Select 字段名1,2… From 表名 Group by 分组字段 Having 筛选条件 
  • Group by子句中使用With Rollup获得。with rollup产生一行汇总。书上的例子在select语句中用了count函数,对于汇总行给的说明是求和功能,但是我用avg()时汇总行是所有数据的平均值。所以我觉得汇总行的效果应该和使用的集合函数有关,并不一定是求和。没办法,自己学就是这么胆颤心惊先记下以后进一步验证。另外with rollup语句不能和排序语句共用,两者冲突。
  • 多字段分组类似多字段排序,不表。。现在还有点搞不明白with rollup在多字段分组的应用,自己编例子验证挺头疼的。
  • Group by 和 Order by共用时,Order by置后。Having语句也在排序之前。
  • Limit [位置偏移量m,] 行数n:位置偏移m可选,默认0,表示从m+1行开始显示。n表示显示n行。书上说Limit 4 offset 3limit4,3效果相同,测试了一下,应该是Limit 3 offset 4吧。。。不知道是不是版本变更。

使用集合函数查询

  • count()
    • count(*) 计算总行数,不管某列是否有空值。。感觉废话,全空这种情况不太可能发生吧。
    • count(字段) 计算指定字段非空行数。
  • sum()
    • 指定行的求和,忽略null值。
  • min(), max() ……略,主要是和Group by合用。

连接查询

Select [字段1, 字段2……字段n]
    #如果表12中有重名字段,字段名必须声明所属表格,比如"表1.字段1",非重名字段不必声明所属表格
From1 连接类型 表2    #连接类型有内链接(Inner Join),左外连接(Left Outer Join)和右外连接(Right Outer Join)。结果类似`表1
∩表2``表1+表1
∩表2``表2+表1∩表2`On [查询条件]
 On类似Where关键字的作用,查询条件一般是`表1.连接属性=表2.连接属性`
  • 复合条件连接查询:通过添加过滤条件限制查询结果。

子查询

子查询指一个查询嵌套在另一个查询内部的查询。
子查询作为另一个查询的过滤条件。这里考虑了下能不能将一个查询作为另一个查询的数据源。后来想了下,这种嵌套情况仍是基于原始数据结构的一次查询就可以实现。
子查询可以基于一个或多个表。
子查询可以多层嵌套。
子查询长用操作符有 Any (Some), ALL, IN, EXISTS。
子查询可以加到Select, Update, Delete等多个语句中。
子查询中也可以使用各种比较运算符比如<, >, !=等。
- Any(Some), All
- 这两个关键字常跟在比较运算符后面,分别表示和任意查询结果或所有查询结果的比较值为True时返回True。
- 比如Select 字段 from 表1 where 比较字段1 > Any(Select 比较字段2 from 表2);
- Exists 和 Not Exists
- ‘Select 字段 from 表1 where Exists (子查询)’
- 当子查询结果为空时,Exists返回值为False,非空返回True。
- IN 和 Not In   略
- 比较运算符 =, !=, >, <等   略

合并查询结果

查询1
Union [All]
查询2
……
  • 要求两个表对应的烈属和数据类型应相同
  • Union自动删除两个表的重复项,(不知道如果单个搜索结果本身有重复项会不会被删除,mark)如果想保留重复项,使用Union All。

别名

  • 表和字段都可以用AS关键字赋别名,前提是不合已有名称冲突。
  • 表别名只在执行查询时使用,列别名顶以后会返回到客户端显示在查询结果中。

正则表达式应用

工程巨大,暂时挖坑。

数据修改

插入数据

Insert Into tbale_name (colume_list) Values (value_list);
  • colume_list可以省略,这时插入的数据需要为所有列按照表格顺序赋值。
  • 试验了下,给指定列插入数据时,如果其他列有非空限制,数据库会报错。
  • 多个数据同时插入时系统会有提示插入数目,被忽略的数据数目,问题数据数目等。
  • 可以将查询结果插入表格中。Insert into table_name (colume_list1) Select (colume_list2) from table_name2 where……两个colume_list的数目和数据类型必须相同。但是数据库对于列名并不关心,而是按照列表的位置插入数据。

更新数据

Update table_name
set c1=value1, c2=value2,……
where (condition
  • 保证语句已where子句结束,不然会更新所有数据。

删除数据

Delete from table_name [where <condition>];
  • Truncate Table table_name语句可以删除整个表格并重新创建一个表,速度比delete语句快。

索引

含义和特点

  • 索引:包含对数据表里所有记录的引用指针,是一个单独的存储在磁盘上的数据库结构。
  • 优点
    • 加快查询速度(创建索引的主要原因)
    • 通过创建唯一索引,可以保证数据库表中每一行数据的唯一性
    • 加速表与表的连接
    • 减少分组和排序子句查询的时间
  • 缺点
    • 创建和维护需要时间,并且随着数据量增加时间成本也增加
    • 占磁盘空间
    • 数据增删更新时,索引也需要动态维护,降低了数据维护速度

分类

  • 普通索引/唯一索引
    • 普通索引:基本类型,允许空值和重复值
      -唯一性引:不允许重复值,但允许有空值。组合索引则列值组合必须唯一。主键索引较特殊,不允许空值
  • 单列索引/组合索引
    • 单列索引:只包含单个列
    • 组合索引:多个字段上创建的索引,只有查询中使用了这些字段的左边字段才会使用到此类索引。使用时遵循最左前缀集合。。。什么鬼
  • 全文索引
    • 在定义的列上支持全文查找,适合大数据集
    • 允许在列上插入空值和重复值
    • 可以在char,varchar,text类型的列上创建
    • 只有MyISAM引擎支持
  • 空间索引
    • 字段必须为非空
    • 只有MyISAM引擎支持
    • 看不懂

设计原则

  • 并非越多越好,占用内存,影响数据更新
  • 避免对经常更新的列创建索引,且索引中的列尽可能少
  • 经常查询,排序或分组的列上建立索引,待排序的列有多个可以建立组合索引。但应避免加入不必要的字段
  • 在条件表达式中经常用到不同值较多的列上建立索引,不同值较少的列(如性别)无须建立,不然不但不能加速查询还会影响更新速度。
  • 数据量小的表最好不要建立索引
  • 有唯一性特征的数据列可建立唯一索引。需要确保定义的列的数据完整。

创建索引

Create Table table_nam
    #列表创建
    [col_name  data_type]
    [Unique][Fulltext][Spatial][Index|Key][index_name](col_name [length]) [DESC]

    #Unique, Fulltext, Spatial三个可选参数分别表示唯一,全文和空间索引。
    #IndexKey作用相同指明创建索引。
    #index_name表示索引名,可选,缺失默认col_name为索引名。
    #length可选参数表示索引长度,只有字符串类型字段才能指定。
    #ASCDESC指定索引值存储按升序或降序。
  • 使用show create table table_name; 语句可以看到索引创建情况
  • 使用 explain 查询语句; 可以看到语句执行时索引是否使用。
  • 在已经存在的表上创 建索引
    • 关键字AlterAdd

      Alter Table table_name
      Add [Unique][Fulltext][Spartial][Index|Key][index_name](col_name[length]…)[ASC][DESC]
      ` ``</li>
      <li>关键字**Create**, **On**

      Create [][][]Index index_name On table_name (col_name[length]……)[ASC][DESC]
      “`
  • 使用Show Index From table_name; 语句查看数据表中的索引

删除索引

  • Alter Table table_name Drop Index index_name;
  • Drop Index index_name On table_name;
  • 删除表中的列时如果该列是组合索引的组成部分,则该列也会从索引中删除,如果索引中所有列都被删除,索引也会被删除。

视图

含义和作用

  • 视图:从一个或多个表中导出来的虚拟表,可以在已存在视图上定义新视图。
  • 优点(相比直接从数据表中读取数据):
    • 简单化:经常使用的查询可以定义为视图,方便以后查找。
    • 安全性:通过视图只能查询和修改看到的数据。通过视图,用户使用权限可以限制在不同的子集,比如基表的行的子集,列的子集,行和列的子集,多个基表的连接所限定的行,基表的数据统计汇总上,另一个视图的子集,或者一些视图和基表合并的子集上。
    • 逻辑数据独立性:可以屏蔽真实表结构变化带来的影响。

创建视图

Create [Or Replace] [Algorithm={Undefined}]

查看视图

修改视图

更新视图

删除视图

定义列表

Markdown Extra 定义列表语法: 项目1 项目2
定义 A
定义 B
项目3
定义 C

定义 D

定义D内容

代码块

代码块语法遵循标准markdown代码,例如:

@requires_authorization
def somefunc(param1='', param2=0): 
    '''A docstring'''
    if param1 > param2: # interesting
        print 'Greater'
    return (param2 - param1 + 1) or None
class SomeClass:
    pass
>>> message = '''interpreter
... prompt'''

脚注

生成一个脚注1.

目录

[TOC]来生成目录:

数学公式

使用MathJax渲染LaTex 数学公式,详见math.stackexchange.com.

  • 行内公式,数学公式为: Γ(n)=(n1)!nN
  • 块级公式:

x=b±b24ac2a

更多LaTex语法请参考 这儿.

UML 图:

可以渲染序列图:

Created with Raphaël 2.1.0 张三 张三 李四 李四 嘿,小四儿, 写博客了没? 李四愣了一下,说: 忙得吐血,哪有时间写。

或者流程图:

Created with Raphaël 2.1.0 开始 我的操作 确认? 结束 yes no
  • 关于 序列图 语法,参考 这儿,
  • 关于 流程图 语法,参考 这儿.

离线写博客

即使用户在没有网络的情况下,也可以通过本编辑器离线写博客(直接在曾经使用过的浏览器中输入write.blog.csdn.net/mdeditor即可。Markdown编辑器使用浏览器离线存储将内容保存在本地。

用户写博客的过程中,内容实时保存在浏览器缓存中,在用户关闭浏览器或者其它异常情况下,内容不会丢失。用户再次打开浏览器时,会显示上次用户正在编辑的没有发表的内容。

博客发表后,本地缓存将被删除。 

用户可以选择 把正在写的博客保存到服务器草稿箱,即使换浏览器或者清除缓存,内容也不会丢失。

注意:虽然浏览器存储大部分时候都比较可靠,但为了您的数据安全,在联网后,请务必及时发表或者保存到服务器草稿箱

浏览器兼容

  1. 目前,本编辑器对Chrome浏览器支持最为完整。建议大家使用较新版本的Chrome。
  2. IE9以下不支持
  3. IE9,10,11存在以下问题
    1. 不支持离线功能
    2. IE9不支持文件导入导出
    3. IE10不支持拖拽文件导入

t


  1. 这里是 脚注内容.
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值