整数型
类型 | 大小 | 范围(有符号) | 范围(无符号) | 用途 |
---|---|---|---|---|
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 233 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的值 | 小数值 |
日期&时间
类型 | 大小 | 范围 | 格式 | 用途 |
---|---|---|---|---|
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-01-19 | YYYYMMDD HHMMSS | 混合日期和时间值,时间戳 |
字符串
类型 | 大小 | 用途 |
---|---|---|
CHAR | 0-255 | 定长字符串 |
VARCHAR | 0-65535 | 变长字符串 |
TINYBLOB | 0-255 | 不超过255个字符的二进制字符串 |
TINYTEXT | 0-255 | 短文本字符串 |
BLOB | 0-65535 | 二进制形式的长文本数据 |
TEXT | 0-65535 | 长文本数据 |
MEDIUMBLOB | 0-167777215 | 二进制形式的中等长度文本数据 |
MEDIUMTEXT | 0-167777215 | 中等长度文本数据 |
LONGBLOG | 0-4294967295 | 二进制形式极大文本数据 |
LONGTEXT | 0-4294967295 | 极大文本数据 |
行:记录
列:字段
/*创建数据库*/
CREATE DATABASE [ IF NOT EXISTS ] db_name (CHARACTER SET = charset_name);
/*修改数据库编码*/
ALTER DATABASE db_name CHARACTER SET = charset_name;
/*查看数据库相关信息*/
SHOW CREATE DATABASE db_name;
/*删除数据库*/
DROP DATABASE db_name;
/*查看所有数据库列表*/
SHOW DATABASES;
/*展示警告信息*/
SHOW WARNINGS;
/*打开数据库*/
USE db_name;
/*查看当前数据库*/
SELECT DATABASE();
/*创建数据表*/
CREATE TABLE [IF NOT EXISTS] tabel_name(
column_name data_type1 [NULL], //该字段可为空,默认
column_name data_type2 [ NOT NULL], //字段不能为空
···
);
/*查看数据表*/
SHOW TABLES FROM db_name;
/*查看数据表的结构*/
SHOW COLUMNS FROM tb_name;
/*插入记录*/
INSERT table_name [(col_name,···)] VALUES(val,···);
/*查找全部记录*/
SELECT * FROM table_name;
AUTO_INCREMENT
例:
CREATE TABLE tb(
id SMALLINT PRIMARY KEY,
name VARCHAR(10) UNIQUE,
sex ENUM('male','female') DEFAULT male
)
eg:
CREATE TABLE provinces (
id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20),
)
CREATE TABLE users(
id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
pname VARCHAT(10),
pid SMALLINT UNSIGNED,
FOREIGN KEY (pid) REFERENCES provinces (id)
)
/*查看表是否有索引*/
SHOW INDEXS FROM table_name;
ALTER TABLE table_name ADD column_name column_definition [FIRST / AFTER column_name];
/*在name列后面添加password列*/
ALTER TABLE users ADD password CARCHAR(16) NOT NULL AFTER name;
注释:添加多列时需要加括号,将每列隔开,且不能指定位置(默认加在最后)
/*添加主键约束*/
ALTER TABLE table_name ADD PRIMARY KEY (column_name);
/*添加唯一约束*/
ALTER TABLE table_name ADD UNIQUE KEY (column_name,...);
/*添加外键约束*/
ALTER TABEL table_name ADD [CONSTRAINT [symbol]] FOREIGN KEY (column_name) REFERENCES table_name2 (column_name2);
/*添加 or 删除默认约束*/
ALTER TABLE table_name ALTER column_name SET DEFAULT default_value;
ALTER TABLE table_name ALTER column_name DROP DEFAULT;
/*删除主键约束*/
ALTER TABLE table_name DROP PRIMARY KEY;
/*删除唯一约束*/
ALTER TABLE table_name DROP KEY column_name;
/*删除外键约束*/
ALTER TABLE table_name DROP FOREIGN KEY fk_symbol;
/*可通过查看表信息得到外键约束名称 constraint:fk_symbol,默认tabname_ibfk_1;*/
/*删除外键残余的索引*/
ALTER TABLE table_name DROP INDEX index_name;
/*修改列定义*/
ALTER TABLE table_name MODIFY column_name column_definition [FIRST / AFTER column_name2]
/*修改列名称*/
ALTER TABLE table_name CHANGE column_name new_column_name column_definition [FIRST / AFTER column_name2]
/*重命名表*/
ALTER TABLE table_name RENAME new_table_name;
RENAME TABLE table_name TO new_table_name [, table_name2 TO table_name2...];
INSERT table_name [(column_name1,...)] VALUES(value1,value2...),(...)...;
/*一次只能插入一条记录,可用子查询 SubQuery*/
INSERT table_name SET column_name1=value1,...;
/*此方法可将查询结果插入数据表中*/
INSERT table_name [(col_name1,...)] SELECT...;
注:若列为AUTO_INCREMENT,则值设为NULL或DEFAULT;
UPDATE tab_reference SET col_name = expr / default [,col_name2=...] [WHERE where_condition]
e.g
UPDATE tab_reference SET age = age+10,sex=male;
UPDATE tab_reference SET age = id+age WHERE id%2=0;
DELETE FROM tab_name WHERE where_condition; //若不添加条件,则删除全部记录
一般格式
SELECT [ALL|DISTINCT] <目标列表表达式>
FROM <表或视图>|<SELECT 语句> [AS 别名]
[WHERE <条件表达式>]
[GROUP BY <列名1>] [HAVING <条件表达式>]
[ORDER BY <列名2> [ASC|DESC]]
eg:
SELECT id,name FROM users;
SELECT users.id,user.name FROM users;
SELECT id AS usersID FROM users;
/*按照某列队查询结果分组,或者按位置分组,ASC升序,DESC降序*/
SELECT col_name FROM tab_name GROUP BY col_name1/position [ASC/DESC];
/* 对分组进行选择, 相当与 where, 但 where 在 group 前 */
HAVING where_condition // 条件字段应该出现在查询列中或者条件式为聚合函数
eg:
SELECT sex,age FROM users GROUP BY 1 HAVING age>35;
SELECT sex,age FROM users GROUP BY 1 HAVING count(id)>10;
SELECT __ FROM __ ORDER BY col-name/expr/position [ASC/DESC];
SELECT * FROM users ORDER BY age,id DESC; //按照age-id降序
SELECT * FROM users LIMIT 3; //只显示前3条
SELECT * FROM users LIMIT 2,3; //只显示查询结果的第3~5条
注:mysql个数计数从0开始
INSERT tab_name (col_name1,...) SELECT (col_name_1,...) FROM tab_name2 WHERE ____ ;
/**/
INSERT users2 (name) SELECT username FROM users WHERE age>20;
运算符:=、>、<、>=、<=、<>、!=、<=>
语法结构: operand comparison_operator subquery
/*查询出高于平均价格的商品*/
SELECT goods_id,goods_name,goods_price FROM tdb_goods WHERE goods_price > (SELECT ROUND(AVG(goods_price),2) FROM tdb_goods);
//ROUND(X,2)x保留两位小数,AVG(x)对x求平均值。
关键字:ANY、SOME、ALL
/*查询到的商品价格大于超级本的最低价*/
SELECT goods_name,goods_price FROM tdb_goods WHERE goods_price > ANY (SELECT goods_price FROM tdb_goods WHERE goods_cate='超级本');
/*查询到的商品价格大于超级本的最高价*/
SELECT goods_name,goods_price FROM tdb_goods WHERE goods_price > ALL (SELECT goods_price FROM tdb_goods WHERE goods_cate='超级本');
语法结构:operand comparison_operator [NOT] IN (subquery)
如果子查询返回结果,EXISTS将返回TRUE;否则返回FALSE
将查询结果写入数据表
INSERT tbl_name [(col_name,…)] SELECT …
UPDATE teble_references
SET col_name1=expr
WHERE where_condition;
其中多表关系table_references为
table_name1 连接类型 table_2 ON conditional_ecpr
连接类型
例:
/*把表tdb_goods_cates中cate_name与tdb_goods中goods_cate相对应的部分,用cate_id代替goods_cate*/
UPDATE tdb_goods INNER JOIN tdb_goods_cate ON goods_cate=cate_name
SET goods_cate = cate_id;
/*创建的同时将查询的记录插入到新表中*/
CREATE TABLE tdb_goods_brands(
brand_id SMALLINT UNSIGNED PRIMARY AUTO_INCREMENT,
brand_name VARCHAR(30) NOT NULL
)
SELECT brand_name FROM tdb_goods GROUP BY brand_name;
SELECT tdb_goods_name,tdb_goods_cate,tdb_goods_price FROM tdb_goods AS g
INNER JOIN tdb_goods_cates AS c ON g.cate_id = c.cate_id
INNER JOIN tdb_goods_Brands AS b ON g.brand_id = b.brand_id;
/*必须使用别名,得到的结果用名称代替 parent_id*/
SELECT s.type_id,type_name,p.type_name FROM tdb_goods_types AS s JOIN tdb_goods_types AS p ON s.parent_id = p.type_id;
/**显示(直接)子类数量/
SELECT p.type_id,p.type_name,count(s.type_name) AS children_count FROM tdb_goods_types AS p LEFT JOIN tdb_goods_types AS s ON s.parent_id = p.type_id GROUP BY p.type_id;
DELETE tbl_name1[.* ] [,tbl_name.* ]…
FROM table_references
[ WHERE where_condition ]
/*复制记录*/
INSERT tdb_goods(goods_name,cate_id,brand_id) SELECT goods_name,cate_id,brand_id FROM tdb_goods WHERE goods_id IN (19,20);
/*查找重复记录*/
SELECT goods_id,goods_name FROM tdb_goods GROUP BY goods_name HAVING count(goods_name) >= 2;
/*删除一个表中重复的记录*/
DELETE t1 FROM tdb_goods AS t1 LEFT JOIN (SELECT goods_id,goods_name FROM tdb_goods GROUP BY goods_name HAVING count(goods_name) >= 2 ) AS t2 ON t1.goods_name = t2.goods_name WHERE t1.goods_id > t2.goods_id;
函数名称 | 描述 | 用法 |
---|---|---|
CONCAT() | 字符连接 | CONCAT('a','-','b' ) =a-b ,参数数量不定 |
CONCAT_WS() | 使用指定的分隔符进行字符连接 | CONCAT_WS(‘分隔符’, , …) |
FORMAT() | 数字格式化 | FORMAT(1234.134,2) =1,234.13 (确定小数位,产生千分位逗号) |
LOWER() | 转换成小写字母 | LOWER('MYSQL') =mysql |
UPPER() | 转换成大写字母 | |
LEFT() | 获取左侧字符 | LEFT('MYSQL', 2) =MY |
RIGHT() | 获取右侧字符 | |
LENGTH() | 获取字符长度 | LENGTH('MY SQL') =6,(空格也算) |
LTRIM() | 删除前导空格 | LTRIM(' MYS QL') =MYS QL |
RTRIM() | 删除后续空格 | RTRIM(' MYS QL ') =_MYS QL |
TRIM() | 删除前导和后续空格 | TRIM(' MY SQL ') =MY SQL |
SUBSTRING() | 字符串截取 | SUBSTRING('MYSQL', 1, 2) =MY , SUBSTRING('MYSQL', 2) =SQL , 位置负值表示从后面取 |
[NOT] LIKE | 模式匹配 | %表示任意多个字符, _表示任意一个字符 |
REPLACE() | 字符串 | REPLACE('?MYS??QL?', '?', '') =MYSQL |
TRIM 拓展
/*删除自定义前导字符*/
SELECT TRIM(LEADING '?' FROM '??MYS?QL?' ; /*结果为 MYS?QL?*/
/*删除自定义后续字符*/
SELECT TRIM(TRAILING '?' FROM '??MYS?QL?' ; /*结果为 ??MYS?QL*/
/*删除自定义前导和后续字符*/
SELECT TRIM(BOTH '?' FROM '??MYS?QL?' ; /*结果为 ??MYS?QL*/
/*查找test中first_name字段包含字母o的记录*/
SELECT * FROM test WHERE first_name LIKE '%o%';
/*查找test中first_name字段包含%的记录*/
SELECT * FROM test WHERE first_name LIKE '%1%%' ESCAPE '1';
函数名称 | 描述 | 用法 |
---|---|---|
CEIL() | 进一取整 | SELECT CEIL(3.01); =4 |
DIV | 整数除法 | SELECT 3 DIV 4; =0 |
FLOOR() | 舍一取整 | SELECT CEIL(3.99); =3 |
MOD | 取余数(取模) | SELECT 5.3 MOD 3; =2.3 |
POWER() | 幂运算 | SELECT POWER(2,3); =8 |
ROUND() | 四舍五入 | SELECT ROUND(3.65, 1); =3.7 |
TRUNCATE() | 数字截取(不四舍五入) | SELECT TRUNCATE(125.89, 0) =125.8 取负数: (125.89, -1) =120 |
函数名称 | 描述 | 用法 |
---|---|---|
[NOT]BETWEEN x AND y | 是否在数字x与y之间 | SELECT 35 BETWEEN 1 AND 40; =1 |
[NOT] IN() | 是否在列出值范围内 | SELECT 10 IN(5,10,15,20); =1 |
IS [NOT] NULL | 是否为空 | SELECT '' IS NULL; =0 |
函数名称 | 描述 | 用法 |
---|---|---|
NOW() | 当前日期和时间 | |
CURDATE() | 当前日期 | |
CURTIME() | 当前时间 | |
DATE_ADD() | 日期变化 | SELECT DATE_ADD('2018-6-2',INTERVAL 365 DAY); =2019-6-2 也可写成- 3 WEEK |
DATEDIFF() | 日期差值 | SELECT DATEDIFF('2018-6-2','2019-6-2'); =-365 |
DATE_FORMAT() | 日期格式化 | SELECT DATE_FORMAT('2018-6-2','%m/%d/%Y'); =06/02/2018 |
函数名称 | 描述 | 用法 |
---|---|---|
CONNECTION_ID() | 连接ID | |
DATABASE() | 当前数据库 | |
LAST_INSERT_ID() | 最后插入记录的ID号 | 当最后一次同时输入多个时,取第一个 |
USER() | 当前用户 | |
VERSION() | 版本信息 |
函数名称 | 描述 | 用法 |
---|---|---|
AVG() | 平均值 | SELECT ROUND(AVG(goods_price),2) AS avg_price FROM tdb_goods; |
COUNT() | 计数 | SELECT COUNT(goods_id) as counts FROM tdb_goods; |
MAX() | 最大值 | ELECT MAX(goods_price) as counts FROM tdb_goods; |
MIN() | 最小值 | |
SUM() | 求和 | SELECT SUM(goods_price) as counts FROM tdb_goods; |
函数名称 | 描述 | 用法 |
---|---|---|
MD5() | 信息摘要算法,一般用于web密码 | SELECT MD5('root') 得到32位的数 |
PASSWORD() | 密码算法,可以改密码 | SET PASSWORD=PASSWORD(‘adimit’); |
创建自定义函数
CREATE FUNCTION function_name
RETURNS {STRING/ INTEGER/ REAL/ DECIMAL} routine_body
关于函数体
创建无参函数
CREATE FUNCTION f1() RETURNS VARCAHR(30)
RETURN DATE_FORMAT((NOW(),'%Y年%m月%d日 %H点%i分%s秒');
SELECT f1();
创建带参函数
CREATE FUNCTION f2(num1 SMALLINT UNSIGNED,num2 SMALLINT UNSIGNED)
RETURNS FLOAT(10,2) UNSIGNED
RETURN (num1+num2)/2;
复合结构的函数体
/* 需要同时执行多条语句,要把结束符号改掉,否则遇到';'就直接结束了 */
DELIMITER //
/*创建复合结构函数体,功能为在user表格中插入一条记录,并返回其id*/
CREATE FUNCTION ADD_USER(username VARCHAR(20))
RETURNS INT UNSIGNED
BEGIN
INSERT user(username) VALUES(username);
RETURN LAST_INSERT_ID();
END//
/*begin 和 end 中间执行多条语句*/
存储过程:是SQL语句和控制语句的预编译集合,以一个名称存储并作为一个单元处理(类似函数)。存储过程存储在数据库内,可以由应用程序调用执行,而且允许用户申明变量以及进行流程控制。存储过程可以接受输入类型的参数和输出类型的参数,并且可以存在多个返回值。只在第一次调用时进行语法分析和编译,以后的调用直接调用编译的结果,效率大大提高。
优点:
CREATE
[DEFINER = user / CURRENT_USER]
PROCEDURE sp_NAME([proc_parameter[,..])
[characteristic ...] routine_body
proc_parameter:
IN / OUT / INOUT param_name type
参数
过程体
/*无参存储过程*/
CREATE PROCEDURE guocheng() SELECT VERSION();
/*调用*/
CALL guocheng();
/*有IN类型参数存储过程*/
CREATE PROCEDURE removeGoodsById(IN id INT UNSINGNED)
DELETE FROM tdb_goods WHERE goods_id = id;
CALL removeGoodsById(23);
/*带有IN和OUT类型参数, 删除传入id记录并返回剩余数量,*/
DELIMITER //
CREATE PROCEDURE removeByIdReturnNumber(IN id INT UNSIGNED, OUT nums UNSIGNED)
BEGIN
DELETE FROM tdb_goods WHERE goods_id = id;
SELECT COUNT(tdb_goods) FROM tdb_goods INTO nums;
END//
DELIMITER ;
CALL removeByIdReturnNumber(20, @num);
SELECT @num; /*输出结果*/
/*删除并返回删除的数量和剩余数量*/
DELIMITER //
CREATE PROCEDURE RemoveCateReturnInfo(IN id SMALLINT UNSIGNED, OUT delNum INT UNSIGNED, OUT remainNum INT UNSIGNED)
BEGIN
DELECT FROM tdb_name WHERE cate_id = id;
SELECT ROW_COUNT() INTO delNum;
SELECT COUNT(goods_id) fROM tdb_goodsINTO remainNum;
END //
DELIMITER ;
CALL removeCateReturnInfo(6,@del,@rem);
SELECT @del,@rem;
声明变量
DECLARE @a INT;
只能在BEGIN…END中声明局部变量,且只能写在第一行
SET @a = 7;
用户变量,(类似全局变量)
定义: MySQL可以将数据以不同的技术存储在文件(内存)中。
特点 | MyISAM | InnoDB | Memory | Archive |
---|---|---|---|---|
存储限制 | 246TB | 64TB | 有 | 无 |
事务安全 | - | 支持 | - | |
支持索引 | 支持 | 支持 | 支持 | |
锁颗粒 | 表锁 | 行锁 | 表锁 | 行锁 |
数据压缩 | 支持 | - | - | 支持 |
支持外键 | - | 支持 | - |