关于mysql的一些总结记录,备查
MySQL 笔记
CREATE DATABASE :创建数据库;
create database if not exists Northwind;
# 如果Northwind库不存在,创建之;
create database if not exists Northwind default charset utf8 collate utf8_general_ci;
# 如果Northwind库不存在,创建字符集为utf8,排序规则为utf8_general_ci的数据库;
CREATE TABLE:创建表
create table TableTest (Name varchar(255), Age int, Address varchar(255));
# 创建TableTest表,包含三列,且数据类型分别为字符型、整形、字符型;
create table TestConstraint (id int PRIMARY KEY, name varchar(255) NOT NULL, age int);
# 创建TestConstraint表,且指定主键、name列非空;
create table Persion (id int PARMARY KEY, age int NOT NULL, name varchar(255) NOT NULL, constraint ConsName(age, name));
# 创建Persion表指定多个约束并为多个约束命名;
alter table Persons alter City set DEFAULT 'ShangHai';
# mysql中修改City列默认值约束为ShangHai;
约束(Constraints):用于指定表中的数据规则,可创建表时创建,或使用 ALTER 修改 NOT
- NULL:非空,为空时不允许插入或更新;
- UNIQUE: 值唯一;
- PRIMARY KEY:主键,NOT NULL 和 UNIQUE 的结合;
- FOREIGN KEY:外键,指向另一个表中的主键;
- CHECK:保证值符合条件;
- DEFAULT:指定默认值;
- UNSIGNED:无符号,只用于整型数据,表示非负;
SELECT DISTINCT:返回唯一不同值;
select distinct City from Customers;
# 查询Customers表中City列中的唯一的取值;
SELECT * FROM test GROUP BY num HAVING COUNT(num) =1 ORDER BY num ASC LIMIT 0,1;
# group by:num分组;count(num=1):num值唯一;ASC:num值升序排列;LIMIT0,1:取升序排列的第一个值(从第0个数据开始取值,取一个值);
SELECT WHERE:条件查找
select * from Customers where City='Paris';
# 查找Customers表中City字段为Paris的行,双引号也被大部分数据库支持,数值字段不加引号;
# 判断条件还有<>、<、>、>=、<=、between 'Jan-06-2015' and 'Jan-06-2015'、like '%abc%'、in (a,b,c)等,互斥查找添加not;
select * from Customers where City='Paris' and Country='France';
# 查找Country值为France并且City值为Paris的条目;
select * from Customers where City='Paris' or Country='Canada';
# 查找Customers表中City值为Paris或者Country值为Canada的条目;
select Address from Customers where Country='Fance' and (City='Paris' or city='Lyon');
# 查找Customers表中Country值为Fance并且City值为Paris或者Lyon的条目中的Address信息;
SELECT * FROM wtp RIGHT JOIN user ON user.mac=wtp.mac WHERE wtp.mac IS NULL AND id=0
# 查找在mac字段值在user中而不在wtp表中(并且过滤id=0)的条目
SELECT WHRER FOR UPDATE:对 select 的特定数据表进行加锁操作
(注:使用必须关闭 mysql 数据库的自动提交属性:set autocommit=0;)
select status from goods where id=1 for update;
# 查询商品状态且防止操作结束前状态被改动
SELECT ORDER BY:对查找结果排序(DESC 降序,ASC 升序)
select CustomerID from Customers where City='Paris' order by CustomerID DESC;
# 查找Customers表中City值为Paris的条目中的CustomerID,并把查询结果按照CustomerID的值做降序排列;
select * from Customers order by City,Country;
# 查找Customers表中的所有信息并把查询结果按照City和Country排序;
INSERT INTO:数据表中插入数据
insert into Customers (CustomerName,City,Country) values ('Wartian','Paris','France');
# 向Customers表中插入一条指定列CustomerName、City、Country值为Wartian、Paris、France的新行;
INSERT INTO Customers (CustomerID,CompanyName,ContactName,ContactTitle,Address,City,Region,PostalCode,Country,Phone,Fax) VALUES ('China','Shine China', 'Shine', 'Master', '滨江', '杭州', NULL, '411282', 'China', '191835412', '635478465');`
# 向Customers表中插入一条包含所有属性列值新数据;
ON DUPLICATE KEY UPDATE
- 如果在 INSERT 语句末尾指定了 ON DUPLICATE KEY UPDATE,并且插入行后会导致在一个 UNIQUE 索引或 PRIMARY KEY 中出现重复值,则在出现重复值的行执行 UPDATE;如果不会导致唯一值列重复的问题,则插入新行。
UPDATE SET WHERE:条件更新表数据
update Customers set Address='ZhuoZhengyuan' where City='SuZhou' and Country='China';
# 将Customers表中City属性值为SuZhou并且Country属性值为China的条目的Address属性值设置为ZhuoZhengyuan;
!注!: UPDATE 语句中的 WHERE 子句通常必选!省略了 WHERE 子句会导致所有的记录都将被更新! !注!:mysql 查询结果不允许直接 update,可通过加一层 select 至临时表达到该效果
UPDATE wtp set id=1 WHERE mac IN (SELECT mac FROM(SELECT wtp.mac FROM wtp RIGHT JOIN newTable ON newTable.mac = wtp.mac AS TEMPTABLE))
# 将wtp表中mac与newTable表中mac相同的条目id值改为1
select count(1) from (select id from opt_unit WHERE id=11) as tmp_count
# 在查询结果中查询(子表查询,必须加别名)
DELETE WHERE:条件删除数据
delete from Customers where City='SuZhou';
# 删除Customers 表中City之为SuZhou的条目;
!注!: UPDATE 语句中的 WHERE 子句通常必选!省略了 WHERE 子句会导致所有的记录都将被删除!
delete * from Guests truncate Guests
# 删除表中所有行,保留表结构、属性、索引等,也可以用truncate实现;
SELECT LIMIT:mysql 规定返回记录数目(SQL Server 为 TOP)
select * from Customers limit 5;
# 返回Customers前5条数据;
select * from Customers limit 5,10;
# 返回Customers表中的第6到16条数据(从第一条数据开始取值,取十条);
LIKE 通配符:%、_
select * from Customers where City like 'Lon%';
# 返回Customers表中City值为Lon开头的所有条目;
select * from Customers where City like 'Chin_';
# 返回Customers 表中City值为Chin开头,第五位为任意字符的条目;
正则通配符[”^%char”|”%char%”,”_”,”?someletter$”]
WHERE 谓词有三个,分别是:REGEXP, RLIKE, NOT RLIKE
select * from Customers where City RLIKE '^C';
# 返回Customers表中City值为C开头的条目;
SELECT AS :别名 Alias
select c.Country , o.OrderID from Customers as c , Orders as o where c.Country='China';
# 将Customers表指定别名c,Order表指定别名o,以Country值为China为过滤条件返回Customers表中的Country和Orders表中的OrderID;
(INNER)JOIN ON:基于共同字段连接表
select Orders.OrderID , Customers.Country from Orders inner join Customers on Customers.CustomerID=Orders.CustomerID;
# 返回Customers表和Orders表中CustomerID值相同条目的Orders.OrderID列和Customers.Country列
LEFT JOIN ON:返回左表全部及右表匹配值
select Orders.* , Customers.* from Orders left join Customers on Customers.CustomerID=Orders.CustomerID;
# 返回Orders表的所有数据并外连Customers表中CustomerID值相同的条目;
RIGHT JOIN ON:返回右表全部及左表匹配值
select Orders.* , Customers.* from Orders right join Customers on Customers.CustomerID=Orders.CustomerID;
# 返回Customers表的所有数据并外连Orders表中CustomerID值相同的条目;
FULL OUTER JOIN ON:左右表中只要有一个存在匹配就返回匹配值(mysql 不支持,使用 UNION 变通实现)
select Customers.CustomerID , Orders.OrderID from Customers full outer join Orders on Customers.CustomerID=Orders.CustomerID;
# 返回CustomerID相等的Customers.CustomerID及Orders.OrderID值
select c.CustomerID , o.OrderID from Customers as c , full outer join on Orders as o on c.CustomerID=o.CustomerID;
UNION / UNION ALL:合并多个 SELECT 查询结果
说明:
- 要求每个 SELECT 语句必须拥有相同数量的列、列必须拥有相似的数据类型、每个 SELECT 语句中的列的顺序必须相同
- UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL
select City from Customers union select City from Suppliers order by City;
# 返回Customers表和Suppliers表中不同的City值,并把查询结果按照City排序;
select City from Customers union all select City from Suppliers;
# 返回Customers表和Suppliers表中所有的City值,重复的City值算作不同的记录;
select City, Country from Customers where Country='Germany' union all select City, Country from Suppliers where Country='Germany' order by City;
# 返回Customers表和Suppliers表中Country值为Germany的所有City和Country值;
临时表:可用于临时存储数据
select sys_user.username,tmp.account_id,tmp.num from (SELECT account_id,COUNT(*) as num FROM user GROUP BY account_id ORDER BY COUNT(*) DESC) as tmp join sys_user on(tmp.account_id=sys_user.id)
# 使用临时表tmp,将user表查询结果(分组、降序)与sys_user联合查询
SELECT INTO:复制查询结果到本库或者其他库中新表【mysql 不支持,通过 createtable A (select * from B)实现】
select * into Customersback from Customers;
# 选取Customers所有数据插入新表Customersback;
select * into Customersback from Customers in DB2;
# 选取Customers所有数据插入数据库DB2的新表Customersback中;
select Customers.CustomerID, Orders.OrderID into Customersback from Customers left join Orders on Customers.CustomerID=Orders.CustomerID as Customer,Order;
# 选取Customers表与Orders表中CustomerID相等的数据中的CustomerID列和OrderID列指定别名为Customer和Order插入新表Customersback中;
INSERT INTO SELECT:复制表复制信息到另一个已存在的表
insert into Customers (CustomerName, Country) select SupplierName, Country from Suppliers where Country='Germany';
# 选取Suppliers表中Country值为Germany的条目的SupplierName和Country列插入Customers表中的CustomerName列和Country列;
CREATE (UNIQUE)INDEX:创建(唯一)索引
CREATE INDEX <索引名> ON 表名(列 1,列 2,...);索引名>
索引说明:
- 应该选择一个数据最整齐、最紧凑的数据列(如一个整数类型的数据列)来创建索引,普通索引允许被索引的数据列包含重复的值;
- 如果能确定某个数据列将只包含彼此各不相同的值,创建索引时可用 UNIQUE 定义为唯一索引,可提高效率、简化索引管理;
- 符合索引:索引可以覆盖多个数据列,如 INDEX(A,B,C)索引,特点是可以被选择性使用(仅适用于在复合索引中排列在前的数 据列组合),如该索引可以当做 A 或(A,B)的索引来使用,但不能当做 B、C 或(B,C)的索引来使用。
- 索引的长度:为 CHAR 和 VARCHAR 类型的数据列定义索引时,可以把索引的长度限制为一个给定的字符个数(这个数字必须小于这个 字段所允许的最大字符个数),好处是可以生成一个尺寸比较小、检索速度却比较快的索引文件。
- 主键索引默认被创建;
- 若列创建有索引,不要在列上进行运算,会导致索引失效;
- like 语句中“%aaa%” 、“%aaa”不会使用索引,而“aaa%”可以使用索引;
- 若列创建有索引,使用 NOT IN 和<>操作会导致索引失效;
- 多列索引优于单列索引
- 索引最好在 myisam 表上使用 b、一个复合索引最多包含 16 个列
- 确定一个列是否适合做索引,看 select count(distinct colname)/count(*) from table,如果该值接近 0.31 就适合做索引(当然越大越好),如果接近 0 则不适合做索引,也就是说该列没有太多的唯一值,而是有太多的重复值,这样将不适合做索引;
- 前缀索引不能用于 order by 和 group by
- 对于一个 sql 语句最适合做索引的是 where 部分和 order by 部分
- 全文索引:适合的字段类型为 char、varchar、text ;
create unique index PCountry on Customers (Country(15)) ;
# 为Customers表的Country列创建名为PCountry、长度为15的唯一索引;
alter table Customers add index PCountry (Country);
# 为Customers表的Country列创建名为PCountry的索引;
alter table Customers drop index PCountry;
#删除Customers表中名为PCountry的索引;
create index PCountry on Customers (Country, Phone);
# 为Customers表的Country、Phone列创建名为PCountry的索引;
show index from Customers;
# 显示Customers表中的索引信息;
DROP INDEX/TABLE/DATABASE:删除索引/表/数据库
alter table Customers drop index PCountry;
# 删除Customers表中名为PCountry的索引;
drop table Persons;
# 删除Persons表;
truncate table Persons;
# 清空Persons表数据,保留表结构;
drop database TestDrop;
# 删除TestDrop数据库;
ALTER TABLE:修改表结构
alter table Persons add column Address varchar(255) after id;
# 在Persons表中id列后添加列Address,并指定为字符型;
alter table Persons drop column Address;
# 删除Persons表中的Address列;
alter table Persons modify column Address varchar(200);
# 修改Persons表中Address的字符类型;
alter table Persons change column Address Add varchar(255);
# 修改Persons表的Address列名称为Add并指定为字符型;
alter table Persons modify column Number int not null;
# 指定表Persons中的Number列为非空;
alter table Persons modify column Number auto_increment;
# 设置Persons表中的Number列自增(主键);
VIEW:视图
视图说明:
- 视图是由查询结果形成的虚拟表,引用方式同表;
- 如果某个查询结果频繁出现,经常要被拿来做子查询,就可以将这个查询结果写成一个视图用来简化查询;
- 用途:简化查询语句、
- 进行权限控制(将表中指定列显示在视图中):
create view showpart as select goods_id,goods_name from goods;
- 大数据分表后联合各子表:
create view showall as select * from table1 union select * from table2 union ...;
- 进行权限控制(将表中指定列显示在视图中):
- 视图的数据与表的数据一一对应时可以修改,并且该修改会影响到表;
- 视图使用 insert 时必须包含表中没有默认值的列;
- 视图的运算规则(algorithm):
- algorithm=merge:引用视图时合并创建视图和查询视图的语句,查询对象为原表;
- algorithm=temptable:创建视图时形成虚拟表,引用时查询该虚拟表;
- algorithm=undefined:未定义,由系统自动选择;
create view Personal as select id,name from Persons;
select * from Personal;
# 为Persons表的id和name列的查询结果创建一个名为Personal的视图;
# 返回试图内全部数据;
alter view Personal as select Number from Personal;
# 修改Personal视图;
drop view Personal
# 删除Personal视图
Date 函数(mysql 中):
- 函数列表:now()、curdate()、curtime()、date()、extract()、date_add()、date_sub()、date_diff()、date_format()、time_format()、unix_timestamp() 、
- Date 数据类型:date、datetime、timestamp、year,创建日期列时需指定数据类型,时间区间不能用大于小于,需要用 between…and;
select * from Orders where OrderDate='2015-11-11';
# 返回Orders表中OrderDate值为2015-11-11的条目
FROM_UNIXTIME(date)
# 将date列由时间戳模式转化为标准时间格式;
SELECT mac FROM station WHERE auth_time BETWEEN '1489420800' AND '1489507200';
#返回station表中auth_time在指定时间区间内的条目(2017-3-14 00:00:00 === 2017-3-15 00:00:00)
NULL 值处理:
说明:NULL 值不能用运算符如=、<、>等进行比较,必须使用 is NULL 或者 is NOT NULL;
select * from Persons where Number is NULL;
# 返回Persons表中Number值为NULL的条目;
IFNULL 函数:IFNULL(A, B):若 A 非空,返回 A,否则返回 B;
IF 函数:IF(expr, A, B):若 expr 为 true,返回 A,否则返回 B;
select ProductName, UnitPrice*(UnitsInstock + ifnull(UnitOnOrder,0)) from Products;
# 返回Products表中的ProductName和总价(单价x(基数+额外));
数据类型:Text 类型、Number 类型、Date 类型:
类型细分不做详述,常用通用类型有:varchar()、bollean、int、float、date、string、time、array、xml;
SQL 函数
- AVG()函数:返回指定列的平均值
- COUNT()函数:返回匹配值的行数
- FIRST()、LAST()函数:返回指定列首、末记录,Mysql 不支持,通过 ASC + limit1 和 DESC + limit 1 实现;
- MAX()函数:返回指定列最大值
- MIN()函数:返回指定列最小值
- SUM():返回指定列数值之和
select AVG(UnitPrice) as PriceAverage from Products;
# 返回Products表中UnitPrice列的平均值并指定别名为PriceAverage;
select ProductsName, UnitPrice from Products where UnitPrice > (select AVG(UnitPrice)from Products);
# 返回Products表中UnitPrice大于平均值的ProductsName和UnitPrice;
select COUNT(distinct CustomerID) from Orders;
# 统计Orders表中值唯一的CustomerID数目;
GROUP BY:用于结合 Aggregate 函数,根据一个或多个列对结果集进行分组;
说明:没有使用聚合函数的列,必须出现在 group by 后面;
select Shippers.ShipperID, COUNT(Orders.OrderID) from Shippers inner join Orders on ShipperS.ShipperID=Orders.ShipperID group by ShipperID;
HAVING:筛选聚合后的各种数据(where 字句筛选聚合前的数据):
说明:WHERE 子句作用于表和视图,HAVING 子句作用于聚集之后的分组;
select Province, SUM(Population), SUM(City) from People GROUP BY Province having SUM(Population) > 100000;
# 统计省份人口总和(所有城市),并返回人口总数大于100000的条目;
select Employees.LastName, COUNT(Orders.OrderID) as NumberOfOrders from (Employees inner join Orders on Employees.EmployeeID=Orders.EmployeeID) group by LastName having COUNT(Orders.OrderID) > 10;
# 返回注册超过10 个订单的员工姓名及订单总数;
UCESE():把字段值转换为大写、LCASE():把字段值转换为小写:
select UCASE(CompanyName) as Company, City from Customers;
#返回Customers表的公司及城市,并把公司名转换为大写;
MID(column,start,length):从文本字段中提取字符
说明:column_name:列名,必填;start:起始位置,必填(默认为 1),负值表示从末位起始匹配;length:返回字符数,选填(不填返回剩余所有字符);
SELECT MID(column_name, start, length) FROM table_name;
# 示例格式
select distinct MID(City,1,4) as ShortCity from Customers;
# 返回Customers表中City列的前四个字符(唯一的);
REPLACE(column_name,from_str,to_str):替换文本字段中的字符
说明:column_name:列名,from_str:原始字符,to_str:替换后的字符;
SELECT REPLACE(mac,':','-') as new_mac FROM station;
# 转换station表中的mac格式并返回(将: 分隔符替换为- )
LENGTH():返回字符长度
select City from Costomers order by LENGTH(City) limit 5;
# 返回Customers表中City值最长的5条记录;
ROUND(column,num):把数值字段舍入指定小数位说明:column:列名,必填;num:小数位数,必填;
select ROUND(UnitPrice,1) as Price from Products;
# 返回Products表中的UnitPrice列的值,保留一位小数,指定别名为Price;
CONCAT(column1,column2):合并两列字符串形成单一字符串
select CONCAT(one, two) as three FROM table_name;
# 返回one,two列合并后的字符为three列
select CONCAT('"', CONCAT(wtp_id, '"')) as wtp from station;
# 将station表中的wtp_id查询出来加上双引号并记录别名为wtp
NOW():返回当前系统日期时间(相当于添加一列时间)
select ProductName, UnitPrice as PerPrice, now() from Products;
# 返回Products表中当前时间及当前时间的ProductName及UnitPrice(指定别名为PerPrice);
FORMAT(column,formit):对字段格式进行格式化
说明:column:列名,必填;formit:规定格式,必填;
select ProductName,UnitPrice, FROMAT(now(),'YYYY-MM-DD') as PerDatefrom Products;
# 返回ProductName以及当天(格式化为YYYY-MM-DD)的UnitPrice;
(函数)存储过程(procedure):
说明:存储过程是一组为了完成特定功能的 SQL 语句集(是一个可编程的函数),经编译后存储在数据库中,用户通过指定存储过程的名字并 给定参数(如果该存储过程带有参数)来调用执行它;优点很多,主要体现在:提高执行效率、封装 SQL 代码;
a)参考:http://blog.csdn.net/woshixuye/article/details/8348180
创建语法:
create procedure if not exists 存储过程名( in/out/inout 参数参数类型)
begin
MySQL语句;
end;
b)说明:
- 参数:习惯上,MySQL 存储过程参数如果不显式指定为 in、out、inout,默认为 in;
- in:值必须在调用时指定,值不能返回(值传递);
- out:值可以返回(指针传递);
- inout:值必须在调用时指定,值可以返回;
- Mysql 存储过程名后“()”是必须的,即使没有参数;
- MySQL 存储过程参数(变量)前不能加“@”(SQL Server 允许),MySQL 客户端用户变量前需要加“@”;
- MySQL 存储过程的参数不能指定默认值;
- 不能在 MySQL 存储过程中使用“return” 关键字;
- 变量:使用 DECLARE 来声明,DEFAULT 赋默认值,SET 赋值;
- 条件判断:IF THEN、ELSEIF、ELSE、END IF
- 循环:LOOP、END LOOP;WHILE DO、END WHILE;REPEAT、UNTILL
- 数据库交互:
- INTO 用于存储单行记录的查询结果;
- CURSOR 用于处理多行记录的查询结果;
- unbounded SELECT 语句用于存储过程返回结果集
c)调用:
call 存储过程名();
call 存储过程名(a, b);
或者
set @a=10;
set @b=20;
call 存储过程名(@a,@b);
d)其他:
- 查看数据库中所有存储过程的基本信息:
show procedure status
- 查看某一存储过程的详细信息:
show procedure 存储过程名
- 删除存储过程:
drop procedure 存储过程名
- 存储过程中声明变量(DECLARE,只能用于存储过程或者函数中):
DECLARE num INT DEFAULT 1;
- 变量赋值 1:
select ... into num; 变量赋值2:set num = 10;
事件(event)
a)创建事件:
create event if not exists 事件名
on schedule schedle
# 定义执行的时间和时间间隔,schedle有两种方式:1、单次执行:at 时间戳;2、重复执行:every 数量时间单位;
on completion not preserve
# 事件在执行结束后移除保留,去掉not表示保留;
enable
# 事件定义完成后开启还是关闭
do
sql语句;
#事件内容
b)其他:
- 查看事件:
show events;
- 启用控制事件调度器:
SET GLOBAL event_scheduler=ON;
- 开启/关闭事件:
alter event 事件名 on completion preserver enable/disable;
- 删除事件:
drop event 事件名;
触发器(TRIGGER):
说明:触发器是一种与表操作有关的数据库对象,用于监视某种情况,并触发相应操作;
a)触发器创建语法四要素:
- 监视地点(table)
- 监视事件(insert/update/delete)
- 触发时间(after/before)
- 触发事件(insert/update/delete)
创建触发器过程中 sql 语句以“;”结束,但是不能中断创建触发器这个动作,需重新指定结束符,例如
$:delimiter$
,语法:
create trigger 触发器名
after/before insert/update/delete on 表名
# 触发条件,那个表、什么事件、之前还是之后;
for each row
# 触发器的执行间隔,这句话在MySQL中创建触发器时是固定的;
begin
sql语句;
# 触发后执行的操作;
end$
after 和 before 的区别:
- after 是先完成数据的增删改,再触发;触发的语句晚于监视的增删改操作,无法影响前面的增删改动作;
- before 是先完成触发,再增删改;触发的语句先于监视的增删改,使我们就有机会判断、修改即将发生的操作;
在触发器中引用行的值:
- 对于 insert 来说,新插入的行用 new 表示, 行中每一列的值用 new.列名表示;
- 对于 update 来说,被修改的行,修改前的数据用 old 来表示,old.列名引用被修改之前行中的值;修改的后的数据用 new 来表 示,new.列名引用被修改之后行中的值;
- 对于 delete 来说,原本有一行,后来被删除,想引用被删除的这一行,用 old 来表示,old.列名可以引用被删除的行的值;
b)其他:
- 查看触发器:show triggers
- 删除触发器:drop trigger 触发器名
Mysql 事务(transaction):
说明:指一组数据库操作,主要用于处理操作量大,复杂度高的数据,用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行;MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。
a)事务必须满足 4 个条件(ACID):
- Atomicity(原子性):一组事务,要么成功;要么撤回。
- Consistency(稳定性) : 有非法数据(外键约束之类),事务撤回。
- Isolation(隔离性):事务独立运行。一个事务处理后的结果,影响了其他事务,那么其他事务会撤回。事务的 100%隔离,需要牺牲速度。
- Durability(可靠性):软、硬件崩溃后,InnoDB 数据表驱动会利用日志文件重构修改。可靠性和高速度不可兼得,
innodb_flush_log_at_trx_commit
选项决定什么时候吧事务保存到日志里。说明:如果出了错误,事务也不允许撤销,只能通过“补偿性事务”补救;
b)语法:
start transaction;
sql语句
sql语句
commit;
#提交,或者回滚:roolback;
其他补充
一、函数和过程的区别:
- 标识符不同。函数的标识符为 FUNCTION,过程为:PROCEDURE。
- 函数有返回值,且必须返回,调用时,除在 select 中,必须将返回值赋给变量;过程没有返回值,不能将结果直接赋值给变量;
- 函数可以在 select 语句中直接使用,而过程不能。例如:假设已有函数 fun_getAVG()返回 number 类型绝对值。那么 select fun_getAVG(col_a) from table 这样是可以的。
二、表的存储引擎
- MyISAM:适合读多写少的应用,且对数据一致性恢复性要求不高、对事务的完整性,并发性要求不高的应用;是在 web、数据仓 储和其他应用环境下最常用的的存储引擎;
- InnoDB:支持事务,提供了具有提交,回滚和崩溃恢复能力的事务安全。对比 MyISAM 的存储引擎,InnoDB 写的处理效率差一 些,并且会占用更多的磁盘空间以保留数据和索引。
- 查看、修改表的存储引擎:
- 查看:
show table status from db_name where name='TableName';
- 查看系统支持的存储引擎:
show engines;
- 修改方式一(直接修改,缺点:慢):
alter table TableName ENGINE=InnoDB;
- 修改方式二(导入导出,缺点:不安全):导出,修改 sql,导入;
- 修改方式三(创建新表、插入):
create table NewTable like OldTable;
alter table NewTable ENGINE=InnoDB;
insert into NewTable select * from OldTable;
- 查看:
三、查询优化:
- from 后边的表数据少的放在右边(多个表查询的时候)
- where 后边过滤行数多的放在右边
- select 少用够用就行(尽量不用,即使查询全部字段也要尽量全部写出来,这样的效率会高)
- 能用连接查询绝不用子查询,因为子查询的的底层就是连接查询
- 合理使用索引提升效率(索引的本质是提高效率的机制,本质上是一棵树)
- 为经常出现在 where 子句中的列创建索引
- 为经常出现在 order by,distinct 中的字段建立索引
- 不要经常在 DML 的表上建立索引(容易造成索引不准,解决方法为 rebuild 重新建立,任何 DML 操作都是更新 index,这是代价)
- 不要在小表上简历索引(索引简历和维护也是要消耗资源的,小表上建立索引会造成索引的维护时间大于数据查询时间)
- 限制表上的索引数目,索引并不是越多越好(索引会占用表空间,还要额外的维护)
- 删除很少被使用的,不合理的索引
四、其他:
- mysql 命令行查询结果不显示列名(列标题):-N 参数;
- mysql 命令(truncate),清理表数据,并归 1 自增 ID 的值,但 myisam 的表和 innodb 的表在使用上有一定的区别。myisam 表会清空所有数据,并释放表空间,即硬盘空间会得到释放。innodb 表也会清空所有数据,但不释放表空间 参考如下:http://www.cnblogs.com/xuxyblog/p/3966430.html