由于在笔试中遇到写sql语句的题目,犯了低级错误,这里学习并总结一下,遇到相关的继续更新。。。
数据定义
1.创建数据库
create database testdb;
2.创建空表
需要指明表明、字段名及其属性
crate table usertb (uid int, name varchar(4));
3.创建索引
在表或者表的常用列上创建索引加速查询。
create index tIndex on table1 (tid);
4.删除索引
- mysql中
alter table table1 drop index tIndex;
5.创建视图
- 视图定义后可以当作基本表使用。
- 组成视图的属性列名全部指定或者全部省略。关系数据库管理系统执行创建视图命令只是将视图的定义存入数据字典中,在对视图查询时才执行其中的SELECT语句。
create view vstu (sname) as select sname from student;
6. 删除视图
drop view vstu;
- 视图的作用:
- 简化用户操作
- 关注需要的数据
- 保护机密数据
- 清晰的表达某些查询
7.修改表结构
使用alter语句修改
- 添加、删除、修改列
alter table table1 add column context varchar(255);
later table table1 drop column context;
alter table table 1 modify column context char(50);
- 修改表结构,改变表字段的约束
- 修改约束
alter table table1 modify id not null;
- 添加约束
alter table table1 add unique (id);
- 修改约束
数据查询
使用select [distinct] from语句,返回数据库中的数据,distinct用于合并相同的值,返回唯一不同的值。
1.单表查询
单表查询指仅涉及一个表的查询。可以通过where子句查询满足条件的元组的全部或者部分属性列。
- 查询条件
- 比较运算,=、<>、>=等、NOT+比较运算符
- 范围,[NOT] BETWEEN AND
- 集合,[NOT] IN
- 字符匹配,[NOT] LIKE,使用%(代表任意字符串)和_(代表单个字符)通配符
- 空值,IS [NOT] NULL
- 多重条件,AND、OR、NOT
- 聚集函数
- COUNT()统计元组个数
- SUM([distinct])
- AVG()
- MAX()
- MIN()
- 注意:只有count(*)处理空值(因为空值不影响计数,其他函数跳过空值);聚集函数只能用于select子句和group by中的having子句中,不能用于where子句中。
- GROUP BY
- 对查询结果分组,用于细化聚集函数的作用对象,即聚集函数作用于每一组。
- 如果分组后还需要筛选,使用HAVING短语指定条件。
- WHERE子句作用于基本表或者视图,从中选择满足条件的元组;而HAVING短语作用于组,从中选择满足条件的组。
- ORDER BY
- 对查询结果按指定属性列排序,默认升序(ASC),可以使用DESC指定降序。
2.连接查询
连接查询指涉及两个以上的表的查询。需要使用where子句作为连接条件。
- 等值连接:连接运算符为=
- 非等值连接:连接运算符非=
- 自然连接:在等值连接中去掉目标列中的重复列
- 自身连接:一个表与自己进行连接,需要取两个别名
- 外连接:将表的悬浮元组也保存在结果关系中,而将其他属性上填空值。INNER JOIN ON
- 左外连接:只保留左边关系的悬浮元组,LEFT JOIN ON
- 右外连接:只保留右边关系的悬浮元组,RIGHT JOIN ON
3.嵌套查询
将一个SELECT-FROM-WHERE语句嵌套在另一个查询块的WHERE子句或者HAVING短语条件中的查询称为嵌套查询。
- 上层查询块称为父查询,下层查询块称为子查询。
- 子查询的SELECT语句不能使用ORDER BY子句,ORDER BY子句只能对最终结果排序。
- 相关子查询:子查询的查询条件依赖于父查询。
先从外层查询中取一个元组传给内层查询,执行内存查询后的结果再作为条件进行外层查询,需要反复求值直到外层查询的元组全部处理完毕。 - 不相关子查询:子查询的查询条件不依赖于父查询。由里向外先执行子查询,进而作为条件进行父查询。
- 相关子查询:子查询的查询条件依赖于父查询。
4.集合查询
SELECT语句查询结果为元组的集合,因此可以对多个SELECT语句的结果进行集合操作。进行集合操作的集合必须具有相同的属性列及其数据类型。
- 并操作UNION
- 交操作INTERSECT
- 差操作EXCEPT
5. IF查询
IF(条件表达式,"结果为true",'结果为false')
6. 临时表查询
select得出一个临时表,然后在外层使用select where关联这张临时表;
用于一个表生成的数据与原数据对比。
数据更新
1.插入数据
insert into usertb (uid, name) values(1000, 'zhangsan');
2.修改数据
update语句用来更新表中的一行记录。
- 样例:
update table1 set name='www', context='baidu' where id=1000;
- 注意:一定要使用where子句,否则会更新整个表的数据,mysql数据库可以使用
set sql_safe_updates=1;
命令来开启强制使用where子句
3.删除数据
- delete语句用来删除表中的记录。
- 样例:删除一条记录使用
delete from table1 where name='www';
- 删除所有记录使用
delete from table1;
或者delete * from table1;
,但是表的结构还在,只是数据被删除
- 样例:删除一条记录使用
- drop语句直接删除一个表或者数据库,并释放空间。
- 样例:
drop table table1;
或者drop database testdb;
- 样例:
- truncate语句删除一个表中的所有数据,并释放空间,表结构还在。
- 样例:
truncate table table1;
- 样例:
- 三者比较
分页
返回指定数目的记录对于大数据量记录的表非常有用。
1.mysql使用limit分页
select * from table limit M,N;
表示从表中取M之后的N条记录,不包含M。如果数据量很大导致M很大,则MySQL会先扫描前M条记录导致性能下降,所以需要优化。
limit优化通常是先用主键索引到初始位置M,再截取需要的记录。优化方法有三种:
- 先通过条件限定主键位置,再从该位置开始截取后面的记录
select * from table where table.id > M order by table.id limit N;
- 使用子查询限定主键位置,再从该位置开始截取后面的记录
select * from table where table.id > (select id from table limit M,1) limit N;
- 如果主键有序不变,使用BETWEEN AND直接限定范围
2. Oracle使用rownum分页
- 样例:
select * from table1 where rownum<=5;
3.sql server、access使用top分页
top后可以直接跟数字或者百分比
- 样例:
select top 50 percent * from table1;
复制表(备份)
涉及insert into select 和select into from两种形式的语句
1.Oracle数据库
select * into table2 from table1;
要求table2不存在,运行结果会自动插入到新建的表中insert into table2 select * from table1;
要求table2必须存在
2.MySQL数据库
- table2不存在时,运行select into from语句会报错1327 - Undeclared variable: table2,即MySQL不支持这种写法,转换为
create table table2 select * from table1;
- table2存在时可以使用insert into from语句