标签:
SQL基础:
结构化查询语言(Structured Query Language)简称SQL。使用关系模型的数据库语言。
SQL分类:
DDL数据定义语言:用来建表建库,修改表的
DML数据操纵语句主要用来操作表数据
DCL数据控制语句,数据库权限操作语句
DML:
MYSQL语句:
删除数据语句:DELETE
单表删除:
DELETE [LOW_PRIORITY 关键字延迟删除,直到没有其它客户端读取本表时再执行] [QUICK 关键词,则在删除过程中,存储引擎不会合并索引端结点,这样可以加快部分种类的删除操作的速度] [IGNORE 忽略所有的错误] FROM tbl_name [WHERE where_definition 控制语句,如果没有条件语句会删除所有行] [ORDER BY 排序] [LIMIT row_count 希望删除的行数]
多表删除:不能在一个多表DELETE语句中使用ORDER BY或LIMIT
DELETE [LOW_PRIORITY] [QUICK] [IGNORE] tbl_name[.删除的列] [, tbl_name[.*] ...] FROM table1,table2,.. [WHERE where_definition 条件语句]
DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name[.*] [, tbl_name[.*] ...] USING table_references [WHERE where_definition]
快速删除表:TRUNCAT [TABLE] table_name;
使用TRUNCATE TABLE重新设置AUTO_INCREMENT计数器,设置时不考虑是否有外键限制。
例子:
DELETE t1, t2 FROM t1, t2, t3 WHERE t1.id=t2.id AND t2.id=t3.id;
DELETE t1 from t1 where tl.id=3;
TRUNCAT t1;
插入语句:
1: INSERT [LOW_PRIORITY 延迟插入表 | DELAYED延迟插入表 | HIGH_PRIORITY 这么做还会导致同时进行的插入被取消] [IGNORE] [INTO] tbl_name [(col_name,...)] VALUES ({expr | DEFAULT},...),(...),.)[ ON DUPLICATE KEY UPDATE col_name=expr, ... ]
2:表达式插入INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE] [INTO] tbl_name SET col_name={expr | DEFAULT}, ...[ ON DUPLICATE KEY UPDATE col_name=expr, ... ]
3:搜索插入INSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE] [INTO] tbl_name [(col_name,...)] SELECT ... [ ON DUPLICATE KEY UPDATE col_name=expr, ... ]
例子:
INSERT INTO table (a,b,c) VALUES (1,2,3)
INSERT INTO table (a,b,c) VALUES (1,2,
INSERT INTO table (a,b,c) VALUES (12,3)INSERT INTO table (a,b,c) VALUES (1,2
INSERT INTO table SET a=4+5; //表达式插入
INSERT INTO table(a,b,c) VALUES (1,2,3),(4,5,6),......插入多个值
INSERT INTO table SELECT * FROM table2 //从另外一个表选取数据插入
INSERT INTO table (field1,field2,field3) SELECT field1,field2,field3 FROM table2
更新语句:
UPDATE [LOW_PRIORITY] [IGNORE] tbl_name SET col_name1=expr1 [, col_name2=expr2 ...] [WHERE where_definition 约束条件] [ORDER BY ... 排序] [LIMIT row_count 更新的行数]
多表更新:
UPDATE [LOW_PRIORITY] [IGNORE] table_references SET col_name1=expr1 [, col_name2=expr2 ...] [WHERE where_definition 约束条件]
例子:
UPDATE table SET field=value WHERE id IN (...);
UPDATE table1 ,table2 SET table1.field=table2.field WHERE table2.id=table21.id;
查询语句:
单表查询:
SELECT * FROM table [WHERE CONDITion]
select * FROM emp;
选取字段查询
SELECT field1,field2,.. FROM table [WHERE CONDITion]
select ename,sal,deptno FROM emp;
查询不重复记录:使用distinct关键字
select DISTINCT deptno FROM emp;
多条件查询:
select deptno FROM emp WHERE deptno = 1;
排序:ORDER BY field [DESC 倒序|ASC 正序],field2 [DESC 倒序|ASC 正序],。。。。
select deptno FROM emp ORDER BY deption;
select deptno FROM emp ORDER BY deption,sal DESC; //现在按照部门排序,对于统一部门按照工资排序
现在返回条数: LIMIT [start,off]
select deptno FROM emp ORDER BY deption,sal DESC LIMIT 10,10;//返回十条数据
聚合:
SELECT [field1,field2,..] fun_name FROM tablename [WHERE where_contition] [GROUP BY field,field2,..] [WITH ROLLUP] [HAVING wherr_contition]
fun_name表示要使用的聚合函数:SUM求和,MAX最大MIN最小,COUNT统计数目
GROUP BY 表示要进行分类(分组)聚合的字段。
WITH ROLLUP 是否对分类聚合后的结果再进行汇总。
HAVING 关键字表示对分类后的结果再进行条件过滤
例子:
统计公司总人数: SELECT COUNT(*) as num FROM emp;
统计公司各个部门人数:SELECT deptno ,COUNT(*) as NUM FROM emp GROUP BY deptno;
既要统计各个部门也要统计公司人数:SELECT deptno,COUNT(*) as NUM FROP emp GROUP BY deptno WITH ROLLUP;
统计部门人数大于1的部门:SELECT deptno,COUNT(*) FROM emp GROUP BY deptno HAVING count(*) > 1;
统计公司工资总额,最大工资,最小工资:SELECT sum(sal),max(sal),min(sal) FROM emp;
表连接查询:
带有 WHERE 子句的连接:
SELECT table1.field,table2.field,.. FROM table1,table2,... WHERE table1.field = table2.field=..
JOIN子句连接:
左链接查询: 包含了所有左边表的记录甚至右表中没有和它匹配的记录。LEFT JOIN tablename,.. ON (table1.field=...);
LEFT JOIN 关键字会从左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中没有匹配的行
SELECT column_name(s) FROM table_name1 LEFT JOIN table_name2 ON table_name1.column_name=table_name2.column_name
右连接查询: 包含了右表中所有的记录甚至左表中没有和它匹配的记录 .RIGHT JOIN tablename,.. ON (table1.field=...);
RIGHT JOIN 关键字会右表 (table_name2) 那里返回所有的行,即使在左表 (table_name1) 中没有匹配的行。
SELECT column_name(s) FROM table_name1 RIGHT JOIN table_name2 ON table_name1.column_name=table_name2.column_nameSELECT column_name(s) FROM table_name1 LEFT JOIN table_name2 ON table_name1.column_name=table_name2.column_name
子查询:当查询结果需要另外一条SELECT语句来支持的时就要用到子查询
子查询常用到的关键字 IN,NOT IN ,=,!=,exists,NOT exists等
记录联合:联合两个表的数据
UNION,UNION ALL
SELECT * FROM table1 UNION select * from table2;
UNION与UNION ALL的区别是:UNION去重,UNION ALL直接把结果集联合起来。
MYSQL支持的 数据类型:
数值类型:
正数类型:tinyint 占用字节 1 有符号 -128-127 无符号 0 -255
SMALLINT 2 -32768-32767 0 - 65535
MEDIUMINT 3
INT 4 -2147483648 0-4294967295
BIGINT 8
浮点数:FLOAT 4
DOUBLE 8
MYSQL使用0 填充 不满字节的数 00001;
日期和时间:
DATE 4个字节 1000-01-01 9999-12-31 年月日
DATETIME 8个字节 1000-01-01 00:00:00 9999-12-31 23:59:59 年月日时分秒
TIMESTAMP 4 UNINX时间戳 用于跟新日期为当前系统时间 返回 YYYY-MM-DD HH:MM:SS
TIME 3 -838:59:59 838:59:59
year 1 1901 2155
使用 NOW函数插入日期
字符串类型:
char
varchar
text
longtext
binary
varbinary
ENUM枚举类型:只能单选。
CREATE table t (gender enum(‘M‘,‘f‘,‘g‘));
SET 类型:可以选取多个成员。
CREATE table t (gender SET(‘M‘,‘f‘,‘g‘));
MYSQL运算符:
算术运算符:
+,-,*,/,%
比较运算符:
=,<>或是!=,<=>,<,<=,>,>=,BETWEEN,IN,IS NULL ,IS NOT NULL,LIKE ,REGEXP或是RLIKE
例子:SELECT * FROM emp WHER ID BETWEN 10 AND 100; ID IN (value1,value2,...); id IS NULL;
逻辑运算符:
NOT或!,AND 或是 &&,OR 或是 || ,XOR
MYSQL常用函数:
字符串函数:
CANCAT(field1,field2,..) 将field1,field2,。。连接为一个字符串。
INSERT(str,x,y,instr) 将str从x开始到y结束的子字符串替换为instr
LOWER(str) 将字符串str所有字符变成小写。
UPPER(str)变为大写
LEFT(str,x)返回字符串最左的x个字符
RIGHT(str,x)
LPAD(str,n,pad)使用pad对str的最左边进行填充,直到长度为N个字符
RPAD(str,n,pad)
LTRIM(str)替换字符左边空格
RTRIM(str)
TRIM(str)
REPLACE(str,a,b)把字符str的a替换为b
STRCMP(str1,str2) 比较两个字符
SUBSTRING(str,x,y)截取字符
数值函数:
ABS(x)返回 X的绝对值。
CEIL(X) 返回大于X的最大整数
FLOOR(x)小于X的整数
MOD(x/y) 取模
日期和时间函数:
CURDATE() 当前日期
CURTIME() 当前时间
NOW() 当前日期和时间
UNINX_TIMESTAMP(date) 返回日期DATE的uninx时间戳
FROM_UNINXTIME() 返回UNINX时间戳的日期值
YEAR(date)
DATEDIFF(expr,expr2) 两个时间间隔的天数
DATE_ADD(date,interval expr type)当前日期加上一个时间间隔值。
例子: SELECT * FROM EMP WHERE datetime > NOW() AND datetime < date_add(now(),interval 31 day);
SELECT * FROM EMP WHERE datetime > NOW() AND datetime < date_add(now(),interval -31 day); //当前日期一个月前的数据
流程函数:
类型的选择:
表类型(存储引擎)的选择:
MYSQL 5.0 支持的存储引擎包括 NyISAM,InnoDB,BDB,MEMORY,MERGE,EXAMPLE,NDB CLuster,ARCHIVE,CSV,BLACKHOLE,FEDERATED等。
创建表的时候,如果不指定表的存储引擎,则使用默认存储引擎,修改配置文件default-table-type来设置默认引擎
show variables LIKE ‘table_type‘;查看表的引擎
创建表的时候可以使用ENGINE关键字设置表引擎
存储引擎特性:
Myisam InnoDB MEMORY
存储限制 有 64TB 有
事物安全 不支持 支持 NOT
锁机制 表锁 行锁 表锁
B叉树索引 支持 支持 支持
哈希索引 支持
全文索引 支持
空间使用 低 高 低
内存使用 低 高 低
批量插入 高 低 高
支持外键 支持
MyIsam :
不支持事物,不支持外键,特点是访问速度快,现在插入速度也是很快,
MyIsam包含三个文件第一个文件的名字以表的名字开始,扩展名指出文件类型。.frm文件存储表定义。数据文件的扩展名为.MYD (MYData)。索引文件的扩展名是.MYI (MYIndex)。
MYiasm存储特性
静态表:固定列长的表
动态表:不固定列长的表,会产生文件碎片,如果一个MyISAM表包含任何可变长度列(VARCHAR, BLOB或TEXTDynamic), 或者如果一个表被用ROW_FORMAT=DYNAMIC选项来创建,动态存储格式被使用,OPTIMIZE table优化碎片。
压缩表:由myisampack创建;
Innodb:支持事物机制,具有提交,回滚和崩溃恢复能力的事物安全,但是会占用更多的磁盘空间保留数据和索引。这种类型的需要使用导出工具类进行数据转义。
支持外键约束:
但要求父表必须有对应的索引,子表在创建外键的时候也会自动创建对应的索引。
创建约束的语句
[CONSTRAINT symbol] FOREIGN KEY [id] (index_col_name, ...)
REFERENCES tbl_name (index_col_name, ...)
[ON DELETE {RESTRICT 拒绝对父表的删除或更新操作 | CASCADE从父表删除或更新且自动删除或更新子表中匹配的行 | SET NULL从父表删除或更新行,并设置子表中的外键列为NULL | NO ACTION} NO ACTION意味这不采取动作,就是如果有一个相关的外键值在被参考的表里,删除或更新主要键值的企图不被允许进行]
[ON UPDATE {RESTRICT | CASCADE | SET NULL | NO ACTION}]
创建:
CREATE TABLE parent(id INT NOT NULL,
PRIMARY KEY (id)
) TYPE=INNODB;
CREATE TABLE child(id INT, parent_id INT,
INDEX par_ind (parent_id),
FOREIGN KEY (parent_id) REFERENCES parent(id)
ON DELETE CASCADE
) TYPE=INNODB;
CREATE TABLE product (category INT NOT NULL, id INT NOT NULL,
price DECIMAL,
PRIMARY KEY(category, id)) ENGINE=INNODB;
CREATE TABLE customer (id INT NOT NULL,
PRIMARY KEY (id)) ENGINE=INNODB;
CREATE TABLE product_order (no INT NOT NULL AUTO_INCREMENT,
product_category INT NOT NULL,
product_id INT NOT NULL,
customer_id INT NOT NULL,
PRIMARY KEY(no),
INDEX (product_category, product_id),
FOREIGN KEY (product_category, product_id)
REFERENCES product(category, id)
ON UPDATE CASCADE ON DELETE RESTRICT,
INDEX (customer_id),
FOREIGN KEY (customer_id)
MEMORY 存储引擎:
存储在内存中,访问速度更快,默认使用HASH,不会对数据进行保存,一旦服务器关闭,数据全部丢失。可以用会员登录表,或是其它表。服务器需要足够的内存来维持表,所以不需要使用的时候最好是 DELETE from 或是 truncate table.
索引的使用:
使用索引可以提高查询数据的速度,一般引擎支持对一个表的16个索引,总索引长度至少为256字节。MySQL支持前缀索引,及对索引字段的前N个字节创建索引,因为前N个字节如果可以区分的话不用使用整个字符作为索引减少索引长度,
索引设计原则:
1:搜索的索引列,不一定是所要选择的列。最适合索引的列是出现在WHERE 子句的列,或是连接子句的列,而不是出现在SELECT 关键字后的列。
2:使用唯一索引。考虑列的值,索引的列的基数越大,索引的效果越好,如日期的列值都不同,很容易区分行,而性别的列只含有 M和F,对此列索引没多大用处,因为不管搜索那个值都会出现一般的结果。
3:使用短索引,如果对字符串列进行索引,应该制定一个前缀长度。
4:利用最左索引。在创建一个N列的索引的时候实际是创建了Mysql可利用的N个索引。多列索引可起几个索引的作用,因为可以使用索引最左边的列集进行匹配,右边的进行排序。
5:不要过度使用索引。
HASH索引:
索引问题:
Mysql如何使用索引:
对于多列索引查询条件只要使用最左边的列,一般都会使用索引。
CREATE INDEX sal_com ON sales(company_id,moneys);
SELECT * FROM sales WHERE company_id > 100;使用了索引
SELECT * FROM sales WHERE moneys > 100;不使用了索引
对于是用LIKE查询的 如果 %在字符串后面使用索引。
SELECT* FROM sales WHERE name LIKE ‘mm%‘;
如果对于大文本搜索不要使用 LIKE ‘% %’ 使用全文索引
如果列名是索引使用 field is NULL 将使用索引
存在索引但是不实用索引:
1:Mysql 估计使用索引会更慢,比如数据小于10的时候
2:使用 MEMORY/HEAP表并且不实用 = 进行索引列
3: 用 OR分割条件 如果有任何一边没使用索引
4:用LIKE以 %开始
5:如果列是字符串,一定要用单引号括起来,或者不实用索引
查看索引使用情况:
SHOW status LIKE ‘Handler_read%‘;
标签:
原文地址:http://www.cnblogs.com/phplhs/p/4377848.html