[-]
转载请注明原始出处:http://blog.csdn.net/a464057216/article/details/52496916
SQL是ANSI标准下访问和处理数据库的结构化查询语言。SQL可以在各个RDBMS(关系型数据库管理系统,如MySQL、Microsoft Access)中使用,各个RDBMS也有自己独有的扩展。
RDBMS中,不同数据存储在不同的数据库中。每个数据库通常包含多个表,多个表由表名区分。表由行和列组成,每一行对应一条数据,每一列对应数据的一个属性。
下面通过MySQL介绍SQL语言。首先查看MySQL状态:
如果字符集的配置不是utf8,建议改成utf8:
set命令后面的参数可以通过如下命令查询:
把除了character_set_filesystem
和character_sets_dir
之外的变量都设置成utf8。
SQL语言分为两部分:数据定义语言(DDL)和数据操作语言(DML)。
包括创建/删除/修改数据库/数据表的方法、定义索引、添加表约束等:
列出全部数据库。
create database
创建名为
的数据库,比如create database lmz;
。
drop database
删除名为
的数据库。
use
使用某个数据库(然后才能操作其中的表),比如use lmz;
。
查看数据库中所有数据表。
create table ( , , ..)
创建数据表,其中
表示表名,
表示列名,
表示对应列的数据类型。
NULL表示没有值,和取值为0不同。
unique限制某一列或者多个列元素的唯一性(如果该列允许为NULL的话,则唯一性无法限制存在多个NULL的情况,所以如果限制为unique,最好同时限制not null),比如:
如果unique规则在创建时没有命名,删除方法如下:
对于已经创建的表,可以使用alter table
语句增加unique限制,比如给上面的数据表a恢复之前的unique限制:
另外,限制为unique的列会自动添加唯一性索引。
primary key用来创建主键,主键用来标识数据表中数据的唯一性,每个数据表只能有一个主键,但是可以有多条unique规则,主键列不能包含null值,主键自动带有unique规则。
主键同样可以包含多个列,也可以对主键规则命名(但是对主键命名的意义不大,因为表只有一个主键,删除primary key时也不提供主键名这个参数)、删除主键规则等等:
foreign key用来在两个表之间建立关联,foreign key必须指向另一个表的具有唯一性约束的列(一个或多个),比如:
一个数据表中,可以含有多个外键,所以删除外键时需要提供外键规则的名字:
也可以使用alter table
语句为已经创建的数据表添加外键,比如针对上面的数据表b:
auto_increment用来限制主键列的数据是自动增加的,默认从1开始增加,MySQL中auto_increment必须用在主键中,比如:
integer(size)
/int(size)
、tinyint(size)
、smallint(size)
、mediumint(size)
、bigint(size)
,其中size表示显示宽度,显示时默认右对齐。
如果设置了zerofill
,右对齐时不足的位数用零填充,超过的位数正常显示。比如:create table n (v tinyint(5) zerofill unsigned);
只允许插入无符号整数(0~255),且显示时右对齐、零填充:
常用整型数据类型如下:
类型 | 存储空间 | 最小值 | 最大值 |
---|---|---|---|
(字节) | (Signed/Unsigned) | (Signed/Unsigned) | |
tinyint | 1 | -128 | 127 |
0 | 255 | ||
smallint | 2 | -32768 | 32767 |
0 | 65535 | ||
mediumint | 3 | -8388608 | 8388607 |
0 | 16777215 | ||
int | 4 | -2147483648 | 2147483647 |
0 | 4294967295 | ||
bigint | 8 | -9223372036854775808 | 9223372036854775807 |
0 | 18446744073709551615 |
decimal(precision, scale)
/numeric(precision, scale)
,其中precision规定有效数字位数,scale规定小数点后数字长度,比如:
v这列数字的范围是-999.99~999.99,如果插入数据的小数点后数字长度超过2,会自动四舍五入后插入。
char(size)
存储最大长度固定的字符串,varchar(size)
存储变长字符串。char(size)
类型固定占用size个字符的空间,不足的右侧补空格,输出时移除右侧空格(除非设置了PAD_CHAR_TO_FULL_LENGTH
,输出时才不会移除右侧空格),size的范围是0~255。varchar(size)
类型size的范围是0~65535,如果长度不超过255,需要额外1字节记录长度,如果超过255,需要额外两字节记录长度。
set sql_mode=""
用来恢复char(size)
类型输出时删除右侧空格的默认行为。
timestamp
用于存储YYYY-MM-DD HH:mm:ss格式(也支持YYMMDD、YYYYMMDD、YYMMDDHHMMSS、YYYYMMDDHHMMSS)的时间戳,范围[1970-01-01 00:00:00~2037-12-31 23:59:59]
,比如在数据库中设置初次插入时间及更新时间:
datetime
也可以表示时间戳,且表示的范围为[1000-01-01 00:00:00~9999-12-31 23:59:59]
。
time
用来存储HH:MM:SS格式的日期,表示范围为[-839:59:59~839:59:59]
。
year
用来存储时间中“年”的部分,支持两位或4位数字。平时最好使用4位数字以免造成歧义,比如:
alter语句可以修改已经存在的数据表的属性,如主键、外键、索引、列等等。比如为数据表添加新的列:
drop table
删除名为
的分组。
show create table
查看名为
的表结构。
包括查询、更新、插入、删除数据等操作:
向数据表中插入数据,语法格式为insert into
或者指定为某几列赋值insert into
。
从数据表中查询数据,结果存储在一个结果表(结果集)中,语法格式为select * from
或者select
。
结果集支持更多的操作以实现对查询结果的更多维度地分析。
在select语句的后面增加limit
可以限制显示前n条数据,limit
限制从start位置(下标从0开始)开始,length条数据。
限制更精细的查询条件,格式为
,其中运算符支持列表如下:
操作符 | 描述 |
---|---|
= | 等于 |
<>(或!=) | 不等于 |
> |
大于 |
< | 小于 |
>= |
大于等于 |
<= | 小于等于 |
like | 搜索简单模式 |
rlike | 搜索正则模式 |
in | 在某个列表中 |
between … and | 在某个范围内 |
is null | 是NULL |
is not null | 不是NULL |
not | 否定 |
在书写字面量时,字符串应该用引号包围,数值量不应该用引号包围:
like操作符可以实现简单的模糊匹配,%
匹配多个字符,_
匹配单个字符,比如:
如果确实要查询%
或_
字符本身,可以配合escape
设置一个转义开关后对其进行转义,比如select * from c where v like "lm/%%" escape "/"
在c中匹配v列以lm%
开头的字符串。
rlike操作符用来实现正则匹配,语法与标准正则表达式相同。
in操作符用来在一个括号包围,逗号分隔的列表中查找指定的值,比如:
between …and操作符用来在指定范围内查找数据,可以是数值、字符串、日期等,区间范围左闭右开:
is null判断该列的某一行的值为NULL(即没有赋值)。NULL的判断不能使用=
运算符。
is not null判断该列的某一行的值不为NULL。
可以使用and或者or组合查询条件,也可以使用括号实现查询条件的复杂组合。
使用order by
可以对结果排序,DESC表示降序,ASC表示升序(默认):
数据表名字过长时可以设置别名:select
,比如:
比如如下两个数据表:
查询staff表中每个人的工作,可以使用:
或者可以使用join语句。
join用于根据多个表中的列之间的关系,从这些表中查询数据,注意查询条件的语句是用on不是where:
join也可以写成inner join。
left join用于列出左侧表格中的所有数据,及右侧表格符合匹配条件的数据(如果有的话),比如:
right join用于列出右侧表格中的所有数据,及左侧表格符合匹配条件的数据(如果有的话),比如:
union用来组合两个select语句的查询结果,要求结果集中字段个数相同,每个字段的类型相同。会对重复结果去重,且查询结果的列名以前面的命名为准,比如有如下两个数据表:
MySQL不支持full join,所以可以配合union(根据业务场景可能会使用union all)+lef join+right join实现。
update:更新数据表中某一行数据,语法格式update
:
delete:删除数据表中的数据,语法格式为delete from
。删除所有行的语法为delete from
。
truncate table
,与delete的不同之处在于,该操作不记录日志,是无法回滚的,效率更高,而delete操作是可以回滚的,记录日志,效率稍低。在经常做查询操作的数据表的那些列上创建索引可以优化查询速度。
使用show index from
或者show keys from
可以查询某个数据表上创建了哪些索引。
使用unique key
或者unique index
可以创建唯一性索引,即建立索引的这一列或这几列不允许重复(最好同时限制not null约束,可以避免同时存在多个NULL的情况,unique约束无法限制多个NULL的情况)。
使用key
或者index
可以创建索引。
转载请注明原始出处:http://blog.csdn.net/a464057216/article/details/52517945
MySQL中主要由三种数据类型:数字、字符串、日期。
float(size, scale)
类型规定了整个浮点数的位数及小数点后的位数,比如float(4, 2)
支持-99.99~99.99,即小数点前的位数只支持size-scale(4-2)个,小数点后的数字位数如果超过了scale个,则会自动四舍五入。
double(size, scale)
类型中size、scale的含义同float类型。
tinytext
类型存储最长为255的字符串。
text
存储最长为65535的字符串。
mediumtext
存储最长为16777215的字符串。
longtext
存储最长为4294967295的字符串。
blob
存储最大为65535字节的二进制数据。
mediumblob
存储最大为16777215字节的二进制数据。
longblob
存储最大为4294967295字节的二进制数据。
enum(a1, a2, ...)
存储(a1, a2, ...)
中的值,最多可以存放65535个值,比如:
set(a1, a2, ...)
存储(a1, a2, ...)
中的值,set中最多可以存放64个值,但是set可以存放用逗号分隔的多个值,比如:
MySQL中,视图是一种虚拟表(不能与实际数据表重名),可以定义视图后绑定到某个用户上,实现访问控制。视图并没有存储数据,而是对真实数据的引用,只有操作视图的时候才会执行视图中的SQL操作数据。
视图创建以后,就如同真实的表一样,可以操作数据(插入、更新、删除等):
考虑到数据安全,可以在创建视图是增加with check option
选项,这样如果对视图操作后的数据在视图中不再可见,则不允许该操作。比如正常的视图如果操作一条数据后在视图中不再可见是不做检查的:
如果加了with check option
选项,则不允许上面的更新操作:
drop view
命令删除视图。
now()
函数获取当前日期及时间,返回YYYY-MM-DD hh:mm:ss
格式的数据。
curdate()
函数获取当前日期,返回YYYY-MM-DD
格式的数据。
curtime()
函数获取当前时间,返回hh:mm:ss
格式的数据。
date(str)
函数返回日期或时间字符串str中的日期部分,比如:
extract(EXP from str)
函数从日期、时间字符串中返回单独的部分,比如年、月、小时、小时至分钟等,EXP可用字段如下:
EXP | 含义 |
---|---|
microsecond | 微秒 |
second | 秒 |
minute | 分钟 |
hour | 小时 |
day | 天 |
week | 周 |
month | 月 |
quarter | 季度 |
year | 年 |
second_microsecond | 秒到微秒 |
minute_microsecond | 分钟到微秒 |
hour_microsecond | 小时到微秒 |
day_microsecond | 天到微秒 |
minute_second | 分钟到秒 |
hour_second | 小时到秒 |
day_second | 天到秒 |
hour_minute | 小时到分钟 |
day_minute | 天到分钟 |
day_hour | 天到小时 |
year_month | 年到月 |
date_add(str, interval str2 type)
命令用来给字符串str表示的日期增加一段时间,str2是表示增量的字符串,type的取值见上表,比如:
date_sub(str, interval str2 type)
函数语法格式与date_add()
函数语法格式一样,从str代表的时间中减去一段时间,比如:
datediff(str1, str2)
函数返回str1和str2代表的日期的差值,比如:
date_format(str, format)
返回str代表的时间字符串格式化为format指定的格式后的结果,其中format格式化参数如下:
格式 | 描述 |
---|---|
%a | 星期的缩写,如Wed |
%b | 缩写月名 |
%c | 月,数值 |
%D | 带有英文后缀的月中的天数 |
%d | 月的第几天,数值(00-31) |
%e | 月的第几天,数值(0-31) |
%f | 微秒 |
%H | 小时 (00-23) |
%h | 小时 (01-12) |
%I | 小时 (01-12) |
%i | 分钟,数值(00-59) |
%j | 年的天 (001-366) |
%k | 小时 (0-23) |
%l | 小时 (1-12) |
%M | 月名 |
%m | 月,数值(00-12) |
%p | AM 或 PM |
%r | 时间,12-小时(hh:mm:ss AM 或 PM) |
%S | 秒(00-59) |
%s | 秒(00-59) |
%T | 时间, 24-小时 (hh:mm:ss) |
%U | 周 (00-53) 星期日是一周的第一天 |
%u | 周 (00-53) 星期一是一周的第一天 |
%V | 周 (01-53) 星期日是一周的第一天,与 %X 使用 |
%v | 周 (01-53) 星期一是一周的第一天,与 %x 使用 |
%W | 星期名 |
%w | 周的天 (0=星期日, 6=星期六) |
%X | 年,其中的星期日是周的第一天,4 位,与 %V 使用 |
%x | 年,其中的星期一是周的第一天,4 位,与 %v 使用 |
%Y | 年,4 位 |
%y | 年,2 位 |
MySQL中有很多用于数学计算的函数,应用语法为select function(
,这些函数主要分为两类:
对某一列生效,返回一个单独的值。
返回某一列的平均值,值为NULL的行不参与分子和分母的运算。
count(
计算某一列的行数(值为NULL的不参与计算),count(distinct
计算某一列的行数(去重,值为NULL的不参与计算),count(*)
计算表格的行数:
min(
用来从某一列获取最小值(NULL不参与运算)。可以用于文本型书序按字典序排序。
max(
用来从某一列获取最大值(NULL不参与运算)。可以用于文本型书序按字典序排序。
sum(
用来返回某一列的总和。
聚合函数通常需要配合group by语句进行分组,比如查询每个id中最大的price(结果按照id分组):
也就是要查询的列既包含原始列,又包含聚合函数作用的列时,需要使用group by语句。也可以基于多个原始列进行分组:
进行复杂聚合和分组时,如果对原始列进行条件查找,可以在group by语句之前使用where语句,但是对聚合函数进行条件查找,比如在group by语句之后使用having语句,语法格式为select
。
对某一单独输入生效,返回一个单独的值
NULL参与数学运算的结果是NULL,有时希望在某一列的值是NULL的时候,将其当做另一个值参与运算,比如:
ucase(
用来将某一列的值转换为大写后返回。
mid(
用来从某一列的字符值中,从start位置开始(下标从1开始),长度为length的字符串,如果未指定length,则返回到字符串结尾的所有字符,比如:
length(
用来返回某一列字符的长度。
now()
函数返回当前的时间。比如:
round(
用来返回某一列浮点型数值保留小数点后decimal位的结果:
format(value, decimal)
函数用来返回更美观的浮点数输出,比如: