MySQL初探

慕课网http://www.imooc.com/learn/122 课程学习笔记

修改MySQL提示符

shell>mysql --prompt 提示符

mysql>prompt 提示符

提示符参数: \D 日期 \d 数据库名称 \h 当前数据库 \u 当前用户

常用命令

关键字与函数名称全部大写

数据库名称、表名称、字段名称全部小写

SQL语句必须以分号结尾

创建数据库

CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name [DEFAULT] CHARACTER SET [=] charset_name;

查看数据库

SHOW {DATABASES | SCHEMAS} [LIKE ‘pattern‘ | WHERE  expr];

修改数据库

ALTER {DATABASE | SCHEMA} [db_name] [DEFAULT] CHARECTER SET [=] charset_name;

删除数据库

DROP {DATABASE | SCHEMA} [IF EXISTS] db_name;

数据类型

整型:TINYINT SMALLINT MEDIUMINT INT BIGINT

浮点型:FLOAT[(M,D)] DOUBLE[(M,D)] M总位数 D小数位数

日期:YEAR TIME DATE DATETIME TIMESTAMP (用得少 直接用数字存储)

字符型:CHAR(M)定长 VARCHAR(M) TINYTEXT TEXT MEDIUMTEXT LONGTEXT ENUM(‘value1‘, ‘value2‘)枚举值选择一个 SET(‘value1‘,‘value2‘) 设置成员任意选择个数

行 记录

列 字段

打开数据库

USE db_name;

创建数据表

CREATE TABLE [IF NOT EXISTS] table_name (column_name data_type, ... );

查看数据表

SHOW TABLES [FROM db_name] [like ‘pattern‘|WHERE expr];

查看数据表结构

SHOW COLUMNS FROM tbl_name;

插入记录

INSERT [INTO] tbl_name [(col_name,...)] VALUES(val,...);

可以省略列名 若省略则每一列都必须赋值

查看记录

SELECT expr,... FROM tbl_name;

约束

为了保证数据的完整性和一致性

表级约束和列级约束

NULL or NOT NULL 设置是否能为空

AUTO_INCREMENT 自动编号且必须与主键组合使用 默认起始值为1,每次的增量为1

PRIMARY KEY 主键

UNIQUE KEY 唯一约束一站表可以有很多

DEFAULT 默认

FIREIGN KEY 保证数据一致性,完整性,实现一对一一对多关系

要求父表和子表必须使用相同的存储引擎InnoDB,禁止使用临时表;

外键列和参照列必须具有相似的数据类型;

外检列和参照咧必须创建索引。

FOREIGN KEY (pid) REFERENCES provinces (id)

外键约束的参照操作 只能在InnoDB引擎下操作 更通常通过逻辑外键来实现。

CASCADE:从父表删除或更新且自动删除或更新子表中匹配的行

SET NULL:从父表删除或更新行,并设置自表中的外键列为NULL。如果使用该项,必须保证子表列没有设定NOT NULL

RESTRICT:拒绝对父表的删除或更新操作

NO ACTION:标准SQL的关键字,在MySQL中与RESTRICT相同。

列级约束:单个数据列 可随后声明

表级约束:多个数据列 只能在列定义以后声明

修改单列

ALTER TABLE tbl_name ADD [COLUMN] col_name column_definition [FIRST|AFTER col_name];

ALTER TABLE tbl_name ADD [COLUMN] (col_name column_definition,..);

# 添加多列的时候只能添加在数据表末尾

ALTER TABLE tbl_name DROP [COLUMN] col_name;

多个操作用,隔开

修改主键约束

ALTER TABLE tbl_name ADD [CONSTRAINT [symbol]] PRIMARY KEY [index_type] (index_col_name);

DROP TABLE tbl_name DROP PRIMARY KEY;

修改唯一约束

ALTER TABLE tbl_name ADD [CONSTRAINT [symbol]] UNIQUE [INDEX|KEY] [index_name] [index_type] (index_col_name,...);

ALTER TABLE tbl_name DROP {INDEX | KEY} index_name;

修改外键约束

ALTER TABLE tbl_name ADD [CONSTRAINT [symbol]] FOREIGN KEY [index_name] (index_col_name) reference_definition;

ALTER TABLE tbl_name DROP FOREIGN KEY fk_symbol;

修改默认约束

ALTER TABLE tbl_name ADD [COLUMN] col_name {SET DEFAULT literal | DROP DEFAULT]

修改列定义

ALTER TABLE tbl_name MODIFY [COLUMN] col_name column_definition [FIRST | AFTER col_name];

ALTER TABLE tbl_name CHANGE [COLUMN] old_col_name new_col_name column_definition [FIRST | AFTER col_name];

修改数据表名称

ALTER TABLE tbl_name RENAME [TO | AS] new_tbl_name;

RENAME TABLE tbl_name TO new_tbl_name;

插入记录

INSERT [INTO] tbl_name [(col_name,...)] {VALUES | VALUE} ({expr | DEFAULT},...),(...),...;

# 自动编号的列数可以用NULL和DEFAULT关键字替代;

INSERT [INTO] tbl_name SET col_name={expr | DEFAULT};

# 与上种方法区别在于可以使用子查询

INSERT [INTO] tbl_name [(col_name,...)] SELECT

# 可以把查询结果插入到制定数据表

更新记录(单表更新)

UPDATE [LOW_PRIORITY] [IGNORE] table_reference SET col_name1={expr1 | DEFAULT} [,col_name2={expr1 | DEFAULT}... [WHERE where_condition];

删除记录(单表删除)

DELETE FROM tbl_name [WHERE where_condition];

查找记录

SELECT select_expr [,select_expr]

[

FROM table_references

[WHERE where_condition]

[GROUP BY {col_name | position} [ASC | DESC],...]

[HAVING where_condition]

[ORDER BY {col_namee | expr | position} [ASC | DESC],...]

[LIMIT {[offset,] row_count | row_count OFFSET offset}]

]

SELECT语句中,字段的顺序将会影响结果集的顺序,字段的别名会影响结果集的名字(别名时加上AS)



子查询

子查询嵌套在查询内部,且必须始终出现在圆括号内

子查询可以包含多个关键字或条件,如DISTINCT, GROUP BY, ORDER BY, LIMIT, 函数等

子查询的外层查询可以是SELECT, INSERT, UPDATE, SET或DO.

1.子查询是指在另一个查询语句中的SELECT子句。

例句:

SELECT * FROM t1 WHERE column1 = (SELECT column1 FROM t2);

其中,SELECT * FROM t1 ...称为Outer Query[外查询](或者Outer Statement),

SELECT column1 FROM t2 称为Sub Query[子查询]。

所以,我们说子查询是嵌套在外查询内部。而事实上它有可能在子查询内部再嵌套子查询。

子查询必须出现在圆括号之间。

行级子查询

SELECT * FROM t1 WHERE (col1,col2) = (SELECT col3, col4 FROM t2 WHERE id = 10);

SELECT * FROM t1 WHERE ROW(col1,col2) = (SELECT col3, col4 FROM t2 WHERE id = 10);

行级子查询的返回结果最多为一行。

优化子查询

-- 创建数据表

CREATE TABLE IF NOT EXISTS tdb_goods(

goods_id    SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,

goods_name  VARCHAR(150) NOT NULL,

goods_cate  VARCHAR(40)  NOT NULL,

brand_name  VARCHAR(40)  NOT NULL,

goods_price DECIMAL(15,3) UNSIGNED NOT NULL DEFAULT 0,

is_show     BOOLEAN NOT NULL DEFAULT 1,

is_saleoff  BOOLEAN NOT NULL DEFAULT 0

);

-- 写入记录

INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES(‘R510VC15.6英寸笔记本‘,‘笔记本‘,‘华硕‘,‘3399‘,DEFAULT,DEFAULT);

INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES(‘Y400N14.0英寸笔记本电脑‘,‘笔记本‘,‘联想‘,‘4899‘,DEFAULT,DEFAULT);

INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES(‘G150TH15.6英寸游戏本‘,‘游戏本‘,‘雷神‘,‘8499‘,DEFAULT,DEFAULT);

INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES(‘X550CC15.6英寸笔记本‘,‘笔记本‘,‘华硕‘,‘2799‘,DEFAULT,DEFAULT);

INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES(‘X240(20ALA0EYCD) 12.5英寸超极本‘,‘超级本‘,‘联想‘,‘4999‘,DEFAULT,DEFAULT);

INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES(‘U330P13.3英寸超极本‘,‘超级本‘,‘联想‘,‘4299‘,DEFAULT,DEFAULT);

INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES(‘SVP13226SCB 13.3英寸触控超极本‘,‘超级本‘,‘索尼‘,‘7999‘,DEFAULT,DEFAULT);

INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES(‘iPad mini MD531CH/A 7.9英寸平板电脑‘,‘平板电脑‘,‘苹果‘,‘1998‘,DEFAULT,DEFAULT);

INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES(‘iPad Air MD788CH/A 9.7英寸平板电脑 (16G WiFi版)‘,‘平板电脑‘,‘苹果‘,‘3388‘,DEFAULT,DEFAULT);

INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES(‘ iPad mini ME279CH/A 配备 Retina 显示屏 7.9英寸平板电脑 (16G WiFi版)‘,‘平板电脑‘,‘苹果‘,‘2788‘,DEFAULT,DEFAULT);

INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES(‘IdeaCentre C340 20英寸一体电脑 ‘,‘台式机‘,‘联想‘,‘3499‘,DEFAULT,DEFAULT);

INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES(‘Vostro 3800-R1206 台式电脑‘,‘台式机‘,‘戴尔‘,‘2899‘,DEFAULT,DEFAULT);

INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES(‘iMac ME086CH/A 21.5英寸一体电脑‘,‘台式机‘,‘苹果‘,‘9188‘,DEFAULT,DEFAULT);

INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES(‘AT7-7414LP 台式电脑 (i5-3450四核 4G 500G 2G独显 DVD 键鼠 Linux )‘,‘台式机‘,‘宏碁‘,‘3699‘,DEFAULT,DEFAULT);

INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES(‘Z220SFF F4F06PA工作站‘,‘服务器/工作站‘,‘惠普‘,‘4288‘,DEFAULT,DEFAULT);

INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES(‘PowerEdge T110 II服务器‘,‘服务器/工作站‘,‘戴尔‘,‘5388‘,DEFAULT,DEFAULT);

INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES(‘Mac Pro MD878CH/A 专业级台式电脑‘,‘服务器/工作站‘,‘苹果‘,‘28888‘,DEFAULT,DEFAULT);

INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES(‘ HMZ-T3W 头戴显示设备‘,‘笔记本配件‘,‘索尼‘,‘6999‘,DEFAULT,DEFAULT);

INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES(‘商务双肩背包‘,‘笔记本配件‘,‘索尼‘,‘99‘,DEFAULT,DEFAULT);

INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES(‘X3250 M4机架式服务器 2583i14‘,‘服务器/工作站‘,‘IBM‘,‘6888‘,DEFAULT,DEFAULT);

INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES(‘玄龙精英版 笔记本散热器‘,‘笔记本配件‘,‘九州风神‘,‘‘,DEFAULT,DEFAULT);

INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES(‘ HMZ-T3W 头戴显示设备‘,‘笔记本配件‘,‘索尼‘,‘6999‘,DEFAULT,DEFAULT);

INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES(‘商务双肩背包‘,‘笔记本配件‘,‘索尼‘,‘99‘,DEFAULT,DEFAULT);

-- 求所有电脑产品的平均价格,并且保留两位小数,AVG,MAX,MIN、COUNT、SUM为聚合函数

SELECT ROUND(AVG(goods_price),2) AS avg_price FROM tdb_goods;

-- 查询所有价格大于平均价格的商品,并且按价格降序排序

SELECT goods_id,goods_name,goods_price FROM tdb_goods WHERE goods_price > 5845.10 ORDER BY goods_price DESC;

-- 使用子查询来实现

SELECT goods_id,goods_name,goods_price FROM tdb_goods

WHERE goods_price > (SELECT ROUND(AVG(goods_price),2) AS avg_price FROM tdb_goods)

ORDER BY goods_price DESC;

-- 查询类型为“超记本”的商品价格

SELECT goods_price FROM tdb_goods WHERE goods_cate = ‘超级本‘;

-- 查询价格大于或等于"超级本"价格的商品,并且按价格降序排列

SELECT goods_id,goods_name,goods_price FROM tdb_goods

WHERE goods_price = ANY(SELECT goods_price FROM tdb_goods WHERE goods_cate = ‘超级本‘)

ORDER BY goods_price DESC;

-- = ANY 或 = SOME 等价于 IN

SELECT goods_id,goods_name,goods_price FROM tdb_goods

WHERE goods_price IN (SELECT goods_price FROM tdb_goods WHERE goods_cate = ‘超级本‘)

ORDER BY goods_price DESC;

-- 创建“商品分类”表

CREATE TABLE IF NOT EXISTS tdb_goods_cates(

cate_id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,

cate_name VARCHAR(40)

);

-- 查询tdb_goods表的所有记录,并且按"类别"分组

SELECT goods_cate FROM tdb_goods GROUP BY goods_cate;

-- 将分组结果写入到tdb_goods_cates数据表

INSERT tdb_goods_cates (cate_name) SELECT goods_cate FROM tdb_goods GROUP BY goods_cate;

-- 通过tdb_goods_cates数据表来更新tdb_goods表

UPDATE tdb_goods INNER JOIN tdb_goods_cates ON goods_cate = cate_name

SET goods_cate = cate_id ;

-- 通过CREATE...SELECT来创建数据表并且同时写入记录

-- SELECT brand_name FROM tdb_goods GROUP BY brand_name;

CREATE TABLE tdb_goods_brands (

brand_id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,

brand_name VARCHAR(40) NOT NULL

) SELECT brand_name FROM tdb_goods GROUP BY brand_name;

-- 通过tdb_goods_brands数据表来更新tdb_goods数据表(错误)

UPDATE tdb_goods  INNER JOIN tdb_goods_brands ON brand_name = brand_name

SET brand_name = brand_id;

-- Column ‘brand_name‘ in field list is ambigous

-- 正确

UPDATE tdb_goods AS  g  INNER JOIN tdb_goods_brands AS b ON g.brand_name = b.brand_name

SET g.brand_name = b.brand_id;

-- 查看tdb_goods的数据表结构

DESC tdb_goods;

-- 通过ALTER TABLE语句修改数据表结构

ALTER TABLE tdb_goods

CHANGE goods_cate cate_id SMALLINT UNSIGNED NOT NULL,

CHANGE brand_name brand_id SMALLINT UNSIGNED NOT NULL;

-- 分别在tdb_goods_cates和tdb_goods_brands表插入记录

INSERT tdb_goods_cates(cate_name) VALUES(‘路由器‘),(‘交换机‘),(‘网卡‘);

INSERT tdb_goods_brands(brand_name) VALUES(‘海尔‘),(‘清华同方‘),(‘神舟‘);

-- 在tdb_goods数据表写入任意记录

INSERT tdb_goods(goods_name,cate_id,brand_id,goods_price) VALUES(‘ LaserJet Pro P1606dn 黑白激光打印机‘,‘12‘,‘4‘,‘1849‘);

-- 查询所有商品的详细信息(通过内连接实现)

SELECT goods_id,goods_name,cate_name,brand_name,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\G;

-- 查询所有商品的详细信息(通过左外连接实现)

SELECT goods_id,goods_name,cate_name,brand_name,goods_price FROM tdb_goods AS g

LEFT JOIN tdb_goods_cates AS c ON g.cate_id = c.cate_id

LEFT JOIN tdb_goods_brands AS b ON g.brand_id = b.brand_id\G;

-- 查询所有商品的详细信息(通过右外连接实现)

SELECT goods_id,goods_name,cate_name,brand_name,goods_price FROM tdb_goods AS g

RIGHT JOIN tdb_goods_cates AS c ON g.cate_id = c.cate_id

RIGHT JOIN tdb_goods_brands AS b ON g.brand_id = b.brand_id\G;

-- 无限分类的数据表设计

CREATE TABLE tdb_goods_types(

type_id   SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,

type_name VARCHAR(20) NOT NULL,

parent_id SMALLINT UNSIGNED NOT NULL DEFAULT 0

);

INSERT tdb_goods_types(type_name,parent_id) VALUES(‘家用电器‘,DEFAULT);

INSERT tdb_goods_types(type_name,parent_id) VALUES(‘电脑、办公‘,DEFAULT);

INSERT tdb_goods_types(type_name,parent_id) VALUES(‘大家电‘,1);

INSERT tdb_goods_types(type_name,parent_id) VALUES(‘生活电器‘,1);

INSERT tdb_goods_types(type_name,parent_id) VALUES(‘平板电视‘,3);

INSERT tdb_goods_types(type_name,parent_id) VALUES(‘空调‘,3);

INSERT tdb_goods_types(type_name,parent_id) VALUES(‘电风扇‘,4);

INSERT tdb_goods_types(type_name,parent_id) VALUES(‘饮水机‘,4);

INSERT tdb_goods_types(type_name,parent_id) VALUES(‘电脑整机‘,2);

INSERT tdb_goods_types(type_name,parent_id) VALUES(‘电脑配件‘,2);

INSERT tdb_goods_types(type_name,parent_id) VALUES(‘笔记本‘,9);

INSERT tdb_goods_types(type_name,parent_id) VALUES(‘超级本‘,9);

INSERT tdb_goods_types(type_name,parent_id) VALUES(‘游戏本‘,9);

INSERT tdb_goods_types(type_name,parent_id) VALUES(‘CPU‘,10);

INSERT tdb_goods_types(type_name,parent_id) VALUES(‘主机‘,10);

无线级分类表设计:

-- 查找所有分类及其父类

SELECT s.type_id,s.type_name,p.type_name FROM tdb_goods_types AS s LEFT JOIN tdb_goods_types AS  p ON s.parent_id = p.type_id;

-- 查找所有分类及其子类

SELECT p.type_id,p.type_name,s.type_name FROM tdb_goods_types AS p LEFT JOIN tdb_goods_types AS  s 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_name ORDER BY p.type_id;

-- 为tdb_goods_types添加child_count字段

ALTER TABLE tdb_goods_types ADD child_count MEDIUMINT UNSIGNED NOT NULL DEFAULT 0;

-- 将刚才查询到的子类数量更新到tdb_goods_types数据表

UPDATE tdb_goods_types AS t1 INNER JOIN ( 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_name

ORDER BY p.type_id ) AS t2

ON  t1.type_id = t2.type_id

SET t1.child_count = t2.children_count;

-- 复制编号为12,20的两条记录

SELECT * FROM tdb_goods WHERE goods_id IN (19,20);

-- INSERT ... SELECT实现复制

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;



INNER JOIN 显示两表中共同符合条件的记录

LEFT JOIN 显示左表中的全部记录和右表中符合条件的记录

RIGHT JOIN 显示右表中的全部记录和左表中符合条件的记录

函数

字符函数

CONCAT() 字符连接

CONCAT_WS(‘symbol‘,‘‘,‘‘,...) 使用指定的分隔符进行连接

FORMAT() 数字格式化

LOWER() 小写

UPPER() 大写

LEFT(‘string‘, number) 获取左侧字符

RIGHT(‘string‘, number) 获取右侧字符

LENGTH() 获取字符串长度

LTRIM() 删除左边前导空格

RTRIM() 删除右边后导空格

TRIM()  删除两边的前导空格 也可和‘LEADING TRAILING BOTH    FROM‘ 搭配删除特定的前导后导字符

REPLACE(‘string‘,‘str1‘,‘str2‘) 把string中的str1替换为str2

SUBSTRING(‘string‘,start[,end])

LIKE 类似SQL中自己的正则表达式 %任意字符 _任意一个字符

数值函数

CEIL() 向上取整

FLOOR() 向下取整

ROUND() 四舍五入

POWER() 幂运算

DIV 整数除法

MOD 取余数

TRUNCAT() 数字截取

[NOT] BETWEEN ... AND... 在给定的区间内

[NOT] IN() 在给定的范围内

IS [NOT] NULL 可以在WHERE关键字后使用

日期时间函数

NOW() 当前日期时间

CURDATE() 当前日期

CURTIME() 当前时间

DATE_ADD() 日期变化

DATEDIFF() 日期差值

DATE_FORMAT() 日期格式化

信息函数

CONNECTION_ID() 连接ID

DATABASE() 当前数据库

LAST_INSERT_ID() 最后插入ID

USER() 当前用户

VERSION() 版本

聚合函数

AVG() COUNT() MAX() MIN() SUM()

加密函数

MD5() 信息摘要算法 WEB页面准备

PASSWORD() 修改密码

自定义函数

CREATE FUNCTION function_name

RETURNS

{STRING | INTEGER | REAL | DECIMAL}

routine_body

DELIMITER string 以string作为MySQL语句结束结束标志

复合结构的函数体必须包含在BEGIN...END..之间

DROP FUNCTION [IF EXISTS] function_name;

存储过程

优点:

增强SQL语句的功能和灵活性

实现较快的执行速度 (通过直接调用编译的结果实现)

减少网络流量

创建存储过程

DELIMITER //

CREATE PROCEDURE sp1(IN sid INT UNSIGNED)

BEGIN

DELETE FROM table where id=sid;

END

//

DELIMITER ;

创建带有多个OUT 的存储过程:

CREATE PEOCEDURE removeByAgeAndReturnInfos(IN p_age SMALLINT UNSIGNED,OUT deleteNums SMALLINT UNSIGNED,leftNums SMALLINT UNSIGNED)

BEGIN

DELETE FROM user WHERE age = p_age;

SELECT ROW_COUNT() INTO deleteNums;

SELECT COUNT(id) FROM user INTO leftism;

END//

普通变量只能生活在函数体或者存储体中

通过存储体创建的输出变量需要用@变量名接收

@变量名是客户端变量,具有客户端的全局属性

SELECT * FROM users;

SELECT COUNT(id) FROM users WHERE age = 23;

CALL rmUserByAgeAndRtInfos(23, @a, @b);

SELECT @a, @b;

存储过程与自定义函数的区别

存储功能复杂,函数针对性更复杂;

存储过程可以返回多个值,函数只能有一个返回值;

存储过程一般独立执行,函数可以作为其他SQL语句的组成部分来出现

存储引擎的相关特点

并发处理

共享锁(读锁):同一时间段内,多个用户可以读取统一资源,读取过程中数据不会发生任何变化;

排它锁(写锁):在任何时候只能有一个用户写入资源,当进行写锁时会阻塞其他的读锁或者写锁操作。

表锁:开销最小的锁策略

行锁:开销最大的锁策略

事务处理

用于保证数据库的完整性

特性:ACID 原子性 一致性 隔离性 持久性

外键:保证数据一致性

索引:对数据表中一列或多列的值进行排序的一种结构

时间: 2024-10-13 23:00:49

MySQL初探的相关文章

mysql 默认引擎innodb 初探(二)

写在前 本篇博客承接上一篇 mysql 默认引擎innodb 初探(一)进行对mysql数据库 innodb存储引擎进行探索 mysql默认存储引擎 innodb简介 Innodb是第一个完整支持ACID事务的mysql存储引擎(BDB是第一个支持事务的mysql存储引擎,目前已经停止开发): 主要特点是 支持行锁,MVCC,事务,外键及一致性非锁读,可以有效利用CPU和内存: 各版本对比如下: tips : 如果不支持多回滚段,Innodb最大支持并发事务量被限制为1023 innodb体系架

mysql Partition(分区)初探

mysql Partition(分区)初探 表数据量大的时候一般都考虑水平拆分,即所谓的sharding.不过mysql本身具有分区功能,可以实现一定程度 的水平切分. mysql是具有MERGE这种引擎的,就是把一些结构相同的MyIASM表作为一个表使用,但是我觉得 MERGE不如partition实用, www.2cto.com 因为MERGE会在所有的底层表上查询,而partition只在相应的分区上查询. 建立了两个表,分别为分区和未分区的,分区表按年进行分区. Sql代码 CREATE

mysql 默认引擎innodb 初探(三)

写在前 本篇博客承接上一篇 mysql 默认引擎innodb 初探(二)继续对mysql数据库 innodb存储引擎进行探索 innodb 文件 mysql数据库和innodb存储引擎表的各种类型文件: 参数文件 日志文件(错误日志文件,二进制日志文件,慢查询日志文件,查询日志文件) socket文件(Unix套接字连接,避免走tcp协议,web服务器和mysql服务器在同一机器上时可用于提高通信提高效率) pid文件(保存mysql实例进程ID) mysql表结构文件 innodb存储引擎文件

MYSQL SQL语句技巧初探(一)

MYSQL SQL语句技巧初探(一) 本文是我最近了解到的sql某些方法()组合实现一些功能的总结以后还会更新: rand与rand(n)实现提取随机行及order by原理的探讨. Bit_and,bit_or,bit_count等位操作方法实现统计功能. rand与rand(n)提取 使用order by rand(n)配合limit n可以提起相应的n个随机样本. 如:select  *  from student grade='2' order by rand() limit 5 随机提

MySQL 日志初探

目录 MySQL 日志初探 零.概述 一.Error Log(错误日志) 二.General Query Log(通用查询日志) 三.Slow Query Log (慢查询日志) 四.Binary Log(BinLog) 五.总结 六.参考 MySQL 日志初探 零.概述 MySQL 的日志分为 Error Log(错误日志),General Query Log(通用查询日志).Slow Query Log(慢查询日志).Binary Log(BinLog),各种日志各有各的用处和配置方式,接下

Asp.net Core 系列之--2.ORM初探:Dapper实现MySql数据库各类操作

ChuanGoing 2019-09-10 距离上一篇近一个月时间,断断续续才把本篇码完,后面将加快进度,争取年度内把本系列基本介绍完成,同时督促本人持续学习. 本篇学习曲线: 1.初识Dapper 2.DbConnection 3.CommandBuilder实现单表操作(略) 4.演示 初识Dapper Dapper是一个轻量级/高性能的ORM,核心功能是利用Emit反射获取IDataReader中的数据.我们可以利用它的对象关系映射实现简单CURD操作,或者直接用SQL语句实现复杂场景的C

MySQL ProxySQL读写分离使用初探

目的 在美团点评DBProxy读写分离使用说明文章中已经说明了使用目的,本文介绍ProxySQL的使用方法以及和DBProxy的性能差异.具体的介绍可以看官网的相关说明,并且这个中间件也是percona推的一款中间件.其特性和其他读写分离的中间件差距不大,具体的会在文中介绍.本文大致简单的介绍在使用过程中的一些说明,也可以看官方的wiki获得使用帮助. 环境:  Distributor ID: Ubuntu Description: Ubuntu 14.04.5 LTS Release: 14.

MySQL事务隔离级别初探

MySQL有四种隔离级别,分别是: READ UNCOMMITTED(未提交读) READ COMMITTED(提交读) REPEATABLE READ (可重复读) SERIALIZABLE(可串行化) 下面会分别用一些例子来解释各种隔离级别,在开始之前,首先要了解一些前提知识: AUTOCOMMIT:MySQL默认开启自动提交(AUTOCOMMIT),如果不是显式地开启一个事务,则每个查询都被当做一个事务执行提交操作.在当前连接中,可以通过设置 AUTOCOMMIT 变量来启用或者禁用自动提

MySQL\MariaDB 多线程复制初探

背景: MariaDB 在10.0.0.5就已经支持了并发复制的功能,即从库多线程复制的功能.MySQL最先在5.6.3中支持.目前暂时没有用MySQL5.6的版本,故暂时只对MariaDB进行一些说明,后期会对MySQL进行说明. 对于replication很多同学都已经很熟悉了,这里稍微讲下,在复制过程中有3个线程:Master上的IO线程和Slave上的IO.SQL线程,复制的原理可以自己去google搜.从库一直都是异步复制主库的,通过SHOW SLAVE STATUS 可以查看从库落后