类型 | 大小 | 范围(有符号) | 范围(无符号) | 用途 |
---|---|---|---|---|
TINYINT | 1 字节 | (-128,127) | (0,255) | 小整数值 |
SMALLINT | 2 字节 | (-32 768,32 767) | (0,65 535) | 大整数值 |
MEDIUMINT | 3 字节 | (-8 388 608,8 388 607) | (0,16 777 215) | 大整数值 |
INT或INTEGER | 4 字节 | (-2 147 483 648,2 147 483 647) | (0,4 294 967 295) | 大整数值 |
BIGINT | 8 字节 | (-9,223,372,036,854,775,808,9 223 372 036 854 775 807) | (0,18 446 744 073 709 551 615) | 极大整数值 |
FLOAT | 4 字节 | (-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) | 0,(1.175 494 351 E-38,3.402 823 466 E+38) | 单精度 浮点数值 |
DOUBLE | 8 字节 | (-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 双精度 浮点数值 |
DECIMAL | 对DECIMAL(M,D) ,若是M>D,为M+2不然为D+2 | 依赖于M和D的值 | 依赖于M和D的值 | 小数值 |
unsigned 既为非负数,用此类型能够增长数据长度! 例如 num1 unsigned unsigned 属性只针对整型,而binary属性只用于char 和varchar 整型字段有个ZEROFILL属性,在数字长度不够的数据前面填充0,以达到设定的长度。 column_name DECIMAL(P,D); P是表示有效数字数的精度。 P范围为1〜65。D是表示小数点后的位数。 D的范围是0~30。MySQL要求D小于或等于(<=)P。 DECIMAL(P,D)表示列能够存储D位小数的P位数。十进制列的实际范围取决于精度和刻度。
类型 | 大小 (字节) | 范围 | 格式 | 用途 |
---|---|---|---|---|
DATE | 3 | 1000-01-01/9999-12-31 | YYYY-MM-DD | 日期值 |
TIME | 3 | '-838:59:59'/'838:59:59' | HH:MM:SS | 时间值或持续时间 |
YEAR | 1 | 1901/2155 | YYYY | 年份值 |
DATETIME | 8 | 1000-01-01 00:00:00/9999-12-31 23:59:59 | YYYY-MM-DD HH:MM:SS | 混合日期和时间值 |
TIMESTAMP | 4 | 1970-01-01 00:00:00/2038结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07 | YYYYMMDD HHMMSS | 混合日期和时间值,时间戳 |
注意区分 '0' (字符串) 和 0 (数字)。 '0' 表示的YEAR值是2000, 0 表示的YEAR值是0000。 # 设置d字段的数据类型为DATE CREATE TABLE my_date (d DATE); # 插入日期数据 INSERT INTO my_date VALUES('2020-01-21'); # 插入当前系统日期 INSERT INTO my_date VALUES(CURRENT_DATE); # 插入当前系统日期和时间 INSERT INTO my_date VALUES(NOW()); #日期分隔符用-,时间分隔符用:,中间能够用空格隔开
类型 | 大小 | 用途 |
---|---|---|
CHAR | 0-255字节 | 定长字符串 |
VARCHAR | 0-65535 字节 | 变长字符串 |
TINYBLOB | 0-255字节 | 不超过 255 个字符的二进制字符串 |
TINYTEXT | 0-255字节 | 短文本字符串 |
BLOB | 0-65 535字节 | 二进制形式的长文本数据 |
TEXT | 0-65 535字节 | 长文本数据 |
MEDIUMBLOB | 0-16 777 215字节 | 二进制形式的中等长度文本数据 |
MEDIUMTEXT | 0-16 777 215字节 | 中等长度文本数据 |
LONGBLOB | 0-4 294 967 295字节 | 二进制形式的极大文本数据 |
LONGTEXT | 0-4 294 967 295字节 | 极大文本数据 |
ENUM('值1', '值2', '值3', …, '值n') #案例 #插入gender性别,只能是男女 CREATE TABLE my_enum (gender ENUM('male', 'female'));
#添加非空约束 ALTER TABLE yue_shu MODIFY age INT NOT NULL;
#添加默认约束 ALTER TABLE yue_shu MODIFY id INT DEFAULT 18;
#惟一约束 #保证数据表中字段的惟一性,即表中字段的值不能重复出现 #添加惟一约束 ALTER TABLE yue_shu add UNIQUE(id); #删除惟一约束 ALTER TABLE yue_shu DROP INDEX id; #查看惟一性约束 show keys from yue_shu; #复合惟一约束 删除同上面同样 #只有当两个字段同时发生重复时,插入记录失败 ALTER TABLE yue_shu add UNIQUE(id,name);
#主键约束至关于惟一约束和非空约束的组合, #要求被约束字段不容许重复, #也不容许出现NULL值, #每一个表最多只容许含有一个主键。 #主键约束 #添加主键约束 ALTER TABLE yue_shu MODIFY id int PRIMARY KEY; #删除主键约束 ALTER TABLE yue_shu DROP PRIMARY KEY;
#字段名 数据类型 AUTO_INCREMENT /* 一个表中只能有一个自动增加字段; 该字段的数据类型是整数类型; 必须定义为键,如UNIQUE KEY、PRIMARY KEY 若为自动增加字段插入NULL、0、DEFAULT或在插入时省略该字段,该字段就会使用自动增加值; 若插入的是一个具体值,则不会使用自动增加值。 自动增加值从1开始自增,每次加1。 若插入的值大于自动增加的值,则下次插入的自动增加值会自动使用最大值加1; 若插入的值小于自动增加值,则不会对自动增加值产生影响。 使用DELETE删除记录时,自动增加值不会减少或填补空缺。 自动增加删除并从新添加后,自动增加的初始值会自动设为该列现有的最大值加1。 在修改自动增加值时,修改的值若小于该列现有的最大值,则修改不会生效。 */ #给表设置自动增加 ALTER TABLE yue_shu MODIFY id INT UNSIGNED UNIQUE AUTO_INCREMENT; #删除自动增加 ALTER TABLE yue_shu MODIFY id INT UNSIGNED; #修改自动增加值 ALTER TABLE yue_shu AUTO_INCREMENT = 10;
#查看表结构 DESC yue_shu;
# 建立数据库,指定字符集为utf8,使用默认校对集utf8_general_ci CREATE DATABASE mydb_1 CHARACTER SET utf8; # 建立数据库,指定字符集为utf8,校对集为utf8_bin CREATE DATABASE mydb_2 CHARACTER SET utf8 COLLATE utf8_bin;
#复制表结构 create table new表 like old表 #复制表数据 INSERT into new表 SELECT * FROM old表;
#去除重复数据 select distinct 须要去重的字段名 from 表名;
#排序查询:asc为正序,desc为倒序 select * from student order by id desc ; #多个字段排序 #先根据age进行排序,再根据id进行排序 select * from student order by age asc,id desc; #中文排序convert(字段名 using gbk) select * from student order by convert(name using gbk) asc;
#限量,参数1是从下标几开始,参数2是读取几行数据 select * from student order by id desc LIMIT 10,5; #统计记录数 SELECT COUNT(id) FROM student;
#2020年03月24日21:36:13 #根据年龄统计出人数 #concat链接字符串 as重命名 where id不等于2的时候 SELECT CONCAT(age,'岁') as 年龄, COUNT(1) as 人数 FROM student_copy1 WHERE id<>2 GROUP BY age ORDER BY 2 desc
#根据班级进行分组,获取每一个班最大的年龄 SELECT Class as 班级, MAX(age) as 最大年龄 FROM student_copy1 GROUP BY Class ORDER BY 2 DESC
#多字段分组 select Class as 班级, CONCAT(age,'岁') as 年龄, COUNT(1) as 人数 FROM student_copy1 GROUP BY Class,age ORDER BY 3 desc
#回溯统计 ----就是对统计的结果加起来 select CONCAT(s.age,'岁') as 年龄, COUNT(1) as 人数 FROM student_copy1 s GROUP BY s.age WITH ROLLUP;
#统计筛选 ----也就是对分组完成的数据加条件 select CONCAT(age,'岁') as 年龄, COUNT(1) as 人数 FROM student_copy1 GROUP BY age having 人数>6
#求和统计 select CONCAT(age,'岁') as 年龄, SUM(age) as 求和 FROM student_copy1 GROUP BY 1 #平均值统计 select CONCAT(age,'岁') as 年龄, AVG(age) as 求平均 FROM student_copy1 GROUP BY 1 #求最大值统计 select CONCAT(age,'岁') as 年龄, MAX(id) as 求最大值 FROM student_copy1 GROUP BY 1 #求最小值统计 select CONCAT(age,'岁') as 年龄, MIN(id) as 求最小值 FROM student_copy1 GROUP BY 1 # GROUP_CONCAT 返回符合条件的参数字段值的链接字符串 也就是把全部能查找的数据都列出来 SELECT Class, GROUP_CONCAT(name) as 所有数据 from student_copy1 GROUP BY Class ORDER BY RAND()
函数名 | 描述 |
---|---|
CEIL(x) | 返回大于等于x的最小整数 |
FLOOR(x) | 返回小于等于x的最大整数 |
FORMAT(x,y) | 返回小数点后保留y位的x(进行四舍五入) |
ROUND(x[,y]) | 计算离x最近的整数;若设置参数y,与FORMAT(x,y)功能相同 |
TRUNCATE(x,y) | 返回小数点后保留y位的x(舍弃多余小数位,不进行四舍五入) |
ABS(x) | 获取x的绝对值 |
MOD(x,y) | 求模运算,与x%y的功能相同 |
函数名 | 描述 |
---|---|
PI() | 计算圆周率 |
SQRT(x) | 求x的平方根 |
POW(x,y) | 幂运算函数,计算x的y次方,与POWER(x,y)功能相同 |
RAND() | 默认返回0到1之间的随机数,包括0和1 |
#获取大于等于1且小于10的任意一个随机整数 #floor表明取整数 SELECT FLOOR(1 + RAND() * (10 - 1));
运算符 | 示例 |
---|---|
= | 用于相等比较 |
<=> | 能够进行NULL值比较的相等运算符 |
> | 表示大于比较 |
< | 表示小于比较 |
>= | 表示大于等于比较 |
<= | 表示小于等于比较 |
<>、!= | 表示不等于比较 |
BETWEEN…AND… | 比较一个数据是否在指定的闭区间范围内,若在则返回1,若不在 则返回0 |
运算符 | 示例 |
---|---|
BETWEEN…AND… | 比较一个数据是否在指定的闭区间范围内,若在则返回1,若不在 则返回0 |
NOT BETWEEN…AND… | 比较一个数据是否不在指定的闭区间范围内,若不在则返回1,若 在则返回0 |
IS | 比较一个数据是不是TRUE、FALSE或UNKNOWN,如果则返回1, 不然返回0 |
IS NOT | 比较一个数据是否不是TRUE、 FALSE或UNKNOWN,若不是则返 回1,不然返回0 |
IS NULL | 比较一个数据是不是NULL,如果则返回1,不然返回0 |
IS NOT NULL | 比较一个数据是否不是NULL,若不是则返回1,不然返回0 |
LIKE '匹配模式' | 获取匹配到的数据 |
NOT LIKE '匹配模式' | 获取匹配不到的数据 |
函数名 | 描述 |
---|---|
IN() | 比较一个值是否在一组给定的集合内 |
NOT IN() | 比较一个值是否不在一组给定的集合内 |
GREATEST() | 返回最大的一个参数值,至少两个参数 |
LEAST() | 返回最小的一个参数值,至少两个参数 |
ISNULL() | 测试参数是否为空 |
COALESCE() | 返回第一个非空参数 |
INTERVAL() | 返回小于第一个参数的参数索引 |
STRCMP() | 比较两个字符串 |
运算符 | 描述 |
---|---|
AND或 && | 逻辑与,操做数所有为真,则结果为1,不然为0 |
OR或 || | 逻辑或,操做数中只要有一个为真,则结果为1,不然为0 |
NOT或 ! | 逻辑非,操做数为0,则结果为1,操做数为1,则结果为0 |
XOR | 逻辑异或,操做数一个为真,一个为假,则结果为1;若操做数所有 为真或所有为假,则结果为0 |
MySQL中“=”是一个比较特殊的运算符,既能够用于比较数据是否相等,又能够表示赋值。所以,MySQL为了不系统分不清楚运算符“=”表示赋值仍是比较的含义,特地增长一个符号“:=”用于表示赋值运算。mysql
函数名 | 描述 | 示例 |
---|---|---|
BIT_COUNT(N) | 返回在参数N中设置的比特 位(二进制位为1)的数量 | SELECT BIT_COUNT(b'1011');结果为3 |
BIT_AND() | 按位返回与的结果 | SELECT BIT_AND(b1) FROM btable; 结果为0 |
BIT_OR() | 按位返回或的结果 | SELECT BIT_OR(b1) FROM btable;结果为7 |
BIT_XOR() | 按位返回异或的结果 | SELECT BIT_XOR(b1) FROM btable; 结果为5 |
运算符优先级能够理解为运算符在一个表达式中参与运算的前后顺序,优先级别越高,则越早参与运算;优先级别越低,则越晚参与运算。sql
运算符 |
---|
INTERVAL |
BINARY、COLLATE |
! |
-(一元,负号)、~(一元,按位取反) |
^ |
*、/、DIV、%、MOD |
-(相减运算符号)、+ |
<<、>> |
& |
| |
运算符 |
---|
=(比较运算符)、<=>、>=、>、<=、<、<>、!=、IS、LIKE、REGEXP、IN |
BETWEEN、CASE、WHEN、THEN、ELSE |
NOT |
AND、&& |
XOR |
OR、|| |
=(赋值运算符)、:= |
若要对联合查询的记录进行排序等操做,须要使用圆括号“()”包裹每个SELECT语句,在SELECT语句内或在联合查询的最后添加ORDER BY语句。而且若要排序生效,必须在ORDER BY后添加LIMIT限定联合查询排序的数量,一般推荐使用大于表记录数的任意值。数据库
#排序要加括号,而且加limit限定数量 (SELECT id, name FROM student_copy2 ORDER BY id ASC LIMIT 10) #联合查询---默认为去重复 ALL表明查询所有 UNION ALL (SELECT id, name FROM student_copy3 ORDER BY id DESC LIMIT 10);
交叉链接返回的结果是被链接的两个表中全部数据行的笛卡尔积。
例如,商品分类表中有3个字段,4条记录;商品表中有5个字段,10条商品信息,那么交叉链接后的笛卡尔积就等于4*10条记录数,每条记录中含有3+5个字段。数据结构
#交叉链接查询 SELECT * FROM student_copy2 CROSS JOIN student_copy3; #CROSS JOIN用于链接两个要查询的表。 #经过该语句能够查询两个表中全部的数据组合。
内链接是一种常见的链接查询,它根据匹配条件返回第1个表与第2个表全部匹配成功的记录。函数
#须要查找的,a是一张表,b是一张表 SELECT a.runoob_id, a.runoob_author, b.runoob_count #在runoob_tbl中查找 FROM runoob_tbl a #INNER JOIN----链接 tcount_tbl并指这张表为b ON能够理解为where当这两个字段相等时 INNER JOIN tcount_tbl b ON a.runoob_author = b.runoob_author;
它用于返回链接关键字(LEFT JOIN)左表中全部的记录,以及右表中符合链接条件的记录。测试
当左表的某行记录在右表中没有匹配的记录时,右表中相关的记录将设为空值。code
#左链接 ----根据左表查右表 SELECT a.runoob_id, a.runoob_author, b.runoob_count FROM runoob_tbl a LEFT JOIN tcount_tbl b ON a.runoob_author = b.runoob_author;
它用于返回链接关键字(RIGHT JOIN)右表(主表)中全部的记录,以及左表(从表)中符合链接条件的记录。排序
当右表的某行记录在左表中没有匹配的记录时,左表中相关的记录将设为空值。索引
#右链接 ----根据右表查右表 SELECT a.runoob_id, a.runoob_author, b.runoob_count FROM runoob_tbl a LEFT JOIN tcount_tbl b ON a.runoob_author = b.runoob_author;
在一个表表达中能够调用另外一个表表达式,这个被调用的表表达式叫作子查询(subquery),我么也称做子选择(subselect)或内嵌选择(inner select)。子查询的结果传递给调用它的表表达式继续处理。ci
#2020年04月02日22:59:19 #表子查询实例 #获取编号小于10的男性球员的号码 SELECT playerno FROM ( #拿到全部编号小于10的的球员的编号和性别 SELECT playerno, sex FROM players WHERE playerno < 10 ) as players10 #对拿到的临时表进行查询当性别等于男 WHERE sex = 'M'; #行子查询 select playerno #获取和100号球员性别相同而且居住在同一城市的球员号码。 SELECT playerno FROM players #对原表进行查询当性别等于临时表的性别城市等于临时表的城市 WHERE (sex, town) = #先找到这个100号球员的性别和城市 ( SELECT sex, town FROM players WHERE playerno = 100 ); #标量子查询实例 #获取和27号球员出生在同一年的球员的号码 SELECT PLAYERNO FROM players #当年龄等于临时表的年龄 WHERE YEAR(BIRTH_DATE) = ( #获取年龄 SELECT year(BIRTH_DATE) FROM players #当编号等于27 WHERE PLAYERNO = 27 ) #获取编号除了27号球员的 AND playerno <> 27; #列子查询实例 #获取球员性别为女的全部球员的球员号,名字及所在城市。 /* IN:在指定项内,同 IN(项1,项2,…)。 ANY:与比较操做符联合使用,ANY关键字必须接在一个比较操做符的后面,表示与子查询返回的任何值比较为 TRUE ,则返回 TRUE 。 SOME:ANY 的别名,较少使用。 ALL:与比较操做符联合使用,ALL关键字必须接在一个比较操做符的后面,表示与子查询返回的全部值比较都为 TRUE ,则返回 TRUE 。 */ #展现球员号,姓名,城市当编号为里面的 SELECT PLAYERNO, name, TOWN FROM players WHERE PLAYERNO IN ( #展现全部性别为女的球员号 SELECT PLAYERNO FROM players WHERE sex = 'F' ); #获取至少比同城的另外一球员年轻的全部球员的号码,日期和居住城市。 SELECT playerno, birth_date, town FROM players p1 WHERE birth_date > ANY ( SELECT birth_date FROM players p2 WHERE p1.town = p2.town ); #获取最老球员的号码,名字及生日。(即出生日期数值小于或等于全部其它球员的球员) SELECT playerno, name, birth_date FROM players WHERE birth_date <= ALL ( SELECT birth_date FROM players );
外键指的是在一个表中引用另外一个表中的一列或多列,被引用的列应该具备主键约束或惟一性约束,从而保证数据的一致性和完整性。
参数名称 | 功能描述 |
---|---|
RESTRICT | 默认值。拒绝主表删除或修改外键关联字段 |
CASCADE | 主表中删除或更新记录时,同时自动删除或更新从表中对应的记录 |
SET NULL | 主表中删除或更新记录时,使用NULL值替换从表中对应的记录。 (不适用于NOT NULL字段) |
NO ACTION | 与默认值RESTRICT相同,拒绝主表删除或修改外键关联字段 |
SET DEFAULT | 设默认值,但InnoDB目前不支持 |
CREATE TABLE student3 ( id int UNSIGNED PRIMARY KEY AUTO_INCREMENT COMMENT 'ID', name varchar(32) COMMENT '姓名', /*关键字CONSTRAINT用于定义外键约束的名称,若是省略,MYSQL将会自动生成一个名字。,表示一致性,FOREIGN KEY表示是外键,(room_id)表示的是外键名称列表,REFERENCES参考 room(id) room是主表,id是约束字段 on delete表明它的删除权限,on update表明更新权限*/ room_id int, CONSTRAINT fk_room FOREIGN KEY (room_id) REFERENCES room (id) ON DELETE RESTRICT ON UPDATE CASCADE )
更新表时的外键语法
ALTER TABLE student3 ADD CONSTRAINT fk_room FOREIGN KEY (room_id) REFERENCES room (id) ON DELETE RESTRICT ON UPDATE CASCADE;
关联表操做
对于已创建外键约束的关联数据表来讲,若要对主表执行删除操做,从表将按照其创建外键约束时设置的ON DELETE参数自动执行相应的操做。
ALTER TABLE student3 drop foreign key fk_room;