非关系型数据库NOSQL NOSQL(Not Only SQL)泛指非关系型数据库。关系型数据库在超大规模和高并发的web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题。NOSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题。常见的非关系型数据库管理系统有Memcached、MongoDB,redis,HBase等。
SQL Server SQL Server是由Microsoft开发和推广的关系型数据库,SQL Server的功能比较全面、效率高,可以作为中型企业或单位的数据库平台。SQL Server可以与Windows操作系统紧密继承,无论是应用程序开发速度还是系统事务处理运行速度,都能得到大幅度提升。但是,SQL Server只能在Windows系统下运行,毫无开放性可言。
MySQL MySQL是一种开放源代码的轻量级关系型数据库,MySQL数据库使用最常用的结构化查询语言(SQL)对数据库进行管理。由于MySQL是开放源代码的,因此任何人都可以在General Public License的许可下下载并根据个人需要对其缺陷进行修改。 由于MySQL数据库体积小、速度快、成本低、开放源码等优点,现已被广泛应用于互联网上的中小型网站中,并且大型网站也开始使用MySQL数据库,如网易、新浪等。
开放源代码 MySQL最强大的优势之一在于它是一个开放源代码的数据库管理系统。开源的特点是给予了用户根据自己需要修改DBMS的自由。MySQL采用了General Public License,这意味着授予用户阅读、修改和优化源代码的权利,这样即使是免费版的MySQL的功能也足够强大,这也是为什么MySQL越来越受欢迎的主要原因。
设置密码永不过期 alter user ‘root’@’localhost’ identified by ‘root’ password expire never; 设置加密规则为mysql_native_password alter user ‘root’@’localhost’ identified with mysql_native_password by ‘root’; 重新访问navicat,提示连接成功。
-- 修改表中数据 update t_student set sex ='女' ; update t_student set sex ='男'where sno =10 ; UPDATE T_STUDENT SET AGE =21WHERE SNO =10; update t_student set CLASSNAME ='java01'where sno =10 ; update t_student set CLASSNAME ='JAVA01'where sno =9 ; update t_student set age =29where classname ='java01'; -- 删除操作: deletefrom t_student where sno =2;
自增约束(AUTO_INCREMENT)可以使表中某个字段的值自动增加。一张表中只能有一个自增长字段,并且该字段必须定义了约束(该约束可以是主键约束、唯一约束以及外键约束),如果自增字段没有定义约束,数据库则会提示“Incorrect table definition; there can be only one auto column and it must be defined as a key”错误。
-- 对emp表查询: select*from emp; -- *代表所有数据 -- 显示部分列: select empno,ename,sal from emp; -- 显示部分行:where子句 select*from emp where sal >2000; -- 显示部分列,部分行: select empno,ename,job,mgr from emp where sal >2000; -- 起别名: select empno 员工编号,ename 姓名,sal 工资 from emp; -- as 省略,''或者""省略了 -- as alias 别名 select empno as 员工编号,ename as 姓名,sal as 工资 from emp; select empno as'员工编号',ename as "姓名",sal as 工资 from emp; -- > 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '编号,ename as "姓 名",sal as 工资 from emp' at line 1 -- 错误原因:在别名中有特殊符号的时候,''或者""不可以省略不写 select empno as 员工 编号,ename as "姓 名",sal as 工资 from emp; -- 算术运算符: select empno,ename,sal,sal+1000as'涨薪后',deptno from emp where sal <2500; select empno,ename,sal,comm,sal+comm from emp; -- ???后面再说 -- 去重操作: select job from emp; selectdistinct job from emp; select job,deptno from emp; selectdistinct job,deptno from emp; -- 对后面的所有列组合 去重 ,而不是单独的某一列去重 -- 排序: select*from emp orderby sal; -- 默认情况下是按照升序排列的 select*from emp orderby sal asc; -- asc 升序,可以默认不写 select*from emp orderby sal desc; -- desc 降序 select*from emp orderby sal asc ,deptno desc; -- 在工资升序的情况下,deptno按照降序排列
-- 查看emp表: select*from emp; -- where子句:将过滤条件放在where子句的后面,可以筛选/过滤出我们想要的符合条件的数据: -- where 子句 + 关系运算符 select*from emp where deptno =10; select*from emp where deptno >10; select*from emp where deptno >=10; select*from emp where deptno <10; select*from emp where deptno <=10; select*from emp where deptno <>10; select*from emp where deptno !=10; select*from emp where job ='CLERK'; select*from emp where job ='clerk'; -- 默认情况下不区分大小写 select*from emp wherebinary job ='clerk'; -- binary区分大小写 select*from emp where hiredate <'1981-12-25'; -- where 子句 + 逻辑运算符:and select*from emp where sal >1500and sal <3000; -- (1500,3000) select*from emp where sal >1500&& sal <3000; select*from emp where sal >1500and sal <3000orderby sal; select*from emp where sal between1500and3000; -- [1500,3000] -- where 子句 + 逻辑运算符:or select*from emp where deptno =10or deptno =20; select*from emp where deptno =10|| deptno =20; select*from emp where deptno in (10,20); select*from emp where job in ('MANAGER','CLERK','ANALYST'); -- where子句 + 模糊查询: -- 查询名字中带A的员工 -- %代表任意多个字符 0,1,2,..... select*from emp where ename like'%A%' ; -- -任意一个字符 select*from emp where ename like'__A%' ; -- 关于null的判断: select*from emp where comm isnull; select*from emp where comm isnotnull; -- 小括号的使用 :因为不同的运算符的优先级别不同,加括号为了可读性 select*from emp where job ='SALESMAN'or job ='CLERK'and sal >=1500; -- 先and再or and > or select*from emp where job ='SALESMAN'or (job ='CLERK'and sal >=1500); select*from emp where (job ='SALESMAN'or job ='CLERK') and sal >=1500;
-- inner join - on子句: 显示的是所有匹配的信息 select* from emp e innerjoin dept d on e.deptno = d.deptno; select*from emp; select*from dept; -- 问题: -- 1.40号部分没有员工,没有显示在查询结果中 -- 2.员工scott没有部门,没有显示在查询结果中 -- 外连接:除了显示匹配的数据之外,还可以显示不匹配的数据 -- 左外连接: left outer join -- 左面的那个表的信息,即使不匹配也可以查看出效果 select* from emp e leftouterjoin dept d on e.deptno = d.deptno; -- 右外连接: right outer join -- 右面的那个表的信息,即使不匹配也可以查看出效果 select* from emp e rightouterjoin dept d on e.deptno = d.deptno; -- 全外连接 full outer join -- 这个语法在mysql中不支持,在oracle中支持 -- 展示左,右表全部不匹配的数据 -- scott ,40号部门都可以看到 select* from emp e fullouterjoin dept d on e.deptno = d.deptno; -- 解决mysql中不支持全外连接的问题: select* from emp e leftouterjoin dept d on e.deptno = d.deptno union-- 并集 去重 效率低 select* from emp e rightouterjoin dept d on e.deptno = d.deptno; select* from emp e leftouterjoin dept d on e.deptno = d.deptno unionall-- 并集 不去重 效率高 select* from emp e rightouterjoin dept d on e.deptno = d.deptno; -- mysql中对集合操作支持比较弱,只支持并集操作,交集,差集不支持(oracle中支持) -- outer可以省略不写
1 2 3 4 5 6 7 8 9 10
-- 查询员工的编号、姓名、薪水、部门编号、部门名称、薪水等级 select*from emp; select*from dept; select*from salgrade; select e.ename,e.sal,e.empno,e.deptno,d.dname,s.* from emp e rightouterjoin dept d on e.deptno = d.deptno innerjoin salgrade s on e.sal between s.losal and s.hisal
内连接和外连接的区别
内连接只显示符合连接条件的记录,外连接除了显示符合条件的记录外,还显示表中的记录
99语法:自连接查询
1 2 3 4 5 6 7 8 9 10 11
-- 查询员工的编号、姓名、上级编号,上级的姓名 select*from emp; select e1.empno 员工编号,e1.ename 员工姓名,e1.mgr 领导编号,e2.ename 员工领导姓名 from emp e1 innerjoin emp e2 on e1.mgr = e2.empno; -- 左外连接: select e1.empno 员工编号,e1.ename 员工姓名,e1.mgr 领导编号,e2.ename 员工领导姓名 from emp e1 leftouterjoin emp e2 on e1.mgr = e2.empno;
-- 查询员工的编号,员工姓名,薪水,员工部门编号,部门名称: select e.empno,e.ename,e.sal,e.deptno,d.dname from emp e,dept d -- 相当于99语法中的cross join ,出现笛卡尔积,没有意义 select e.empno,e.ename,e.sal,e.deptno,d.dname from emp e,dept d where e.deptno = d.deptno; -- 相当于99语法中的natural join -- 查询员工的编号,员工姓名,薪水,员工部门编号,部门名称,查询出工资大于2000的员工 select e.empno,e.ename,e.sal,e.deptno,d.dname from emp e,dept d where e.deptno = d.deptno and e.sal >2000; -- 查询员工的名字,岗位,上级编号,上级名称(自连接): select e1.ename,e1.job,e1.mgr ,e2.ename from emp e1,emp e2 where e1.mgr = e2.empno; -- 查询员工的编号、姓名、薪水、部门编号、部门名称、薪水等级 select e.empno,e.ename,e.sal,e.deptno,d.dname,s.grade from emp e,dept d,salgrade s where e.deptno = d.deptno and e.sal >= s.losal and e.sal <= s.hisal; -- 总结: -- 1.92语法麻烦 -- 2.92语法中 表的连接条件 和 筛选条件 是放在一起的没有分开 -- 3.99语法中提供了更多的查询连接类型:cross,natural,inner,outer
子查询
不相关子查询
单行子查询
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
-- 单行子查询: -- 查询工资高于平均工资的雇员名字和工资。 select ename,sal from emp where sal > (selectavg(sal) from emp); -- 查询和CLARK同一部门且比他工资低的雇员名字和工资。 select ename,sal from emp where deptno = (select deptno from emp where ename ='CLARK') and sal < (select sal from emp where ename ='CLARK') -- 查询职务和SCOTT相同,比SCOTT雇佣时间早的雇员信息 select* from emp where job = (select job from emp where ename ='SCOTT') and hiredate < (select hiredate from emp where ename ='SCOTT')
-- 多行子查询: -- 【1】查询【部门20中职务同部门10的雇员一样的】雇员信息。 -- 查询雇员信息 select*from emp; -- 查询部门20中的雇员信息 select*from emp where deptno =20;-- CLERK,MANAGER,ANALYST -- 部门10的雇员的职务: select job from emp where deptno =10; -- MANAGER,PRESIDENT,CLERK -- 查询部门20中职务同部门10的雇员一样的雇员信息。 select*from emp where deptno =20 and job in (select job from emp where deptno =10) -- > Subquery returns more than 1 row select*from emp where deptno =20 and job =any(select job from emp where deptno =10) -- 【2】查询工资比所有的“SALESMAN”都高的雇员的编号、名字和工资。 -- 查询雇员的编号、名字和工资 select empno,ename,sal from emp -- “SALESMAN”的工资: select sal from emp where job ='SALESMAN' -- 查询工资比所有的“SALESMAN”都高的雇员的编号、名字和工资。 -- 多行子查询: select empno,ename,sal from emp where sal >all(select sal from emp where job ='SALESMAN'); -- 单行子查询: select empno,ename,sal from emp where sal > (selectmax(sal) from emp where job ='SALESMAN'); -- 【3】查询工资低于任意一个“CLERK”的工资的雇员信息。 -- 查询雇员信息 select*from emp; -- 查询工资低于任意一个“CLERK”的工资的雇员信息 select* from emp where sal <any(select sal from emp where job ='CLERK') and job !='CLERK' -- 单行子查询: select* from emp where sal < (selectmax(sal) from emp where job ='CLERK') and job !='CLERK'
-- 【1】查询最高工资的员工 (不相关子查询) select*from emp where sal = (selectmax(sal) from emp) -- 【2】查询本部门最高工资的员工 (相关子查询) -- 方法1:通过不相关子查询实现: select*from emp where deptno =10and sal = (selectmax(sal) from emp where deptno =10) union select*from emp where deptno =20and sal = (selectmax(sal) from emp where deptno =20) union select*from emp where deptno =30and sal = (selectmax(sal) from emp where deptno =30) -- 缺点:语句比较多,具体到底有多少个部分未知 -- 方法2: 相关子查询 select*from emp e where sal = (selectmax(sal) from emp where deptno = e.deptno) orderby deptno -- 【3】查询工资高于其所在岗位的平均工资的那些员工 (相关子查询) -- 不相关子查询: select*from emp where job ='CLERK'and sal >= (selectavg(sal) from emp where job ='CLERK') union ...... -- 相关子查询: select*from emp e where sal >= (selectavg(sal) from emp e2 where e2.job = e.job)
-- 定义一个没有返回值 存储过程 -- 实现:模糊查询操作: select*from emp where ename like'%A%'; createprocedure mypro01(name varchar(10)) begin if name isnullor name = "" then select*from emp; else select*from emp where ename like concat('%',name,'%'); end if; end; -- 删除存储过程: dropprocedure mypro01; -- 调用存储过程: call mypro01(null); call mypro01('R'); -- 定义一个 有返回值的存储过程: -- 实现:模糊查询操作: -- in 参数前面的in可以省略不写 -- found_rows()mysql中定义的一个函数,作用返回查询结果的条数 createprocedure mypro02(in name varchar(10),out num int(3)) begin if name isnullor name = "" then select*from emp; else select*from emp where ename like concat('%',name,'%'); end if; select found_rows() into num; end; -- -- 调用存储过程: call mypro02(null,@num); select@num; call mypro02('R',@aaa); select@aaa;