什么是数据库?数据库就是用来存储和管理数据的仓库。首先我来简单介绍一下各数据库的背景,常见的数据库如下,oracle:甲骨文公司(市场占用率最高),oracle也是一个公司名,翻译过来就是甲骨文的意思。sql server:微软公司(大学课堂经常用到)。DB2:IBM公司,mysql:甲骨文公司,Sysbase:赛尔斯公司。
关于mysql这里有个小插曲,不妨来说一下。最早mysql是个开元的项目,08年Sun公司把他收购了,在泡沫经济最厉害的时候,价值达到2000亿美金。由于经营不善,加上mysql开元免费,最后坚持不下去了。Sun公司跟IBM公司关系非常好,打算把mysql卖给IBM。但是呢IBM出的价钱没有达到Sun要求的价钱,好像是每股差1毛钱,不欢而散。这时候oracle说了,我多给你一毛。最后,Sun一生气,得,我就跟他成交了,我就不跟你IBM成交。最后核算下来是74亿美金,IBM的开价是73亿美金,差了一亿。2000亿的东西卖了70多亿。(PS:大家看看就好啦~别太认真,权当了解一下。)
我所在的公司用的是oracle数据库,也是这几天才开始学习,持续更新。有很多需要思考的地方。
i.专业术语:
RDBMS:关系型数据库管理系统。
ddl:对数据库或表的结构操作。
dml:对表的记录进行更新。
dql:对表的记录查询。
dcl:对用户的创建及授权。
ii.数据类型:
double:浮点型。例如double(5,2)表示最多五位,其中必须有两位小数,最大值为999.99。
decimal:浮点型。本意是十进制的意思,不会出现精度缺失,多用来表示与钱相关的。
int:整型;char:固定长度字符串类型;varchar:可变长度字符串类型。
clob:表示大字符;blob:表示二进制字符,用来存储电影音频等;
date:日期类型,格式为:yyy--mm--dd;
time:时间类型,格式为:hh:mm:ss;
timestamp:时间戳类型,年月日分时秒。
注意:在数据库中所有的字符串类型必须使用单引号,不能使用双引号,日期类型也用单引号。
(一)ddl:对表的操作。
1.创建表:create table 表名(列名 列类型,列名 列类型);
2.查看数据库中所有表名称:show tables;
3.删除表:drop table 表名;
4.对表添加列:alter table 表名 add(列名 列类型,列名,列类型,...);//赋值用[default 列值]
5.改变表的列类型:alter table 表名 modify 原列名 新列类型;
6.更改表名: alter table 表名 rename to 新名;
7.删除列:alter table 表名 drop column 列名;
8.修改列名:alter table 表名 rename column 原列名 to新列名;
(二)dcl(理解):对用户的创建及授权:
创建用户:create user 用户名@IP地址 IDENTIFIED BY'密码',用户只能在指定IP上登录。
create user 用户名@'%' IDENTIFIED BY'密码',用户可以在任意IP上登录。
给用户授权:grant all on 数据库 .* to 用户名@IP地址;
撤销授权:REVOKE 权限1 ON 数据库 .* from 用户名@IP地址;
查看权限:show grants for 用户名@IP地址;
删除用户:drop user 用户名@IP地址;
(三)dml:数据库操作语言,它是对表记录的操作(增、删、改)。
1.插入数据:insert into 表名 (列名1,列名2,...)values(列值1,列值2,...)。
>在表名后给出要插入的列名,其他没有指定的列等同于插入Null值,所以插入数据都是一行,没有半行。
>在values后给出列值,值的顺序和个数必须与前面指定的列相同。
insert into 表名 values(列值1,列值2)。
>没有给出要插入的列,那么表示要插入所有列。
>值的个数必须是该表列的个数,值的顺序必须与表创建时给出的列顺序相同。
2.修改数据:update 表名 set 列名1 = 列值1,列名2=列值2,......where 条件。
//注意:update修改值后必需使用commit提交,否则只在当前session有效。而且在给列值修改为Null时也用=,而不用is;
3.删除数据:*delete from 表名 where 条件; * truncate table 表名; //truncate是ddl语句,它是先drop该表,再create该表,而且无法回滚!
(四)dql:对表的记录查询 :
i.基本查询:
1.查询所有列:select * from 表名;
2.查询指定列:select 列名1,[列名2,...,列名N]from 表名;
3.完全重复记录只一次:select distinct * | 列名1,[列名2,...,列名N]from 表名;
例如select distinct sal from emp;查询员工表的工资,如果存在完全相同的工资只显示一次!
4.列运算:1)数据类型相同的列可以做加减乘除运算。这只是一种查询手段,不修改数据库的值,只在查询结果后追加一列。
select sal *1.5 from emp; select sal+com from emp; emp是员工表,sal表示工资,com表示佣金;
2) 转换NULL值:有时需要把null值转换成其他值,例如com+1000时,如果com列存在null值,那么null+1000还是null,而我们希望把null值当成0来运算。
select NVL(com,0)+1000 from emp; -->NVL(com,0)如果com中存在null值,那么当成0来运算。
3)给列起别名:你也许已经注意到了,当使用列运算后,查询出的结果集中的列名称很不好看,这时我们需要给列起个别名,这样结果集中就能显示别名
select NVL(com,0)+1000 as 奖金 from emp;--->其中as可以省略。
ii.条件查询:与前面介绍的update和delete语句一样,select语句也可以使用where子句来控制记录。
select empno, sal from emp where sal>15000;
练习:找出部门编号为10中所有经理,和部门编号为20中所有销售员的详细资料。
select * from emp where (deptno = 10 and job='经理') or (deptno=20 and job='销售员');
练习:找出部门编号为10中所有经理,和部门编号为20中所有销售员,还有既不是经理又不是销售员但其工资大于或登陆20000的所有员工的详细资料。
select * from emp where (deptno =10 and job='经理') or (deptno=20 and job='销售员') or(job not in('经理',‘销售员’) AND sal >=20000);
练习:无奖金或奖金低于1000的员工;
select * from emp where com is null or com<1000;//注意这里条件后面的null用is来赋值。
iii.模糊查询:当你想查询姓张,并且名字一共由两个字组成时,就可以使用模糊查询。
select * from emp where name like '张_';-->模糊查询需要使用like运算符,其中'_'匹配一个字符,注意,只匹配一个而不是多个。
当你想查询姓张,名字几个字都行的时候,就要使用'%'了。
select * from emp where name like '%张%';-->其中%可以匹配0到多个字符。
排序:
规则: order by 列 序, 列 序;
1.升序:select * from emp order by sal ASC;-->按sal排序,升序!其中,ASC可以省略,省略默认升序。
2.降序:select * from emp order by sal DESC;-->按sal降序排序。DESC不能省略。
3.使用多列作为排序条件:select * from emp order by sal ASC ,com DESC;
聚合函数:聚合函数用来做某列的纵向运算。
1.count(*):计算所有行不为空的数。()中可传入参数
select count(*) from emp;计算emp表中所有列不为Null的记录的行数。
select count(com)from emp;计算emp表中com列不为null的记录的行数。
2.sum():
select sum(sal) from emp;查询工资和;
3.max():
select max(sal) from emp;查询最高工资;
4.min():
select min(sal) from emp;查询最低工资;
5.avg():
select avg(sal) from emp;查询平均工资;
分组查询:group by。
举个通俗的例子,全班的同学站排,男生站一排,女生站一排,这就是用性别来分组。当然,用来分组的列必需有重复列才有意义,如果按名字或者身份证号来分,会分出很多单一的组,这样是毫无意义的。分完组之后,还要相应的查询组信息。组信息跟单行记录的信息是不同的,比如分好组之后,你属于男生这排还是女生这排,这就是在问你组信息。而你这个人的信息就是单行记录的信息。总之记住一句话,分组查询查的是组信息,不能 携带个人信息。组信息有个特点,就是都用聚合函数来表示。
select job,count(*) from emp ;没分组之前。
select job,count(*) from emp group by job;分组之后。逗号之前的字段也就是红色字体必需跟group by后面的字段一一对应。
例:select deptno,count(*)from emp where sal>15000 group by deptno having count(*)>=2;
注:前置条件用where,后置条件用having;emp是员工表,deptno是该表的列表示部门编号,sal是员工表的列表示薪水。
以部门分组,查询每组记录数。前置条件为工资大于15000,后置条件为记录数大于等于2。这句话的意思是,查询员工工资大于15000且员工数量超过2个的部门编号。
总结一下sql语句执行顺序。select from where, group by, having, order by。先执行where条件,筛选完之后分组,分完组执行having条件,最后在进行排序。