SQL语句分类
1、数据定义语言DDL CREATE,DROP,ALTER对逻辑结构等有操作的,其中包括表结构,视图和索引
2、数据查询语言DQL 各种简单查询,连接查询等
3、数据操纵语言DML 对数据进行操作的,数据操纵分成数据查询和数据更新两类
4、数据控制功能DCL GRANT,REVOKE,COMMIT,ROLLBACK主要为以上操作 即对数据库安全性完整性等有操作的,可以简单的理解为权限控制等。
查询
关联查询
交叉连接cross join,很少使用 内连接 inner join,简写为join 外连接:left join/right jion 联合查询(union、union all):前提,两张表的列数要一致,union会合并相同的行,union all不会
有一个显而易见的SQL优化的方案是,当两张表的数据量比较大,又需要连接查询时,应该使用 FROM table1 JOIN table2 ON xxx的语法,避免使用 FROM table1,table2 WHERE xxx 的语法,因为后者会 在内存中先生成一张数据量比较大的笛卡尔积表,增加了内存的开销。
子查询
条件:一条SQL语句的查询结果做为另一条查询语句的条件或查询结果 嵌套:多条SQL语句嵌套使用,内部的SQL查询语句称为子查询。
1、子查询是单行单列的情况:结果集是一个值,父查询使用:=、 <、 > 等运算符 – 查询工资最高的员工是谁?
select * from employee where salary=(select max(salary) from employee);
2、子查询是多行单列的情况:结果集类似于一个数组,父查询使用:in 运算符
select * from emp where dept_id in (select id from dept where name in("开发部","财务部"));
select name from dept where id in (select dept_id from emp where salary > 5000);
3、子查询是多行多列的情况:结果集类似于一张虚拟表,不能用于where条件,用于select子句中做为子表 – 1) 查询出2011年以后入职的员工信息-- 2) 查询所有的部门信息,与上面的虚拟表中的信息比对,找出所有部门ID相等的员工。select * from dept d, (select * from employee where join_date > ‘2011-1-1’) e where e.dept_id = d.id;
– 使用表连接:select d., e. from dept d inner join employee e on d.id = e.dept_id where e.join_date > ‘2011-1-1’
mysql中 in 和 exists 区别 in查询相当于多个or条件的叠加 exists语句是对外表作loop循环,每次loop循环再对内表进行查询。 区别: 1.如果查询的两个表大小相当,那么用in和exists差别不大。 2.如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in。 3.not in 和not exists:如果查询语句使用了not in,那么内外表都进行全表扫描,没有用到索引;而not extsts的子查询依然能用到表上的索引。所以无论那个表大,用not exists都比not in要快。
常用sql语句
查
查询:Select * from table_name 字段查询:select fileds from table_name 条件查询:Select * from table_name where xx 排序: Select * from table_name order by x sec 分页:Select * from table_name limit 0,10 去重:Select distinct(x) from table_name
条件查询 比较:= > < <>(不等于) 通配:like 范围限定 :and 子集限定:in 逻辑关系:and or not
聚合查询 语法:group by 字段 having 条件 常用函数 count,max,min,sum,avg
select count(字段) from 表 group by 字段 select count(字段) from 表 group by 字段 having 字段=’xx’
LIMIT n 等价于 LIMIT 0,n。
增
Insert into 表(字段)valuse(数据)
提高数据插入效率的基本原则:
- 批量插入数据的效率比单数据行插入的效率高
- 插入无索引的数据表比插入有索引的数据表快一些
- 较短的SQL语句的数据插入比较长的语句快
使用load data语句要比INSERT语句效率高,因为它批量插入数据行。服务器只需要对一个语句(而不是多个语句)进行语法分析和解释。索引只有在所有数据行处理完之后才需要刷新,而不是每处理一行都刷新。
如果只能使用INSERT语句,那就要使用将多个数据行在一个语句中给出的格式:INSERT INTO table_name VALUES(…),(…),…,这将会减少你需要的语句总数,最大程度地减少了索引刷新的次数。
LOAD DATA LOCAL INFILE 'dump.txt' INTO TABLE mytbl;
改
Update 表 set 字段=赋值 where xx
删
Delete from 表 where 条件
drop、delete与truncate的区别 因此,在不再需要一张表的时候,用drop; 在想删除部分数据行时候,用delete; 在保留表而删除所有数据的时候用truncate。
|