数据库基础知识-SQL语句

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("开发部","财务部")); 

-- 查询工资大于 5000 的员工,来自于哪些部门的名字
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的区别
> 三者都表示删除,但是三者有一些差别: 	Delete	Truncate	Drop类型	属于DML	属于DDL	属于DDL 回滚	可回滚	不可回滚	不可回滚删除内容	表结构还在,删除表的全部或者一部分数据行	表结构还在,删除表中的所有数据	从数据库中删除表,所有的数据行,索引和权限也会被删除删除速度	删除速度慢,需要逐行删除	删除速度快	删除速度最快
因此,在不再需要一张表的时候,用drop;
在想删除部分数据行时候,用delete;
在保留表而删除所有数据的时候用truncate。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值