SQL简介:
诞生于七十年代的IBM公司,最初被称为结构化查询语句。
关系型数据库系统的十二条规则:
0.关系型数据库必须通过关系来实现对数据的完全管理
1.所有在关系型数据库的信息均可以在表中以数值的形式加以体现。
2.在关系型数据库中的每一项数据均可以通过库名,键名和列名来准确指定。
3.关系型数据库系统必须对空值提供系统级的支持。有独特的缺省值,而且具有独立域。
4.活动的,即时的数据联合-它的意思就是在数据库中的数据应有逻辑表格的行的形式来表达,并且可以通过数据处理语言来访问。12.任何程序不可能使用更低级的语言从而绕过数据库语言的有效性规则定义。
SQL是操作和检索关系型数据库的事实上的标准语言,它允许程序员和数据库管理元做如下的工作:
1.更改数据库的结构//去掉重复的列
select DISTINCT name from users;
//每列都加2,都减2
select age,age+2,age-2 from users;
//每列都除以2,都乘以2
select age,age/2,age*2 from userinfo;
//对某一列进行取模的两种方式
select age,age%2 from userinfo;
select age,MOD(age,2) from userinfo;
//where 条件不等于的两种方式
select * from userinfo where age != 30; select * from userinfo where age <> 30;
//where 条件模糊查询
select * from userinfo where username like 'z%';
//拼接两列
select *, CONCAT(username," ",email) from userinfo;
//查找某列不为null 的记录
select * from userinfo where email is not null;
union all 与union 一样对表进行了合并,但是它不去掉重复的记录。
//intersect(相交:返回两个表中共有的行) [mysql 不支持该操作符]
select * from userinfo
intersect
select * from userinfo_copy;
//minus(相减:minus返回的记录是存在于第一个表中但不存在第二个表中的记录) [mysql 不支持改操作符]
select * from userinfo
minus
select * from userinfo_copy;
//sum:返回某一列的所有数值的和
select sum(singles) from teamstats;
//求平均数
//select *,avg(age) from users group by name;
//求最大值
select*,max(age) from users group by name;
//求最小值
select *,min(age) from users group by name;select* from users where age in(24,18,20);
//where 条件在...~...范围之间
select * from price where wholesale >0.25 and wholesale < 0.75
//where 条件在...~...范围之间select * from price where wholesale between 0.25 and 0.75
//统计
select *,count(age) from users group by name;
//求方差
select * ,variance(hits) from teamstats
//标准差
select * ,stddev(hits) from users;
//绝对值
select abs (a) absolute_value from numbers
//将给定的日期增加2个月[mysql不支持该函数]
select *,add_months(updateTime,2) from userinfo;
//mysql将给定的日期增加2个月
select *,adddate(now(), interval 2 month),adddate(updateTime, interval 2 month) from userinfo;
//返回指定月份最后一天
select last_day(updateTime) from userinfo;
//给定的两个日期中间隔多少个月[慎用,因为每月天数不固定,返回近似值,从2月1到2-28它返回0]
select task startdate enddate months between(startdate,enddate) duration from project
// 返回与指定日期在同一个星期或之后一个星期内的,你所要求的星期天数的确切日期(如果你想知道你锁指定的日期的星期五是几号)[mysql不支持该函数]
select next_day(sysdate,1) from dual;
//返回系统日期的两种方式
select SYSDATE(); select now();
//向上取整
select *,CEIL(framesize) from bikes;
//向下取整
select *,FLOOR(framesize) from bikes;
//返回给定的参数为指数,以e为底数的幂值
select *,EXP(framesize) from bikes;
//对数函数,LN返回给定参数的自然对数
select *,LN(framesize) from bikes;select *,LOG(framesize) from bikes;
//返回某一个数对另一个数的幂,在使用幂函数时,第一个参数为底数,第二个指数
select *,POWER(framesize,2) from bikes;
//该函数返回参数的平方根,负数不能开平方,所以得先取其绝对值
select *,SQRT(ABS(framesize)) from bikes;
//将参数的第一个字母变为大写,此外其他的字母则转换成小写[mysql 不支持该函数]
select *, initcap(username) from userinfo;
//变小写
select * , lower(username)from userinfo;
//变大写
select * , upper(username)from userinfo;//不够补字
select * , lpad(username,15,'&')from userinfo;不够补字
select * , rpad(username,15,'&')from userinfo;//去左空格
select * , ltrim(username)from userinfo;//去右空格
select * , rtrim(username)from userinfo;//替换给定字符
select * , replace(username,'o', '**')from userinfo;
//统计某个库下有多少table表
select count(table_name) from information_schema.`tables` where table_schema='test';
//截取字符串,下标从0开始,截取两位
select SUBSTR(username, 1 , 2)from userinfo;
//返回字符串的长度
select length(username) from userinfo;
//指定列转换成字符[mysql不支持:to_number/to_char]
select *,to_char(sex) from userinfo;
//返回最大的
select GREATEST('A','BC','DEF') from dual;
//HAVING 对由sum或其它集合函数运算结果的输出进行限制。
select name,money from userinfo group by name having sum(money) >500
//插入语句
insert into tableName(col1,col2)values(value1,value2)
插入数据遵循的三条规则:
1.你所要插入的数值与它所对应的字段必须具有相同的数据类型
2.数据的长度必须小于字段的长度
3.插入的数值列表必须与字段的列表相对应
insert select 语句遵循的规则:
1.select 语句不能从被插入数据的表中选择行
2.insert into 中的列数必须与select语句返回的列数相同
3.insert into 中的数据类型要与select 语句返回的数据类型相同
//拷贝表数据
insert into userinfo_copy select * from userinfo
//选定列,拷贝表数据
insert into userinfo_copy(id,username) select id,username from userinfo
//修改某一列增加10%,千万别直接用10% ,需用0.1
update bikes set framesize = framesize+ framesize*0.1 where id = 3//创建数据库
create database yidiandian;
//使用当前数据库
use yidiandian1.数据库的设计意图,谁将会使用它
2.数据库的自身资料:用什么创建的数据库,数据库的大小是多少,日志文件的尺寸是多少Oracle 标准 |
|
数据类型 |
说明 |
char |
可以存储长度为1~255个字符的字符串,空格会被填充到字符串的右边以保证其内容满足定义的长度 |
date |
包括日期的世纪,年,月,日,时,分,秒 |
longraw |
可以存储长达2G的二进制内容 |
number |
零,正值或负值的定点或浮点数 |
raw |
可以存储不过255个字节的二进制代码 |
rowid |
用一个十六进制的数来标明当前行在表内的唯一地址 |
Varchar2 |
变长的字母或数字,长度可以从1到2000 |
[mysql 不支持]
create table new_userinfo(id,username)as(select id ,username from userinfo)//修改表增加一列
alter table userinfoadd mouse varchar(20)
//修改表修改一列类型的长度
alter table userinfo视图常常被称为虚表,它是用create view语句建立起来的,在视图建立后,可以对视图采用如下命令:
select, insert, input, update, delete
索引是与磁盘上数据的存储方式不同的另外一种组织数据的方法,索引的特例是表中记录依据其在磁盘上的存储位置显示,索引可以在表中创建一个列或列的组合。当应用索引以后,数据会暗战你使用create index 语句所定义的排序方式返回给用户,通过对正确的 ,特定的两个表的归并字段进行索引可以获得明显的好处。
drop view v_name
使用索引:
使用索引是另外一种让数据提供给用户的形式与它在数据库中不同的方法,此外,索引可以让存储在磁盘上的数据进行重新排序
使用索引的原因:
1.在使用unique关键字时强制性的保证数据的完整性
2.可以容易的用索引字段或其他字段进行排序
3.提高查询的执行速度
create index index_name on table_name(column_name)
drop index index_name
使用索引的技巧:
1.对于小表,使用索引对于性能不会有任何提高
2.当你的索引劣种有极多的不同的数据和空值时索引会使性能有极大的提高
3.当查询要返回的数据很少时索引可以优化你的查询(25%)
4.索引可以提高数据的返回速度,但是它使得数据的更新操作变慢,在对大量记录进行更新时,应该先删除索引,当执行更新操作后,恢复索引。
5.索引会占用你的数据库的空间。设计数据库的可用空间时要考虑索引所占用的空间
6.对字段的索引已经对两个表进行了归并操作,这一技术可以极大的提高归并的速度
7.不要对经常需要更新或修改的字段创建索引,更新索引的开销会降低你所期望获得的性能
8.不要将索引与表存储在同一个驱动器上,分开存储会去掉访问的冲突从而使结果返回得更快
4.使复杂查询的构筑简单化
事务控制[事务处理]是知关系数据库系统执行数据库事务的能力,事务是指在逻辑上必须完成的一命令序列的单位,单位工作期是指事务的开始和结束使其。如果在事务中产生的错误,那么整个过程可以根据需要被终止。
//删除用户
drop user username;
//添加角色
grant role to user
//删除角色
revoke role from user;
//创建视图的权利
grant crate view to userName;
使用触发机制时的限制:
1.当你在使用触发机制时你必须要知道它有如下的使用机制:
2.不能在临时表中创建触发机制
3.触发机制必须在当前的表所在的数据库中创建
4.不能在视图中创建触发机制
5.当表被删除以后,所有与之相关的触发机制会被自动的删除
SQL 语句优化以提高其性能:
1.使用索引可以提高数据的访问速度
2.避免使用or.or 会不可避免的根据表的大小降低查询速度,in通常会比or要快。
3.并发操作越多,数据库性能下降的可能性越大
4.删除索引以优化数据的载入