第一节课:sql语言介绍(参照PPT)及基本查询sql学习1、数据库表的介绍emp表:员工表dept表:部门表salgrady:薪资水平表Balance:2、基本的查询语句: 知识点:select * from 表名 查询表中所有的数据select 字段名1,字段名2,..from 表名 查询指定字段的所有值,不同字段之间使用逗号隔开使用算术表达式:select 字段名(运算符),字段名(运算符)...from 表名案例:select * from emp---查询所有员工信息select ename,job,sal from emp--查询员工姓名,工作,薪资查询所有员工一年的工资,以及每位员工年终3000后的所有薪资(不包括津贴)select ename,job,sal*12,sal*12+3000 from emp 使用运算符第二节课:1、使用别名as可以省略不写,如果有特殊字符获取空格使用双引号添加别名select ename 姓名,job 工作,sal*12 年资,sal*12+3000 年薪 from emp 直接在字段后面添加别名select ename "姓名",job 工作,sal*12 ’年资’,sal*12+3000 年薪 from emp 使用双引号添加别名,不能使用单引号select ename as 姓名,job "工作",sal*12 年资,sal*12+3000 年薪 from emp 使用as关键字添加别名select ename "姓 名",job 工作,sal*12 年资,sal*12+3000 年薪 from emp 如果别名中有空格或者其他特殊字符,使用双引号
2、使用链接符:select ename,job,sal from emp;select ename||job,sal from emp; 使用||符号进行字符链接select ename||‘ 的工作是 ‘||job||‘ 并且月工资是 ‘||sal from emp; 字符链接,普通字符使用单引号3、去除重复 distinctselect * from emp;select job from emp--发现工作是重复的,而工作种类是需要去除重复的问题:查看员工工作种类select distinct job from emp 使用distinct关键字去除重复值问题;怎么多字段去除重复select distinct job,sal from emp; 多字段去除重复,去除的是重复的一整条信息4、排序知识点:select 字段名,字段名...from 表名 order by 字段名select *from 表名 order by 字段名讲解:--查询员工姓名,工作,薪资select ename,job,sal from emp--查询按照薪资排序的员工姓名,工作,薪资select ename,job,sal from emp order by sal; 使用order by排序select ename,job,sal from emp order by sal desc; 使用desc关键从大到小排序select ename,job,sal from emp order by sal asc; 使用asc关键从小到大排序,默认是从小到大排序select * from emp order by sal,ename 多字段作为排序条件的时候,优先按照第一个字段排序,然后依次按照其他字段排序。select ename,job,sal 工资 from emp order by 工资 使用别名select ename,job,sal from emp order by sal*12 使用算术表达式第三节课:简单的where子句使用where条件进行结果筛选语法:select * from 表名 where 条件;注意:条件中字段值区分大小写,字段名不区分大小写,字段值使用单引号括起来1、在where中使用算术表达式 = ,< , > ,>= ,<= ,<>2、使用order by 对筛选结果进行排序,order by 出现在where后面查看工资等于1250的员工信息select * from emp where sal=‘1250‘--筛选条件是个数字也可以使用单引号查看工作等于CLERK的员工信息select * from emp where job=‘CLERK‘--在筛选条件中字段值如果是字符需要加上单引号select * from emp where job=‘clerk‘--在sql语句中字段的值是区分大小写的select * from emp where JOB=‘CLERK‘--在sql中字段是不区分大小写的查看工资大于1250的员工姓名和工作select ename,job ,sal from emp where sal>‘1250‘ order by sal--使用order by 对筛选结果进行排序,order by 出现在where后面查看工资大于等于2000的员工信息select * from emp where sal>=2000;查看工资小于等于2000的员工信息;select * from emp where sal<=2000查看工资不等于1500的员工信息select * from emp where sal<>1500 order by sal查看入职日期在81年后的员工信息select * from emp where hiredate>‘1981年12月31号‘select * from emp where hiredate>‘1981/12/31‘select * from emp where hiredate>‘31-12月-1981‘--使用日期的默认格式查询符合要求的数据,日-月-年第四节课:where子句使用关键字使用where子句进行结果的筛选知识点:where查询条件中使用关键字1、and 用于多条件的与筛选:select * from 表名 where 条件 and 条件 and 条件....2、or 用于多条件的或筛选: select * from 表名 where 条件 or 条件 or 条件....3、in 用于多条件的或筛选: select * from 表名 where 字段名 in(值,值,值....)4、like用于模糊查询: select * from 表名 where 字段名 like ‘%值%‘ 包含5、is null 和is not null 用来判断字段是否为空 select * from 表名 where 字段名 is null 讲解: 在where子句中使用关键字(and, or ,like, is null,is not null,between and,)--查询工资在2000-3000之间的员工信息select * from emp where sal>=2000 and sal<=3000--使用and关键字进行"与"的多条件筛选;select * from emp where sal between 2000 and 3000;--使用between and 关键字进行筛选;--查询工作为SALESMAN,ANALYST,MANAGER的员工信息select * from emp where job=‘SALESMAN‘ or job=‘ANALYST‘ or job=‘MANAGER‘--使用or关键字进行"或"的多条件筛选select * from emp where job in(‘SALESMAN‘,‘ANALYST‘,‘MANAGER‘);--使用in关键字进行"或"的多条件筛选select * from emp where job=‘ANALYST‘--查询姓名中包含s的,以s开头的,以s结尾的,第二个字符为A的。select * from emp where ename like ‘%S%‘;--使用like关键字,姓名中包含S的,%代表任意多个字符select * from emp where ename like ‘S%‘;--使用like关键字,以S开头的select * from emp where ename like ‘%S‘;--以S结尾的select * from emp where ename like ‘_A%‘--使用"_"指定位置包含指定字符的信息,"_"代表任意一个字符--------------查询名字中包含下划线的用户信息select * from emp where ename like ‘%A_%‘escape ‘A‘;--使用escape关键字将普通字符设置成为转译字符。--查询有津贴的员工信息select * from emp where comm is not null;select * from emp where comm is null;--查询没有津贴的员工信息第五节课:函数学习--查询工作为SALESMAN,MANAGER并且工资大于2500的员工信息--1、使用小括号提升where筛选条件的执行优先级别--2、and的优先级别高于orselect * from emp select * from emp where job=‘SALESMAN‘ or job=‘MANAGER‘ and sal>2500select * from emp where (job=‘SALESMAN‘ or job=‘MANAGER‘) and sal>2500-----------------------------------------------------------------------------------------------------------使用函数 单行函数 多行函数 转换函数 其他函数--单行函数学习:不改变原始数据,只改变结果---1、字符函数select * from emp;select INITCAP(ename) from emp;--initcap函数将首字母大写select lower(ename)from emp;--lower 字母小写select replace(ename,‘S‘,‘M‘) from emp;--replace 替换--2、数值函数--Math----伪表 dualselect * from dualselect abs(-3) 绝对值,ceil(3.1415926)向上取整,floor(3.1415926)向下取整,power(2,3)幂,round(3.4)四舍五入 from dual--3、日期函数select months_between(‘13-12月-2016‘,‘13-10月-2016‘) from dual--months_between两个日期之间的月份数第六节课:多行函数学习多行函数 : max: max(字段名) 返回此字段的最大值 min:min(字段名) 返回此字段的最小值 avg:avg(字段名) 返回平均值 sum:sum(字段名) 返回字段的和 count:count--count(*),用来查询表中有多少条记录--count(字段名),用来查询某个字段有值的个数--count(distinct 字段名),可以先去除重复再计数。 注意: --多行函数不能和普通字段直接出现在查询语句中,除非group by --多行函数和单行函数不能直接出现在查询语句中,除非group by 查看员工的最高工资select max(sal),ename from emp--多行函数不能和普通字段直接出现在查询语句中,除非group byselect max(sal),lower(ename) from emp--多行函数和单行函数不能直接出现在查询语句中,除非group byselect ename from emp查看员工的最低工资select min(sal) from emp查看员工的平均工资select avg(sal) from emp查看所有的员工工资之和select sum(sal) from emp查询公司有多少员工select * from empselect count(*) from emp--使用count(*)来查看一张表中有多少条记录查询有津贴的员工人数select count(comm) from emp--使用count(字段名),查询该字段有值的记录数select count(ename) from emp查询公司有多少工作种类select count(job) from empselect count(distinct job) from emp ========================================================================================================================================第三天:第一节课:转换函数学习转换函数:在转换的时候改变的是数据的类型,数据内容不会改变,可以指定格式。1、to_number:将数字字符转换为数字类型的数值,to_number(数字字符)2、to_char:将数字转换为字符类型,将日期转换为字符类型 to_char(数字/日期)3、to_date:将字符类型的日期转换为日期类型: to_date(char)--------------------------------------------------------------------------------------number-->char 转换的时候使用的是默认格式,select to_char(123) from dual--将数字转换为字符类型,使用to_char(number)select sal, to_char(sal) from empnumber-->char 使用指定的格式 to_char(number,‘格式‘),格式:$代表美元符,9代码数字占位。例如,L999,999,999表示三位一组的显示方式L代表人民币符号,0代表保留数字个数,不足使用0补充。 select to_char(sal),to_char(sal,‘L999,999,999‘) from empselect to_char(sal),to_char(sal,‘L0000.00‘) from empchar--->number to_number(数字字符)select to_number(‘123‘) from dualchar--->date,转换的字符必须是日期格式的字符串,默认格式 dd-mm-yyyy注意:因为字符串有很多,所以在字符转换为日期的时候,需要指定格式,因为日期是具备一定格式的字符组合。字符转换为日期的时候,指定的格式为字符的日期顺序,无需指定间隔符。yyyy:表示年 mm:表示月 dd表示日select to_date(‘05-12月-2016‘) from dual;select to_date(‘2016-05-12‘,‘yyyy-mm-dd‘) from dual--使用指定的格式将指定的日期字符串转换为日期select to_date(‘12-05-2016‘,‘mm/dd/yyyy‘) from dualdate--->char注意:因为日期本身就具备一定的格式在不是指定格式的情况下会默认使用dd-mm-yyyy格式显示数据指定的格式会作为日期转换为字符串类型的显示格式存在。例如:yyyy-mm-dd‘ ‘2016-12-05’yyyy/mm/dd‘ ‘2016/12/05‘yyyy"年"mm"月"dd"日"‘ 2016年12月05日select hiredate,to_char(hiredate) from emp--日期转换为字符的时候,不指定格式使用默认格式:dd-mm-yyyyselect hiredate,to_char(hiredate,‘yyyy-mm-dd‘) from emp;--使用指定格式将日期转换为字符串类型select hiredate,to_char(hiredate,‘yyyy/mm/dd‘) from emp;--使用指定格式将日期转换为字符串类型select hiredate,to_char(hiredate,‘yyyy"年"mm"月"dd"日"‘) from emp;--使用指定格式将日期转换为字符串类型查询入职日期在81年10月20日后的员工信息第一种:自动转型select * from emp where hiredate>‘20-10月-1981‘第二种:将日期转换为字符串select * from emp where to_char(hiredate,‘yyyy-mm-dd‘)>‘1981-10-20‘第三种:select * from emp where hiredate>to_date(‘1981-10-20‘,‘yyyy/mm/dd‘)第二节课:其他函数:单行函数:lower多行函数:min max sum avg count转换函数:to_number to_char to_date-----------------------------------------------------------------------------------------其他函数:1、nvl():nvl(字段名,执行)--相当于java中的if条件判断2、nvl2():nvl2(字段名,值,值)--相当于java中的If(){}else{}判断3、decode():decode(字段名,条件1,执行内容1,条件2,执行内容2,条件3,执行内容3,默认执行内容)相当于java中if(){}else if(){}else if(){}...else{}查询所有员工的月薪及姓名和工作select * from empselect ename,sal 基本工资,comm 绩效,sal+comm 月薪 from empselect ename,sal 基本工资,comm 绩效,sal+nvl(comm,0)月薪 from emp查询所有员工的月薪及姓名和工作select ename,sal 基本工资,comm 绩效,nvl2(comm,sal+comm,sal)月薪 from emp显示员工的职称select ename,job,decode(job,‘MANAGER‘,‘经理‘,‘SALESMAN‘,‘销售人员‘,‘普通员工‘) from emp第三节课:使用group by分组在多行函数中不能直接使用普通字段,除非group by在多行函数中不能直接使用单行函数,除非group bygroup by学习: ---1、使用group by进行数据分组 select 多行函数,分组字段 from 表名 group by 分组字段 ---2、多字段进行分组的时候,按照字段顺序进行分组,第一条件分组完成后,继续使用其他条件依次分组。 ---3、group by依然可以和order by 联合使用 ---4、可以和单行函数联合进行分组,注意使用了单行函数那么在查询语句中必须也要使用查询最高工资和员工数select max(sal),count(*) from emp查询不同部门的最高工资select * from emp order by deptnoselect deptno,max(sal) from emp group by deptno--使用group进行分组查询,分组的字段可以出现在查询中,其他字段依然不可以查询不同工作岗位的员工数select * from emp for updateselect lower(job),count(*) from emp group by lower(job)--使用单行函数进行分组查询不同部门的不同工作岗位的人数select deptno,job ,count(*) from emp group by deptno,job--使用多字段组合进行分组select deptno,job ,count(*) from emp group by deptno,job order by deptno查询不同部门的不同工作岗位的并且人数大于1的信息t count(*) from emp where count(*)>3 group by deptnoselecselect deptno,job ,count(*) from emp where count(*)>1 group by deptno,job order by deptno查询部门号大于10的不同部门的不同工作岗位的人数select deptno,job ,count(*) from emp where deptno>10 group by deptno,job order by deptno使用having进行分组后筛选having学习: --1、使用group by分组后在进行数据筛选的时候,where中不能出现多行函数,所以使用新的关键字having进行条件筛选 --2、where条件筛选的执行顺序:from-->where--->group -->select --3、having条件筛选的执行顺序:from-->group by -->having-->select --4、where的执行效率比having要高,能使用where的情况下尽量不要使用having查询不同部门的不同工作岗位的并且人数大于1的信息使用where语句进行筛选where条件语句sql执行顺序:from-->where--->group -->selectselect count(*) from emp where count(*)>1 group by deptno,job使用having语句进行筛选having条件语句的执行顺序:from-->group by -->having-->selectselect deptno, count(*) from emp group by deptno having count(*)>5select deptno,job ,count(*) from emp group by deptno,job having deptno>10 order by deptno第四节课:插入数据学习及数据的备份单表查询语句(select)1、插入数据(insert)1、语法规范 insert into 表名(字段1,字段2,字段3,....)values(‘值1‘,‘值2‘,‘值3‘.....)2、主键:用来唯一标识一条数据的字段通常设置主键,主键是唯一不可以重复的3、如果插入的数据是全字段数据,字段可以省略不写。部分字段,必须加上字段说明和字段值,但是主键不能为空4、事务的提交:如果一个事件是由多个动作组成,只要有一个动作没有执行成功则自动将数据回滚到原始状态,此们技术称之为事务 保证数据的安全和完整 事物的提交: 使用第三放插件的提交按钮 使用commit语句5、增加删除修改的数据sql语句执行完毕后,不会立马进入数据的写入需要手动的对数据进行提交,如果数据有问题还可以回滚select * from dept for update在北京新建了一个名为LOL学院的新部门,请插入insert into dept(deptno,dname,loc)values(‘50‘,‘lol学院‘,‘北京‘);主键是唯一不可以重复的insert into dept(deptno,dname,loc)values(‘50‘,‘教学部‘,‘北京‘);如果插入的数据是全字段数据,字段可以省略不写。部分字段,必须加上字段说明和字段值,但是主键不能为空insert into dept values(‘80‘,‘教学部‘,‘北京‘);insert into dept values(‘90‘,‘教学部‘,‘北京‘);insert into dept values(100‘,‘教学部‘,‘北京‘);insert into dept values(‘110‘,‘教学部‘,‘北京‘);2、创建数据的备份(1)create table 表名 as 查询语句,创建的是和查询结果一样的表,查询结果是什么就会备份一个相同的表(2)insert into 表名 查询语句,注意:查询出来的结果在结构上必须和插入数据的表相同,字段个数必须相同(3)注意:备份表只有字段和数据相同,并不会备份约束。1、备份完整的数据和表select * from dept;create table tdept as select * from dept;--备份dept表和数据,只能备份数据和字段select * from tdept2、备份完整表create table tdept1 as select * from dept where 1>2--备份表,不备份数据。
3、备份部分数据和表.create table 表名 as 查询语句,创建的是和查询结果一样的表,查询结果是什么就会备份一个相同的表create table tdept2 as select dname,loc from deptselect *from tdept24、给备份表添加数据 insert into 表名 查询语句,注意:查询出来的结果在结构上必须和插入数据的表相同,字段个数必须相同select * from tdept1insert into tdept1 select dname,loc from dept where deptno>40select *from tdept2
insert into tdept2 select dname,loc from dept where deptno>40第五节课:数据的更新和删除:更新数据:update语法结构:update 表名 set 字段名1=‘字段值1‘,字段名2=‘字段值2‘,...where 条件
将部门70的名字改为教学部2update dept set dname=‘教学部2‘ where deptno=‘70‘ update dept set dname=‘教学部2‘,loc=‘上海‘ where deptno=‘70‘ select * from dept删除数据:delete1)删除语句:delete 表名 where 条件--删除部门标号为70的数据delete dept where deptno=‘70‘---删除指定数据select * from deptdelete tdept---清空表数据truncate table tdept---清空表数据建议使用truncate关键字,但是此关键字不能回滚数据===================================================================================================================================第四天:第一节课:sql92学习-查询员工姓名,工作,薪资,部门名称sql的联合查询(多表查询)--1、sql92标准----笛卡尔积:一件事情的完成需要很多步骤,而不同的步骤有很多种方式,完成这件事情的所有方式称之为笛卡尔积select * from emp--14select * from dept--7select * from emp,dept order by ename--7*14=98等值链接,链接条件。等值链接的时候字段的名字可以不相同,但是字段的值要相同。--查询员工姓名,工作,薪资,部门名称select * from emp,dept where emp.deptno=dept.deptno--使用等值链接进行结果筛选select ename,job,sal,dname from emp,dept where emp.deptno=dept.deptno;--使用等值链接查询指定字段数据select ename,job,sal,emp.deptno,dname from emp,dept where emp.deptno=dept.deptno;--多表查询的时候,查看相同字段的值,必须声明所在表select emp.ename,emp.job,emp.sal,emp.deptno,dept.dname from emp,dept where emp.deptno=dept.deptno;--在查询指定字段值的时候,加上表名提高查询效率select e.ename,e.job,e.sal,e.deptno,d.dname from emp e,dept d where e.deptno=d.deptno;--多表查询中使用别名进行表的区分select e.ename,e.job,e.sal,e.deptno,d.dname from emp e,dept d where e.deptno=d.deptno order by deptno;--还可以使用order by 排序非等值链接---查询员工姓名,工作,工资,工资等级select * from salgradeselect * from emp,salgrade order by enameselect * from emp,salgrade where sal>losal and sal<hisalselect e.ename,e.job,e.sal,s.grade from emp e,salgrade s where e.sal>s.losal and e.sal<s.hisal;自连接:使用频率不是很高,因为自连接的条件要求不同信息共存在一张里,其实就两张相同的表的等值链接。--查询员工姓名,工作,薪资,及上级领导姓名select * from emp for updatecreate table temp as select * from empselect * from emp e,temp t where e.mgr=t.empno外连接select * from emp,dept--查询员工姓名,工作,薪资以及部门名称并且查询没有部门的员工信息select * from emp e,dept d where e.deptno=d.deptno(+)--查询员工姓名,工作,薪资以及部门名称并且查询没有员工的部门信息select * from emp e,dept d where e.deptno(+)=d.deptno
第二节课:sql99sql99学习:交叉链接(没啥用)select * from emp cross join dept自然链接:natural join (1)、自然链接会自动使用多表中所有相同字段(不但值相同,名字也要相同)进行筛选前提:多表一定要有同名同值的字段注意:自然连接会自动使用所有的相同字段进行结果筛选(2)、使用using关键字可以指定字段进行链接查询,但是必须是同名字段 inner join(3)、使用on关键字可以直接在其后书写链接条件,没有限制 inner join查询员工及员工所在的部门信息select * from dept natural join empselect * from dept d,emp e where d.deptno=e.deptno 问题1:假如在链接查询的时候不想使用所有相同字段进行筛选怎么办?----使用using关键字---查询员工及员工所在的部门信息select * from dept join emp using(deptno)问题2:假如在链接查询中没有同名字段,但是有同值字段怎么筛选? 使用on关键字查询员工及员工所在的部门信息select * from dept inner join emp on dept.deptno=emp.deptno查询部门及部门的城市信息select * from dept inner join city on dept.loc=city.cid外链接 (1)、左外链接 left outer join(2)、右外链接 right outer join(3)、全外链接 full outer join 左外链接查询没有部门的员工信息及员工和部门信息select * from emp e,dept d where d.deptno(+)=e.deptno--sql92
select * ---sql99from emp e left join deptusing(deptno)--右外链接select * from emp e,dept d where d.deptno=e.deptno(+)--sql92
select * ---sql99from emp eright outer join dept don e.deptno=d.deptno--全外链接select *from emp efull outer join dept don e.deptno=d.deptno第三节课:自连接及三表联合查询查询员工姓名,职位,薪资,上级领导姓名 select e.ename,e.job,e.sal,m.ename from emp e,emp m where e.mgr=m.empno--sql92sql99实现:select e.ename,e.job,e.sal,m.enamefrom emp einner join emp mon e.mgr=m.empno-----------------------------------------------------------------------sql99三表联合查询查询员工姓名,工作,薪资,部门名称,城市名称sql92实现:select e.ename,e.job,e.sal,d.dname,c.cname from emp e,dept d,city c where e.deptno=d.deptno and d.loc=c.cidsql99实现:select e.ename,e.job,e.sal,d.dname,c.cnamefrom emp einner join dept don e.deptno=d.deptnoinner join city con d.loc=c.cid
查询工资高于2000的员工姓名,工作,薪资,部门名称,城市名称sql92实现:select e.ename,e.job,e.sal,d.dname,c.cname from emp e,dept d,city c where e.deptno=d.deptno and d.loc=c.cid and sal>2000
sql99实现:select e.ename,e.job,e.sal,d.dname,c.cname --查询内容from emp e --查询表inner join dept d --链接表on e.deptno=d.deptno --链接条件inner join city c --链接表on d.loc=c.cid --链接条件where e.sal>2000 --筛选条件第四节课:单行子查询子查询(单行子查询、多行子查询)单行子查询select 内容 from 表名 where 子查询语句1、什么时候使用单行子查询?--在不能直接获取有效信息的时候,考虑使用子查询2、单行子查询的注意事项?---子查询的结果必须只有一个值---可以直接使用算术链接符---子查询出现在where中,一般出现在条件语句的右边问题:查询所有比雇员“CLARK”工资高的员工信息解读1:查询雇员CLARK的工资select sal from emp where ename=‘CLARK‘解读2:查询工资大于2450的员工信息select * from emp where sal>‘2450‘使用子查询select * from emp where sal>(select sal from emp where ename=‘CLARK‘)select * from emp where (select sal from emp where ename=‘CLARK‘)<sal查询工资高于平均工资的员工的名字和工资select * from emp where sal>(select avg(sal) from emp) order by sal查询和soctt属于同一部门且工资比他低的员工资料select * from emp where deptno=(select deptno from emp where ename=‘SCOTT‘) and sal<(select sal from emp where ename=‘SCOTT‘)查询工资最高的员工资料select * from emp where sal=(select max(sal) from emp)查询职务和scott相同,雇佣时间早的员工信息select * from emp where job=(select job from emp where ename=‘SCOTT‘) and hiredate<(select hiredate from emp where ename=‘SCOTT‘)查询工资比scott高或者雇佣时间早的员工编号和名字select empno,ename from emp where sal>(select sal from emp where ename=‘SCOTT‘) or hiredate<(select hiredate from emp where ename=‘SCOTT‘)
查询工资高于任意一个CLERK的所有员工信息select * from emp where sal>(select min(sal) from emp where job=‘CLERK‘) and job<>‘CLERK‘----------------------------------------------------------------------------------------------第五节课:多行子查询多行子查询学习:其实就使用使用关键字:any all in注意:子查询返回多个值建议使用多行子查询,返回的单个值使用单行子查询select * from emp where sal> any (select sal from emp where job=‘CLERK‘) and job<>‘CLERK‘查询工资高于所有SALESMAN的员工信息select * from emp where sal>(select max(sal) from emp where job=‘SALESMAN‘)--单行子查询的写法select * from emp where sal>all (select sal from emp where job=‘SALESMAN‘;查询部门20中同部门10的雇员工作一样的雇员信息select * from emp where deptno=‘20‘ and (job=‘MANAGER‘ or job=‘PRESIDENT‘ or job=‘CLERK‘)select * from emp where deptno=‘20‘ and job in (‘MANAGER‘, ‘PRESIDENT‘ , ‘CLERK‘)select * from emp where deptno=‘20‘ and job in (select job from emp where deptno=‘10‘)select * from emp where deptno=‘20‘ and job= any (select job from emp where deptno=‘10‘)select job from emp where deptno=‘10‘第六节课:用户创建创建用户当前用户介绍:权限级别的分配-------system:系统账户-------sys:超级管理员-------scott:普通用户
1、创建自定义用户: create user 用户名 identified by 密码;普通用户不具备创建用户的权限,需要使用system账户进行创建直接创建好的用户不能登录,还需要使用system进行权限的分配(角色:一系列权限的集合)create user zyp identified by 123456;给创建的用户赋予角色。 grant 角色名,角色名...to 用户名;grant connect to zyp;--赋予链接库权限grant resource to zyp;--赋予操作资源权限grant dba to zyp;--赋予DBA角色grant dba to zyp删除用户权限revoke dba from zyprevoke connect from zyp2、删除用户drop user zyp========================================================================================================================================第五天:第一节课:创建表和字段讲解--创建表学习1、创建表的基本语句:create table 表名(字段名 类型,字段名 类型,字段名 类型....)创建学生表:学号,姓名,性别,年龄,qq号,邮箱。create table student( snum number(10),---指定学号的数字长度为10 sname varchar2(100),---指定姓名的存储上限为100个字节 sex char(4), age number, qq number, sal number(6,2),--指定工资的整数位为6和小数位为2 mail varchar2(50))2、字段类型number类型:数字类型,用来声明存储数字的字段。 number(指定数字的整数长度,指定数字的小数位长度)varchar2类型:字符类型,用来声明存储字符的字段。会根据存储的数据自动增长大小,varchar2(存储上限)char类型:字符类型,用来声明存储字符的字符。会开辟指定大小的内存来存储数据。区别1:char的存储效率高于varchar2区别2:char是开辟指定大小的内存空间,varchar2是根据数据大小来开辟空间的大小date类型:存储日期类型第二节课:修改表学习:修改表在命令窗口查看表结构 desc 表名添加新字段 alter table 表名 add 字段名 类型 alter table student add phone number(11)修改字段类型 alter table 表名 modify 字段名 类型 alter table student modify sname varchar2(200)删除字段 alter table 表名 drop column 字段名 alter table student drop column phone修改表名 rename 表名 to 新的表名rename student to sturename stu to student 删除表 drop table 表名drop table student第三节课:约束学习(根据情况切分成两节课)select * from student for update添加数据问题1:学号重复了,数据还可以插入成功insert into student(snum,sna,sex,age,qq,sal,mail)values(‘123‘,‘张三‘,‘男‘,18,12345678,88.88,‘12345678@qq.com‘)insert into student values(123,‘李四‘,‘男‘,18,7890122,88.99,‘7890122@qq.com‘)问题2:姓名可以为空。insert into student values(456,‘柳岩‘,‘女‘,18,666999,99.66,‘666999@qq.com‘)insert into student (snum,sex,age,qq,sal,mail) values(789,‘女‘,18,888444,99.66,‘888444@qq.com‘)问题3:性别不但可以为空,还可以为其他不知道的字符insert into student (snum,sna,age,qq,sal,mail) values(108,‘景甜‘,18,000999,99.66,‘000999@qq.com‘)insert into student (snum,sna,sex,age,qq,sal,mail) values(102,‘景甜‘,‘a‘,18,000999,99.66,‘000999@qq.com‘)insert into student (snum,sna,sex,age,qq,sal,mail) values(102,‘景甜‘,‘女‘,18,000999,99.66,‘000999@qq.com‘)问题4:年龄可以超过200insert into student (snum,sna,sex,age,qq,sal,mail) values(103,‘唐嫣‘,‘女‘,23,78900,99.66,‘78900@qq.com‘)insert into student (snum,sna,sex,age,qq,sal,mail) values(103,‘唐嫣‘,‘女‘,230,78900,99.66,‘78900@qq.com‘)问题5:qq号一致insert into student (snum,sna,sex,age,qq,sal,mail) values(104,‘关晓彤‘,‘女‘,19,111000,99.66,‘111000@qq.com‘)insert into student (snum,sna,sex,age,qq,sal,mail) values(105,‘袁华‘,‘男‘,22,111000,99.66,‘111000@qq.com‘)--------------------------------------------------------------------------------------------------------约束学习:create table student( snum number(10),--primary key,--使用主键约束 sna varchar2(100), --not null, sex char(4), --default ‘男‘ check(sex=‘男‘ or sex=‘女‘) not null, age number check(age>0 and age<120), qq number, --unique, sal number(6,2), mail varchar2(50)-- constraints pk_student_snum primary key(snum) -- constraints ck_student_sna check(sna is not null) -- constraints ck_student_sex check(sex =‘男‘ or sex=‘女‘) --constraints uk_student_qq unique(qq))alter table student add constraints pk_student_snum primary key(snum);--在创建表后添加主键alter table student drop constraints pk_student_snum--删除主键
alter table student modify sna varchar2(100) not null;--添加非空约束alter table student modify sna varchar2(100) null;--修改字段为空
alter table student add constraints ck_student_sex check(sex=‘男‘ or sex=‘女‘)--添加检查约束alter table student drop constraints ck_student_sex --删除检查约束
alter table student add constraints uk_student_qq unique(qq)alter table student drop constraints uk_student_qq
drop table student问题1:学号重复了,数据还可以插入成功使用主键约束:学号是唯一标识一条数据的,所以必须唯一且不能为空 ---(1)、在确定为主键的字段后添加 primary key关键字 ---(2)、在创建表的后面使用:constraints pk_表名_字段名 primary key(字段名) --(3)、在创建表后使用 alter table 表名 add constraints pk_表名_字段名 primary key(字段名); --删除主键:alter table 表名 drop constraints pk_表名_字段名问题2:姓名可以为空。使用非空约束 ---(1)、创建表的时候在字段后面添加not null ---(2)、在创建表字段后使用 constraints ck_表名_字段名 check(字段名 is not null) 了解 --(3)、在创建表后使用alter table 表名 modify 字段名 类型 not null; ---(4)、修改字段可以存储空值:alter table 表名 modify 字段名 类型 null;问题3:性别不但可以为空,还可以为其他不知道的字符使用检查约束 ---(1)、创建表的时候在字段后使用 default 值 check(条件), ---------但是会允许空值的出现,并且默认值只有在字段不声明的情况下生效 ---(2)、在创建表所有字段后使用:constraints ck_表名_字段名 check(条件) ---(3)、在创建表后使用:alter table 表名 add constraints ck_表名_字段名 check(条件)问题4:年龄可以超过200 --使用检查约束条件问题5:qq号一致使用唯一约束 --(1)、在字段后直接使用unique关键字 --(2)、在所有字段后使用:constraints uk_表名_字段名 unique(字段名) --(3)、 alter table 表名 add constraints uk_表名_字段名 unique(字段名) --删除唯一约束:alter table 表名 drop constraints uk_表名_字段名第四节课:外键约束学习:创建学生表create table stu( snum number(10) primary key, sname varchar2(100) not null, sex char(4) check(sex=‘男‘ or sex=‘女‘), cinfo number(10)-- references clazz(cid)--外键 -- constraints fk_stu_cinfo foreign key(cinfo) references clazz(cid))alter table stu add constraints fk_stu_cinfo foreign key(cinfo) references clazz(cid) on delete cascade--添加外键alter table stu add constraints fk_stu_cinfo foreign key(cinfo) references clazz(cid) on delete set null--添加外键
alter table stu drop constraints fk_stu_cinfo --删除外键drop table stu创建班级表create table clazz( cid number(10) primary key, cname varchar2(100) not null, cdesc varchar2(500)
)创建班级表数据insert into clazz values(1,‘软件01班‘,‘最厉害的班级‘);insert into clazz values(2,‘软件02班‘,‘挂科最多的班级‘);insert into clazz values(3,‘508班‘,‘大牛和最帅的班级‘);select * from clazzdelete from clazz where cid=1创建学生数据insert into stu values(1002,‘张三‘,‘男‘,1);insert into stu values(1003,‘李四‘,‘女‘,2);insert into stu values(1004,‘王五‘,‘男‘,3);insert into stu values(1005,‘赵四‘,‘男‘,4);select * from stu问题1:在插入学生信息的时候,出现了不存在的班级信息? 使用外键约束 --(1)、在字段后使用 references 参照表表名(参照字段) --(2)、在所有字段后使用 constraints fk_表名_字段名 foreign key(字段名) references 参照表名(参照字段名) --(3)、在创建表后使用alter table 表名 add constraints fk_表名_字段名 foreign key(字段名) references 参照表名(参照字段名) --删除外键 alter table 表名 drop constraints fk_表名_字段名
select table_name from all_all_tables where owner=‘SCOTT‘
问题2:在删除父表数据的时候需要先删除子表数据?解决方式1:先解除主外键关联,然后删除数据,再然后添加主外键关联解决方式2:在创建外键的时候使用级联操作。 --在创建外键时 on delete cascade --在创建外键时 on delete set null怎么选取外键?一般将主表的主键作为子表的外键外键的值能为 not null? 不建议在外键后使用非空约束第五节课:序列--序列select cid from clazz order by cidinsert into clazz values(4,‘402班级‘,‘老师最污的班‘);
insert into clazz values(10,‘402班级‘,‘老师最污的班‘);--问题1:如果数据量比较大,插入新的数据的时候id怎么选取才能避免重复?使用序列 1、创建序列 create sequence 序列名特点:默认没有初始值的,nextval的值默认从1开始,默认每次自增+1特点:可以使用 序列名.nextval坐为主键使用create sequence cnum;select cnum.currval from dual---获取当前序列值select cnum.nextval from dual---序列自增后返回当前值 truncate table clazzselect * from clazzinsert into clazz values(cnum.nextval,‘402班级‘,‘老师最污的班‘);--将序列作为主键问题2:如果当前表中已有很多数据,但是接下来需要使用序列进行主键自增?创建序列时指定序列初始值及步长create sequence ccstart with 90---设定序列初始值increment by 5---设定步长insert into clazz values(cc.nextval,‘402班级‘,‘老师最污的班‘);
select max(cid) from clazz--select cc.nextval from dualselect cc.currval from dualselect * from clazz删除序列drop sequence cc----------------完整的序列格式-----------------------------------create sequence aa--序列名start with 20 --设置序列初始值increment by 10 --设置步长maxvalue 10000---设置最大值cache 10 -----设置缓存第六节课:索引索引学习select * from emp order by salselect * from emp where sal=3000问题:当表中数据量比较大的时候,使用条件查询就会出现效率的问题使用索引进行解决1、原理:类似于java中数组的折半查找,在数据库中数据使用B树形结构进行数据的存储, --这样可以对外提供快速的数据查找方式。2、创建索引 create index 表名_index_字段名 on 表名(字段名)特点:显示的创建,隐式的执行.在数据中会给主键默认创建索引。create index emp_index_sal on emp(sal)--创建查询索引select * from emp where sal=3000select * from emp order by salcreate index emp_index_sal_desc on emp(sal desc);--创建单排序索引select * from emp order by sal,jobcreate index emp_index_sal_desc2 on emp(sal desc,job asc);--创建多条件排序索引3、删除索引 drop index 索引名drop index emp_index_sal_desc=====================================================================================================================================文章首发公众号:Java架构师联盟,每日更新技术好文
整理总结数据库常用sql语句,建议收藏,忘记了可以来看一下
标签:b树 sql 自动增长 ber 出现 写入 not cas 总结
小编还为您整理了以下内容,可能对您也有帮助:
数据库常用sql语句有哪些
数据库常用sql语句有哪些
SQL语句有哪些?SQL语句无论是种类还是数量都是繁多的,很多语句也是经常要用到的,下文我为大家分享的就是SQL的常用语句,仅供参考!
50个常用的sql语句
Student(S#,Sname,Sage,Ssex) 学生表
Course(C#,Cname,T#) 课程表
SC(S#,C#,score) 成绩表
Teacher(T#,Tname) 教师表
问题:
1、查询“001”课程比“002”课程成绩高的所有学生的学号;
select a.S# from (select s#,score from SC where C#='001') a,(select s#,score
from SC where C#='002') b
where a.score>b.score and a.s#=b.s#;
2、查询平均成绩大于60分的同学的学号和平均成绩;
select S#,avg(score)
from sc
group by S# having avg(score) >60;
3、查询所有同学的学号、姓名、选课数、总成绩;
select Student.S#,Student.Sname,count(SC.C#),sum(score)
from Student left Outer join SC on Student.S#=SC.S#
group by Student.S#,Sname
4、查询姓“李”的老师的个数;
select count(distinct(Tname))
from Teacher
where Tname like '李%';
5、查询没学过“叶平”老师课的同学的学号、姓名;
select Student.S#,Student.Sname
from Student
where S# not in (select distinct( SC.S#) from SC,Course,Teacher where SC.C#=Course.C# and Teacher.T#=Course.T# and Teacher.Tname='叶平');
6、查询学过“001”并且也学过编号“002”课程的同学的学号、姓名;
select Student.S#,Student.Sname from Student,SC where Student.S#=SC.S# and SC.C#='001'and exists( Select * from SC as SC_2 where SC_2.S#=SC.S# and SC_2.C#='002');
7、查询学过“叶平”老师所教的所有课的同学的学号、姓名;
select S#,Sname
from Student
where S# in (select S# from SC ,Course ,Teacher where SC.C#=Course.C# and Teacher.T#=Course.T# and Teacher.Tname='叶平' group by S# having count(SC.C#)=(select count(C#) from Course,Teacher where Teacher.T#=Course.T# and Tname='叶平'));
8、查询课程编号“002”的成绩比课程编号“001”课程低的所有同学的学号、姓名;
Select S#,Sname from (select Student.S#,Student.Sname,score ,(select score from SC SC_2 where SC_2.S#=Student.S# and SC_2.C#='002') score2
from Student,SC where Student.S#=SC.S# and C#='001') S_2 where score2 <score;
9、查询所有课程成绩小于60分的同学的学号、姓名;
select S#,Sname
from Student
where S# not in (select Student.S# from Student,SC where S.S#=SC.S# and score>60);
10、查询没有学全所有课的同学的学号、姓名;
select Student.S#,Student.Sname
from Student,SC
where Student.S#=SC.S# group by Student.S#,Student.Sname having count(C#) <(select count(C#) from Course);
11、查询至少有一门课与学号为“1001”的同学所学相同的同学的学号和姓名;
select S#,Sname from Student,SC where Student.S#=SC.S# and C# in select C# from SC where S#='1001';
12、查询至少学过学号为“001”同学所有一门课的其他同学学号和姓名;
select distinct SC.S#,Sname
from Student,SC
where Student.S#=SC.S# and C# in (select C# from SC where S#='001');
13、把“SC”表中“叶平”老师教的课的成绩都更改为此课程的平均成绩;
update SC set score=(select avg(SC_2.score)
from SC SC_2
where SC_2.C#=SC.C# ) from Course,Teacher where Course.C#=SC.C# and Course.T#=Teacher.T# and Teacher.Tname='叶平');
14、查询和“1002”号的同学学习的课程完全相同的其他同学学号和姓名;
select S# from SC where C# in (select C# from SC where S#='1002')
group by S# having count(*)=(select count(*) from SC where S#='1002');
15、删除学习“叶平”老师课的SC表记录;
Delect SC
from course ,Teacher
where Course.C#=SC.C# and Course.T#= Teacher.T# and Tname='叶平';
16、向SC表中插入一些记录,这些记录要求符合以下条件:没有上过编号“003”课程的同学学号、2、
号课的平均成绩;
Insert SC select S#,'002',(Select avg(score)
from SC where C#='002') from Student where S# not in (Select S# from SC where C#='002');
17、按平均成绩从高到低显示所有学生的“数据库”、“企业管理”、“英语”三门的课程成绩,按如下形式显示: 学生ID,,数据库,企业管理,英语,有效课程数,有效平均分
SELECT S# as 学生ID
,(SELECT score FROM SC WHERE SC.S#=t.S# AND C#='004') AS 数据库
,(SELECT score FROM SC WHERE SC.S#=t.S# AND C#='001') AS 企业管理
,(SELECT score FROM SC WHERE SC.S#=t.S# AND C#='006') AS 英语
,COUNT(*) AS 有效课程数, AVG(t.score) AS 平均成绩
FROM SC AS t
GROUP BY S#
ORDER BY avg(t.score)
18、查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,最低分
SELECT L.C# As 课程ID,L.score AS 最高分,R.score AS 最低分
FROM SC L ,SC AS R
WHERE L.C# = R.C# and
L.score = (SELECT MAX(IL.score)
FROM SC AS IL,Student AS IM
WHERE L.C# = IL.C# and IM.S#=IL.S#
GROUP BY IL.C#)
AND
R.Score = (SELECT MIN(IR.score)
FROM SC AS IR
WHERE R.C# = IR.C#
GROUP BY IR.C#
);
19、按各科平均成绩从低到高和及格率的百分数从高到低顺序
SELECT t.C# AS 课程号,max(course.Cname)AS 课程名,isnull(AVG(score),0) AS 平均成绩
,100 * SUM(CASE WHEN isnull(score,0)>=60 THEN 1 ELSE 0 END)/COUNT(*) AS 及格百分数
FROM SC T,Course
where t.C#=course.C#
GROUP BY t.C#
ORDER BY 100 * SUM(CASE WHEN isnull(score,0)>=60 THEN 1 ELSE 0 END)/COUNT(*) DESC
20、查询如下课程平均成绩和及格率的百分数(用"1行"显示): 企业管理(001),马克思(002),OO&UML (003),数据库(004)
SELECT SUM(CASE WHEN C# ='001' THEN score ELSE 0 END)/SUM(CASE C# WHEN '001' THEN 1 ELSE 0 END) AS 企业管理平均分
,100 * SUM(CASE WHEN C# = '001' AND score >= 60 THEN 1 ELSE 0 END)/SUM(CASE WHEN C# = '001' THEN 1 ELSE 0 END) AS 企业管理及格百分数
,SUM(CASE WHEN C# = '002' THEN score ELSE 0 END)/SUM(CASE C# WHEN '002' THEN 1 ELSE 0 END) AS 马克思平均分
,100 * SUM(CASE WHEN C# = '002' AND score >= 60 THEN 1 ELSE 0 END)/SUM(CASE WHEN C# = '002' THEN 1 ELSE 0 END) AS 马克思及格百分数
,SUM(CASE WHEN C# = '003' THEN score ELSE 0 END)/SUM(CASE C# WHEN '003' THEN 1 ELSE 0 END) AS UML平均分
,100 * SUM(CASE WHEN C# = '003' AND score >= 60 THEN 1 ELSE 0 END)/SUM(CASE WHEN C# = '003' THEN 1 ELSE 0 END) AS UML及格百分数
,SUM(CASE WHEN C# = '004' THEN score ELSE 0 END)/SUM(CASE C# WHEN '004' THEN 1 ELSE 0 END) AS 数据库平均分
,100 * SUM(CASE WHEN C# = '004' AND score >= 60 THEN 1 ELSE 0 END)/SUM(CASE WHEN C# = '004' THEN 1 ELSE 0 END) AS 数据库及格百分数
FROM SC
21、查询不同老师所教不同课程平均分从高到低显示
SELECT max(Z.T#) AS 教师ID,MAX(Z.Tname) AS 教师姓名,C.C# AS 课程ID,MAX(C.Cname) AS 课程名称,AVG(Score) AS 平均成绩
FROM SC AS T,Course AS C ,Teacher AS Z
where T.C#=C.C# and C.T#=Z.T#
GROUP BY C.C#
ORDER BY AVG(Score) DESC
22、查询如下课程成绩第 3 名到第 6 名的学生成绩单:企业管理(001),马克思(002),UML (003),数据库(004)
[学生ID],[学生姓名],企业管理,马克思,UML,数据库,平均成绩
SELECT DISTINCT top 3
SC.S# As 学生学号,
Student.Sname AS 学生姓名 ,
T1.score AS 企业管理,
T2.score AS 马克思,
T3.score AS UML,
T4.score AS 数据库,
ISNULL(T1.score,0) + ISNULL(T2.score,0) + ISNULL(T3.score,0) + ISNULL(T4.score,0) as 总分
FROM Student,SC LEFT JOIN SC AS T1
ON SC.S# = T1.S# AND T1.C# = '001'
LEFT JOIN SC AS T2
ON SC.S# = T2.S# AND T2.C# = '002'
LEFT JOIN SC AS T3
ON SC.S# = T3.S# AND T3.C# = '003'
LEFT JOIN SC AS T4
ON SC.S# = T4.S# AND T4.C# = '004'
WHERE student.S#=SC.S# and
ISNULL(T1.score,0) + ISNULL(T2.score,0) + ISNULL(T3.score,0) + ISNULL(T4.score,0)
NOT IN
(SELECT
DISTINCT
TOP 15 WITH TIES
ISNULL(T1.score,0) + ISNULL(T2.score,0) + ISNULL(T3.score,0) + ISNULL(T4.score,0)
FROM sc
LEFT JOIN sc AS T1
ON sc.S# = T1.S# AND T1.C# = 'k1'
LEFT JOIN sc AS T2
ON sc.S# = T2.S# AND T2.C# = 'k2'
LEFT JOIN sc AS T3
ON sc.S# = T3.S# AND T3.C# = 'k3'
LEFT JOIN sc AS T4
ON sc.S# = T4.S# AND T4.C# = 'k4'
ORDER BY ISNULL(T1.score,0) + ISNULL(T2.score,0) + ISNULL(T3.score,0) + ISNULL(T4.score,0) DESC);
23、统计列印各科成绩,各分数段人数:课程ID,课程名称,[100-85],[85-70],[70-60],[ <60]
SELECT SC.C# as 课程ID, Cname as 课程名称
,SUM(CASE WHEN score BETWEEN 85 AND 100 THEN 1 ELSE 0 END) AS [100 - 85]
,SUM(CASE WHEN score BETWEEN 70 AND 85 THEN 1 ELSE 0 END) AS [85 - 70]
,SUM(CASE WHEN score BETWEEN 60 AND 70 THEN 1 ELSE 0 END) AS [70 - 60]
,SUM(CASE WHEN score < 60 THEN 1 ELSE 0 END) AS [60 -]
FROM SC,Course
where SC.C#=Course.C#
GROUP BY SC.C#,Cname;
24、查询学生平均成绩及其名次
SELECT 1+(SELECT COUNT( distinct 平均成绩)
FROM (SELECT S#,AVG(score) AS 平均成绩
FROM SC
GROUP BY S#
) AS T1
WHERE 平均成绩 > T2.平均成绩) as 名次,
S# as 学生学号,平均成绩
FROM (SELECT S#,AVG(score) 平均成绩
FROM SC
GROUP BY S#
) AS T2
ORDER BY 平均成绩 desc;
25、查询各科成绩前三名的记录:(不考虑成绩并列情况)
SELECT t1.S# as 学生ID,t1.C# as 课程ID,Score as 分数
FROM SC t1
WHERE score IN (SELECT TOP 3 score
FROM SC
WHERE t1.C#= C#
ORDER BY score DESC
)
ORDER BY t1.C#;
26、查询每门课程被选修的学生数
select c#,count(S#) from sc group by C#;
27、查询出只选修了一门课程的全部学生的学号和姓名
select SC.S#,Student.Sname,count(C#) AS 选课数
from SC ,Student
where SC.S#=Student.S# group by SC.S# ,Student.Sname having count(C#)=1;
28、查询男生、女生人数
Select count(Ssex) as 男生人数 from Student group by Ssex having Ssex='男';
Select count(Ssex) as 女生人数 from Student group by Ssex having Ssex='女';
29、查询姓“张”的.学生名单
SELECT Sname FROM Student WHERE Sname like '张%';
30、查询同名同性学生名单,并统计同名人数
select Sname,count(*) from Student group by Sname having count(*)>1;;
31、1981年出生的学生名单(注:Student表中Sage列的类型是datetime)
select Sname, CONVERT(char (11),DATEPART(year,Sage)) as age
from student
where CONVERT(char(11),DATEPART(year,Sage))='1981';
32、查询每门课程的平均成绩,结果按平均成绩升序排列,平均成绩相同时,按课程号降序排列
Select C#,Avg(score) from SC group by C# order by Avg(score),C# DESC ;
33、查询平均成绩大于85的所有学生的学号、姓名和平均成绩
select Sname,SC.S# ,avg(score)
from Student,SC
where Student.S#=SC.S# group by SC.S#,Sname having avg(score)>85;
34、查询课程名称为“数据库”,且分数低于60的学生姓名和分数
Select Sname,isnull(score,0)
from Student,SC,Course
where SC.S#=Student.S# and SC.C#=Course.C# and Course.Cname='数据库'and score <60;
35、查询所有学生的选课情况;
SELECT SC.S#,SC.C#,Sname,Cname
FROM SC,Student,Course
where SC.S#=Student.S# and SC.C#=Course.C# ;
36、查询任何一门课程成绩在70分以上的姓名、课程名称和分数;
SELECT distinct student.S#,student.Sname,SC.C#,SC.score
FROM student,Sc
WHERE SC.score>=70 AND SC.S#=student.S#;
37、查询不及格的课程,并按课程号从大到小排列
select c# from sc where scor e <60 order by C# ;
38、查询课程编号为003且课程成绩在80分以上的学生的学号和姓名;
select SC.S#,Student.Sname from SC,Student where SC.S#=Student.S# and Score>80 and C#='003';
39、求选了课程的学生人数
select count(*) from sc;
40、查询选修“叶平”老师所授课程的学生中,成绩最高的学生姓名及其成绩
select Student.Sname,score
from Student,SC,Course C,Teacher
where Student.S#=SC.S# and SC.C#=C.C# and C.T#=Teacher.T# and Teacher.Tname='叶平' and SC.score=(select max(score)from SC where C#=C.C# );
41、查询各个课程及相应的选修人数
select count(*) from sc group by C#;
42、查询不同课程成绩相同的学生的学号、课程号、学生成绩
select distinct A.S#,B.score from SC A ,SC B where A.Score=B.Score and A.C# <>B.C# ;
43、查询每门功成绩最好的前两名
SELECT t1.S# as 学生ID,t1.C# as 课程ID,Score as 分数
FROM SC t1
WHERE score IN (SELECT TOP 2 score
FROM SC
WHERE t1.C#= C#
ORDER BY score DESC
)
ORDER BY t1.C#;
44、统计每门课程的学生选修人数(超过10人的课程才统计)。要求输出课程号和选修人数,查询结果按人数降序排列,查询结果按人数降序排列,若人数相同,按课程号升序排列
select C# as 课程号,count(*) as 人数
from sc
group by C#
order by count(*) desc,c#
45、检索至少选修两门课程的学生学号
select S#
from sc
group by s#
having count(*) > = 2
46、查询全部学生都选修的课程的课程号和课程名
select C#,Cname
from Course
where C# in (select c# from sc group by c#)
47、查询没学过“叶平”老师讲授的任一门课程的学生姓名
select Sname from Student where S# not in (select S# from Course,Teacher,SC where Course.T#=Teacher.T# and SC.C#=course.C# and Tname='叶平');
48、查询两门以上不及格课程的同学的学号及其平均成绩
select S#,avg(isnull(score,0)) from SC where S# in (select S# from SC where score <60 group by S# having count(*)>2)group by S#;
49、检索“004”课程分数小于60,按分数降序排列的同学学号
select S# from SC where C#='004'and score <60 order by score desc;
50、删除“002”同学的“001”课程的成绩
delete from Sc where S#='001'and C#='001';
;数据库中常用的sql语句有哪些
1.检索数据
SELECT prod_nameFROM Procts;
#检索单列
SELECT prod_id, prod_name, prod_;
#检索多列
SELECT * FROM Procts;
#检索所有列
SELECT _id FROMProcts;
#检索不同的值
SELECTprod_name FROM Procts LIMIT 5;
#返回不超过5行数据
SELECTprod_name FROM Procts LIMIT 5 OFFSET 5;
#返回从第5行起的5行数据。LIMIT指定返回的行数,LIMIT带的OFFSET指定从哪儿开始。
2.排序检索数据
SELECTprod_name
FROMProcts
ORDER BYprod_name;
#排序数据
SELECT prod_id, prod_price, prod_name
FROMProcts
ORDER BY prod_price, prod_name;
#按多个列排序
SELECT prod_id, prod_price, prod_name
FROMProcts
ORDER BY 2, 3;
#按列位置排序,第三行表示先按prod_price, 再按prod_name进行排序
SELECT prod_id, prod_price, prod_name
FROMProcts
ORDER BY prod_priceDESC, prod_name;
#prod_price列以降序排序,而prod_name列(在每个价格内)仍然按标准的升序排序
3.过滤数据
SELECT prod_name, prod_price
FROMProcts
WHERE prod_price< 10;
#检查单个值
SELECT prod_name, prod_price
FROMProcts
WHERE vend_id <> ‘DLL01’;
#不匹配检查
SELECT prod_name, prod_price
FROMProcts
WHERE prod_ 5 AND 10;
#范围值检查
SELECT cust_name
WHERE cust_emailIS NULL;
#空值检查
4.高级数据过滤
SELECTprod_id, prod_price, prod_name
FROMProcts
WHERE vend_id = ‘DLL01’ANDprod_price <= 4;
#AND操作符
SELECTprod_name, prod_price
FROMProcts
WHEREvend_id=’DLL01’ OR vend_id=’BRS01’;
#OR操作符
SELECTprod_name, prod_price
FROMProcts
WHERE (vend_id = ’DLL01’ORvend_id=’BRS01’)
ANDprod_price >= 10;
#求值顺序 AND的优先级高于OR
SELECTprod_name, prod_price
FROMProcts
WHERE vend_idIN (‘DLL01’,’BRS01’)
ORDER BY prod_name;
#IN操作符
SELECT prod_name
FROMProcts
WHERE NOTvend_id = ‘DLL01’
ORDER BY prod_name;
#NOT 操作符
SELECT prod_name
FROMProcts
WHEREvend_id <> ‘DLL01’
ORDER BY prod_name;
#NOT 操作符
SQL 数据库中常用的一些语句。。。归类下
一、基础
1、说明:创建数据库
CREATE DATABASE database-name
2、说明:删除数据库
drop database dbname
3、说明:备份sql server
--- 创建 备份数据的 device
USE master
EXEC sp_admpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat'
--- 开始 备份
BACKUP DATABASE pubs TO testBack
4、说明:创建新表
create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)
根据已有的表创建新表:
A:create table tab_new like tab_old (使用旧表创建新表)
B:create table tab_new as select col1,col2... from tab_old definition only
5、说明:删除新表
drop table tabname
6、说明:增加一个列
Alter table tabname add column col type
注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。
7、说明:添加主键: Alter table tabname add primary key(col)
说明:删除主键: Alter table tabname drop primary key(col)
8、说明:创建索引:create [unique] index idxname on tabname(col....)
删除索引:drop index idxname
注:索引是不可更改的,想更改必须删除重新建。
9、说明:创建视图:create view viewname as select statement
删除视图:drop view viewname
10、说明:几个简单的基本的sql语句
选择:select * from table1 where 范围
插入:insert into table1(field1,field2) values(value1,value2)
删除:delete from table1 where 范围
更新:update table1 set field1=value1 where 范围
查找:select * from table1 where field1 like '%value1%' ---like的语法很精妙,查资料!
排序:select * from table1 order by field1,field2 [desc]
总数:select count as totalcount from table1
求和:select sum(field1) as sumvalue from table1
平均:select avg(field1) as avgvalue from table1
最大:select max(field1) as maxvalue from table1
最小:select min(field1) as minvalue from table1
11、说明:几个高级查询运算词
A: UNION 运算符
UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。
B: EXCEPT 运算符
EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时 (EXCEPT ALL),不消除重复行。
C: INTERSECT 运算符
INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时 (INTERSECT ALL),不消除重复行。
注:使用运算词的几个查询结果行必须是一致的。
12、说明:使用外连接
A、left outer join:
左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所有行。
SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c
B:right outer join:
右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。
C:full outer join:
全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。
二、提升
1、说明:复制表(只复制结构,源表名:a 新表名:b) (Access可用)
法一:select * into b from a where 1<>1
法二:select top 0 * into b from a
2、说明:拷贝表(拷贝数据,源表名:a 目标表名:b) (Access可用)
insert into b(a, b, c) select d,e,f from b;
3、说明:跨数据库之间表的拷贝(具体数据使用绝对路径) (Access可用)
insert into b(a, b, c) select d,e,f from b in '具体数据库' where 条件
例子:..from b in '"&Server.MapPath(".")&"\data.mdb" &"' where..
4、说明:子查询(表名1:a 表名2:b)
select a,b,c from a where a IN (select d from b ) 或者: select a,b,c from a where a IN (1,2,3)
5、说明:显示文章、提交人和最后回复时间
select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b
6、说明:外连接查询(表名1:a 表名2:b)
select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c
7、说明:在线视图查询(表名1:a )
select * from (SELECT a,b,c FROM a) T where t.a > 1;
8、说明:between的用法,between*查询数据范围时包括了边界值,not between不包括
select * from table1 where time between time1 and time2
select a,b,c, from table1 where a not between 数值1 and 数值2
9、说明:in 的使用方法
select * from table1 where a [not] in ('值1','值2','值4','值6')
10、说明:两张关联表,删除主表中已经在副表中没有的信息
delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 )
11、说明:四表联查问题:
select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where .....
12、说明:日程安排提前五分钟提醒
SQL: select * from 日程安排 where datediff('minute',f开始时间,getdate())>5
13、说明:一条sql 语句搞定数据库分页
select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段
14、说明:前10条记录
select top 10 * form table1 where 范围
15、说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.)
select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b)
16、说明:包括所有在 TableA 中但不在 TableB和TableC 中的行并消除所有重复行而派生出一个结果表
(select a from tableA ) except (select a from tableB) except (select a from tableC)
17、说明:随机取出10条数据
select top 10 * from tablename order by newid()
19、说明:删除重复记录
Delete from tablename where id not in (select max(id) from tablename group by col1,col2,...)
20、说明:列出数据库里所有的表名
select name from sysobjects where type='U'
23、说明:初始化表table1
TRUNCATE TABLE table1
24、说明:选择从10到15的记录
select top 5 * from (select top 15 * from table order by id asc) table_别名 order by id desc
SQL 数据库中常用的一些语句。。。归类下
一、基础
1、说明:创建数据库
CREATE DATABASE database-name
2、说明:删除数据库
drop database dbname
3、说明:备份sql server
--- 创建 备份数据的 device
USE master
EXEC sp_admpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat'
--- 开始 备份
BACKUP DATABASE pubs TO testBack
4、说明:创建新表
create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)
根据已有的表创建新表:
A:create table tab_new like tab_old (使用旧表创建新表)
B:create table tab_new as select col1,col2... from tab_old definition only
5、说明:删除新表
drop table tabname
6、说明:增加一个列
Alter table tabname add column col type
注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。
7、说明:添加主键: Alter table tabname add primary key(col)
说明:删除主键: Alter table tabname drop primary key(col)
8、说明:创建索引:create [unique] index idxname on tabname(col....)
删除索引:drop index idxname
注:索引是不可更改的,想更改必须删除重新建。
9、说明:创建视图:create view viewname as select statement
删除视图:drop view viewname
10、说明:几个简单的基本的sql语句
选择:select * from table1 where 范围
插入:insert into table1(field1,field2) values(value1,value2)
删除:delete from table1 where 范围
更新:update table1 set field1=value1 where 范围
查找:select * from table1 where field1 like '%value1%' ---like的语法很精妙,查资料!
排序:select * from table1 order by field1,field2 [desc]
总数:select count as totalcount from table1
求和:select sum(field1) as sumvalue from table1
平均:select avg(field1) as avgvalue from table1
最大:select max(field1) as maxvalue from table1
最小:select min(field1) as minvalue from table1
11、说明:几个高级查询运算词
A: UNION 运算符
UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。
B: EXCEPT 运算符
EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时 (EXCEPT ALL),不消除重复行。
C: INTERSECT 运算符
INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时 (INTERSECT ALL),不消除重复行。
注:使用运算词的几个查询结果行必须是一致的。
12、说明:使用外连接
A、left outer join:
左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所有行。
SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c
B:right outer join:
右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。
C:full outer join:
全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。
二、提升
1、说明:复制表(只复制结构,源表名:a 新表名:b) (Access可用)
法一:select * into b from a where 1<>1
法二:select top 0 * into b from a
2、说明:拷贝表(拷贝数据,源表名:a 目标表名:b) (Access可用)
insert into b(a, b, c) select d,e,f from b;
3、说明:跨数据库之间表的拷贝(具体数据使用绝对路径) (Access可用)
insert into b(a, b, c) select d,e,f from b in '具体数据库' where 条件
例子:..from b in '"&Server.MapPath(".")&"\data.mdb" &"' where..
4、说明:子查询(表名1:a 表名2:b)
select a,b,c from a where a IN (select d from b ) 或者: select a,b,c from a where a IN (1,2,3)
5、说明:显示文章、提交人和最后回复时间
select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b
6、说明:外连接查询(表名1:a 表名2:b)
select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c
7、说明:在线视图查询(表名1:a )
select * from (SELECT a,b,c FROM a) T where t.a > 1;
8、说明:between的用法,between*查询数据范围时包括了边界值,not between不包括
select * from table1 where time between time1 and time2
select a,b,c, from table1 where a not between 数值1 and 数值2
9、说明:in 的使用方法
select * from table1 where a [not] in ('值1','值2','值4','值6')
10、说明:两张关联表,删除主表中已经在副表中没有的信息
delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 )
11、说明:四表联查问题:
select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where .....
12、说明:日程安排提前五分钟提醒
SQL: select * from 日程安排 where datediff('minute',f开始时间,getdate())>5
13、说明:一条sql 语句搞定数据库分页
select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段
14、说明:前10条记录
select top 10 * form table1 where 范围
15、说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.)
select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b)
16、说明:包括所有在 TableA 中但不在 TableB和TableC 中的行并消除所有重复行而派生出一个结果表
(select a from tableA ) except (select a from tableB) except (select a from tableC)
17、说明:随机取出10条数据
select top 10 * from tablename order by newid()
19、说明:删除重复记录
Delete from tablename where id not in (select max(id) from tablename group by col1,col2,...)
20、说明:列出数据库里所有的表名
select name from sysobjects where type='U'
23、说明:初始化表table1
TRUNCATE TABLE table1
24、说明:选择从10到15的记录
select top 5 * from (select top 15 * from table order by id asc) table_别名 order by id desc
SQL 语法速成手册(干货满满,建议收藏!)
SQL 语法结构包括:
例如: SELECT 与 select 、 Select 是相同的。
数据定义语言(Data Definition Language,DDL)是 SQL 语言集中负责数据结构定义与数据库对象定义的语言。
DDL 的主要功能是 定义数据库对象 。
DDL 的核心指令是 CREATE 、 ALTER 、 DROP 。
数据操纵语言(Data Manipulation Language, DML)是用于数据库操作,对数据库其中的对象和数据运行访问工作的编程语句。
DML 的主要功能是 访问数据 ,因此其语法都是以 读写数据库 为主。
DML 的核心指令是 INSERT 、 UPDATE 、 DELETE 、 SELECT 。这四个指令合称 CRUD(Create, Read, Update, Delete),即增删改查。
事务控制语言 (Transaction Control Language, TCL) 用于 管理数据库中的事务 。这些用于管理由 DML 语句所做的更改。它还允许将语句分组为逻辑事务。
TCL 的核心指令是 COMMIT 、 ROLLBACK 。
数据控制语言 (Data Control Language, DCL) 是一种可对数据访问权进行控制的指令,它可以控制特定用户账户对数据表、查看表、预存程序、用户自定义函数等数据库对象的控制权。
DCL 的核心指令是 GRANT 、 REVOKE 。
DCL 以 控制用户的访问权限 为主,因此其指令作法并不复杂,可利用 DCL 控制的权限有: CONNECT 、 SELECT 、 INSERT 、 UPDATE 、 DELETE 、 EXECUTE 、 USAGE 、 REFERENCES 。
根据不同的 DBMS 以及不同的安全性实体,其支持的权限控制也有所不同。
(以下为 DML 语句用法)
插入完整的行
插入行的一部分
插入查询出来的数据
删除表中的指定数据
清空表中的数据
查询单列
查询多列
查询所有列
查询不同的值
*查询结果
子查询的子查询
SELECT 语句中的 WHERE 子句
UPDATE 语句中的 WHERE 子句
DELETE 语句中的 WHERE 子句
IN 示例
BETWEEN 示例
AND 示例
OR 示例
NOT 示例
% 示例
_ 示例
组合查询
其中, SOUNDEX() 可以将一个字符串转换为描述其语音表示的字母数字模式。
AVG() 会忽略 NULL 行。
使用 DISTINCT 可以让汇总函数值汇总不同的值。
指定多个列的排序方向
分组
分组后排序
使用 WHERE 和 HAVING 过滤数据
(以下为 DDL 语句用法)
普通创建
根据已有的表创建新表
添加列
删除列
修改列
添加主键
删除主键
创建表时使用约束条件:
(以下为 TCL 语句用法)
(以下为 DCL 语句用法)
可以使用触发器来进行审计跟踪,把修改记录到另外一张表中。
MySQL 不允许在触发器中使用 CALL 语句 ,也就是不能调用存储过程。
BEGIN 和 END
当触发器的触发条件满足时,将会执行 BEGIN 和 END 之间的触发器执行动作。
NEW 和 OLD
CREATE TRIGGER 指令用于创建触发器。
语法:
说明:
示例:
SQL 语法速成手册(干货满满,建议收藏!)
SQL 语法结构包括:
例如: SELECT 与 select 、 Select 是相同的。
数据定义语言(Data Definition Language,DDL)是 SQL 语言集中负责数据结构定义与数据库对象定义的语言。
DDL 的主要功能是 定义数据库对象 。
DDL 的核心指令是 CREATE 、 ALTER 、 DROP 。
数据操纵语言(Data Manipulation Language, DML)是用于数据库操作,对数据库其中的对象和数据运行访问工作的编程语句。
DML 的主要功能是 访问数据 ,因此其语法都是以 读写数据库 为主。
DML 的核心指令是 INSERT 、 UPDATE 、 DELETE 、 SELECT 。这四个指令合称 CRUD(Create, Read, Update, Delete),即增删改查。
事务控制语言 (Transaction Control Language, TCL) 用于 管理数据库中的事务 。这些用于管理由 DML 语句所做的更改。它还允许将语句分组为逻辑事务。
TCL 的核心指令是 COMMIT 、 ROLLBACK 。
数据控制语言 (Data Control Language, DCL) 是一种可对数据访问权进行控制的指令,它可以控制特定用户账户对数据表、查看表、预存程序、用户自定义函数等数据库对象的控制权。
DCL 的核心指令是 GRANT 、 REVOKE 。
DCL 以 控制用户的访问权限 为主,因此其指令作法并不复杂,可利用 DCL 控制的权限有: CONNECT 、 SELECT 、 INSERT 、 UPDATE 、 DELETE 、 EXECUTE 、 USAGE 、 REFERENCES 。
根据不同的 DBMS 以及不同的安全性实体,其支持的权限控制也有所不同。
(以下为 DML 语句用法)
插入完整的行
插入行的一部分
插入查询出来的数据
删除表中的指定数据
清空表中的数据
查询单列
查询多列
查询所有列
查询不同的值
*查询结果
子查询的子查询
SELECT 语句中的 WHERE 子句
UPDATE 语句中的 WHERE 子句
DELETE 语句中的 WHERE 子句
IN 示例
BETWEEN 示例
AND 示例
OR 示例
NOT 示例
% 示例
_ 示例
组合查询
其中, SOUNDEX() 可以将一个字符串转换为描述其语音表示的字母数字模式。
AVG() 会忽略 NULL 行。
使用 DISTINCT 可以让汇总函数值汇总不同的值。
指定多个列的排序方向
分组
分组后排序
使用 WHERE 和 HAVING 过滤数据
(以下为 DDL 语句用法)
普通创建
根据已有的表创建新表
添加列
删除列
修改列
添加主键
删除主键
创建表时使用约束条件:
(以下为 TCL 语句用法)
(以下为 DCL 语句用法)
可以使用触发器来进行审计跟踪,把修改记录到另外一张表中。
MySQL 不允许在触发器中使用 CALL 语句 ,也就是不能调用存储过程。
BEGIN 和 END
当触发器的触发条件满足时,将会执行 BEGIN 和 END 之间的触发器执行动作。
NEW 和 OLD
CREATE TRIGGER 指令用于创建触发器。
语法:
说明:
示例:
sql语句,有的全要
SELECT --从数据库表中检索数据行和列
INSERT --向数据库表添加新数据行
DELETE --从数据库表中删除数据行
UPDATE --更新数据库表中的数据
--数据定义
CREATE TABLE --创建一个数据库表
DROP TABLE --从数据库中删除表
ALTER TABLE --修改数据库表结构
CREATE VIEW --创建一个视图
DROP VIEW --从数据库中删除视图
CREATE INDEX --为数据库表创建一个索引
DROP INDEX --从数据库中删除索引
CREATE PROCEDURE --创建一个存储过程
DROP PROCEDURE --从数据库中删除存储过程
CREATE TRIGGER --创建一个触发器
DROP TRIGGER --从数据库中删除触发器
CREATE SCHEMA --向数据库添加一个新模式
DROP SCHEMA --从数据库中删除一个模式
CREATE DOMAIN --创建一个数据值域
ALTER DOMAIN --改变域定义
DROP DOMAIN --从数据库中删除一个域
--数据控制
GRANT --授予用户访问权限
DENY --拒绝用户访问
REVOKE --解除用户访问权限
--事务控制
COMMIT --结束当前事务
ROLLBACK --中止当前事务
SET TRANSACTION --定义当前事务数据访问特征
--程序化SQL
DECLARE --为查询设定游标
EXPLAN --为查询描述数据访问计划
OPEN --检索查询结果打开一个游标
FETCH --检索一行查询结果
CLOSE --关闭游标
PREPARE --为动态执行准备SQL 语句
EXECUTE --动态地执行SQL 语句
DESCRIBE --描述准备好的查询
---局部变量
declare @id char(10)
--set @id = '10010001'
select @id = '10010001'
---全局变量
---必须以@@开头
--IF ELSE
declare @x int @y int @z int
select @x = 1 @y = 2 @z=3
if @x > @y
print 'x > y' --打印字符串'x > y'
else if @y > @z
print 'y > z'
else print 'z > y'
--CASE
use pangu
update employee
set e_wage =
case
when job_level = ’1’ then e_wage*1.08
when job_level = ’2’ then e_wage*1.07
when job_level = ’3’ then e_wage*1.06
else e_wage*1.05
end
--WHILE CONTINUE BREAK
declare @x int @y int @c int
select @x = 1 @y=1
while @x < 3
begin
print @x --打印变量x 的值
while @y < 3
begin
select @c = 100*@x + @y
print @c --打印变量c 的值
select @y = @y + 1
end
select @x = @x + 1
select @y = 1
end
--WAITFOR
--例 等待1 小时2 分零3 秒后才执行SELECT 语句
waitfor delay ’01:02:03’
select * from employee
--例 等到晚上11 点零8 分后才执行SELECT 语句
waitfor time ’23:08:00’
select * from employee
***SELECT***
select *(列名) from table_name(表名) where column_name operator value
ex:(宿主)
select * from stock_information where stockid = str(nid)
stockname = 'str_name'
stockname like '% find this %'
stockname like '[a-zA-Z]%' --------- ([]指定值的范围)
stockname like '[^F-M]%' --------- (^排除指定范围)
--------- 只能在使用like关键字的where子句中使用通配符)
or stockpath = 'stock_path'
or stocknumber < 1000
and stockindex = 24
not stocksex = 'man'
stocknumber between 20 and 100
stocknumber in(10,20,30)
order by stockid desc(asc) --------- 排序,desc-降序,asc-升序
order by 1,2 --------- by列号
stockname = (select stockname from stock_information where stockid = 4)
--------- 子查询
--------- 除非能确保内层select只返回一个行的值,
--------- 否则应在外层where子句中用一个in限定符
select distinct column_name form table_name --------- distinct指定检索独有的列值,不重复
select stocknumber ,"stocknumber + 10" = stocknumber + 10 from table_name
select stockname , "stocknumber" = count(*) from table_name group by stockname
--------- group by 将表按行分组,指定列中有相同的值
having count(*) = 2 --------- having选定指定的组
select *
from table1, table2
where table1.id *= table2.id -------- 左外部连接,table1中有的而table2中没有得以null表示
table1.id =* table2.id -------- 右外部连接
select stockname from table1
union [all] ----- union合并查询结果集,all-保留重复行
select stockname from table2
***insert***
insert into table_name (Stock_name,Stock_number) value ("xxx","xxxx")
value (select Stockname , Stocknumber from Stock_table2)---value为select语句
***update***
update table_name set Stockname = "xxx" [where Stockid = 3]
Stockname = default
Stockname = null
Stocknumber = Stockname + 4
***delete***
delete from table_name where Stockid = 3
truncate table_name ----------- 删除表中所有行,仍保持表的完整性
drop table table_name --------------- 完全删除表
***alter table*** --- 修改数据库表结构
alter table database.owner.table_name add column_name char(2) null .....
sp_help table_name ---- 显示表已有特征
create table table_name (name char(20), age smallint, lname varchar(30))
insert into table_name select ......... ----- 实现删除列的方法(创建新表)
alter table table_name drop constraint Stockname_default ---- 删除Stockname的default约束
***function(/*常用函数*/)***
----统计函数----
AVG --求平均值
COUNT --统计数目
MAX --求最大值
MIN --求最小值
SUM --求和
--AVG
use pangu
select avg(e_wage) as dept_avgWage
from employee
group by dept_id
--MAX
--求工资最高的员工姓名
use pangu
select e_name
from employee
where e_wage =
(select max(e_wage)
from employee)
--STDEV()
--STDEV()函数返回表达式中所有数据的标准差
--STDEVP()
--STDEVP()函数返回总体标准差
--VAR()
--VAR()函数返回表达式中所有值的统计变异数
--VARP()
--VARP()函数返回总体变异数
----算术函数----
/***三角函数***/
SIN(float_expression) --返回以弧度表示的角的正弦
COS(float_expression) --返回以弧度表示的角的余弦
TAN(float_expression) --返回以弧度表示的角的正切
COT(float_expression) --返回以弧度表示的角的余切
/***反三角函数***/
ASIN(float_expression) --返回正弦是FLOAT 值的以弧度表示的角
ACOS(float_expression) --返回余弦是FLOAT 值的以弧度表示的角
ATAN(float_expression) --返回正切是FLOAT 值的以弧度表示的角
ATAN2(float_expression1,float_expression2)
--返回正切是float_expression1 /float_expres-sion2的以弧度表示的角
DEGREES(numeric_expression)
--把弧度转换为角度返回与表达式相同的数据类型可为
--INTEGER/MONEY/REAL/FLOAT 类型
RADIANS(numeric_expression) --把角度转换为弧度返回与表达式相同的数据类型可为
--INTEGER/MONEY/REAL/FLOAT 类型
EXP(float_expression) --返回表达式的指数值
LOG(float_expression) --返回表达式的自然对数值
LOG10(float_expression)--返回表达式的以10 为底的对数值
SQRT(float_expression) --返回表达式的平方根
/***取近似值函数***/
CEILING(numeric_expression) --返回>=表达式的最小整数返回的数据类型与表达式相同可为
--INTEGER/MONEY/REAL/FLOAT 类型
FLOOR(numeric_expression) --返回<=表达式的最小整数返回的数据类型与表达式相同可为
--INTEGER/MONEY/REAL/FLOAT 类型
ROUND(numeric_expression) --返回以integer_expression 为精度的四舍五入值返回的数据
--类型与表达式相同可为INTEGER/MONEY/REAL/FLOAT 类型
ABS(numeric_expression) --返回表达式的绝对值返回的数据类型与表达式相同可为
--INTEGER/MONEY/REAL/FLOAT 类型
SIGN(numeric_expression) --测试参数的正负号返回0 零值1 正数或-1 负数返回的数据类型
--与表达式相同可为INTEGER/MONEY/REAL/FLOAT 类型
PI() --返回值为π 即3.1415926535897936
RAND([integer_expression]) --用任选的[integer_expression]做种子值得出0-1 间的随机浮点数
----字符串函数----
ASCII() --函数返回字符表达式最左端字符的ASCII 码值
CHAR() --函数用于将ASCII 码转换为字符
--如果没有输入0 ~ 255 之间的ASCII 码值CHAR 函数会返回一个NULL 值
LOWER() --函数把字符串全部转换为小写
UPPER() --函数把字符串全部转换为大写
STR() --函数把数值型数据转换为字符型数据
LTRIM() --函数把字符串头部的空格去掉
RTRIM() --函数把字符串尾部的空格去掉
LEFT(),RIGHT(),SUBSTRING() --函数返回部分字符串
CHARINDEX(),PATINDEX() --函数返回字符串中某个指定的子串出现的开始位置
SOUNDEX() --函数返回一个四位字符码
--SOUNDEX函数可用来查找声音相似的字符串但SOUNDEX函数对数字和汉字均只返回0 值
DIFFERENCE() --函数返回由SOUNDEX 函数返回的两个字符表达式的值的差异
--0 两个SOUNDEX 函数返回值的第一个字符不同
--1 两个SOUNDEX 函数返回值的第一个字符相同
--2 两个SOUNDEX 函数返回值的第一二个字符相同
--3 两个SOUNDEX 函数返回值的第一二三个字符相同
--4 两个SOUNDEX 函数返回值完全相同
QUOTENAME() --函数返回被特定字符括起来的字符串
/*select quotename('abc', '{') quotename('abc')
运行结果如下
----------------------------------{
{abc} [abc]*/
REPLICATE() --函数返回一个重复character_expression 指定次数的字符串
/*select replicate('abc', 3) replicate( 'abc', -2)
运行结果如下
----------- -----------
abcabcabc NULL*/
REVERSE() --函数将指定的字符串的字符排列顺序颠倒
REPLACE() --函数返回被替换了指定子串的字符串
/*select replace('abc123g', '123', 'def')
运行结果如下
----------- -----------
abcdefg*/
SPACE() --函数返回一个有指定长度的空白字符串
STUFF() --函数用另一子串替换字符串指定位置长度的子串
----数据类型转换函数----
CAST() 函数语法如下
CAST() (<expression> AS <data_ type>[ length ])
CONVERT() 函数语法如下
CONVERT() (<data_ type>[ length ], <expression> [, style])
select cast(100+99 as char) convert(varchar(12), getdate())
运行结果如下
------------------------------ ------------
199 Jan 15 2000
----日期函数----
DAY() --函数返回date_expression 中的日期值
MONTH() --函数返回date_expression 中的月份值
YEAR() --函数返回date_expression 中的年份值
DATEADD(<datepart> ,<number> ,<date>)
--函数返回指定日期date 加上指定的额外日期间隔number 产生的新日期
DATEDIFF(<datepart> ,<number> ,<date>)
--函数返回两个指定日期在datepart 方面的不同之处
DATENAME(<datepart> , <date>) --函数以字符串的形式返回日期的指定部分
DATEPART(<datepart> , <date>) --函数以整数值的形式返回日期的指定部分
GETDATE() --函数以DATETIME 的缺省格式返回系统当前的日期和时间
----系统函数----
APP_NAME() --函数返回当前执行的应用程序的名称
COALESCE() --函数返回众多表达式中第一个非NULL 表达式的值
COL_LENGTH(<'table_name'>, <'column_name'>) --函数返回表中指定字段的长度值
COL_NAME(<table_id>, <column_id>) --函数返回表中指定字段的名称即列名
DATALENGTH() --函数返回数据表达式的数据的实际长度
DB_ID(['database_name']) --函数返回数据库的编号
DB_NAME(database_id) --函数返回数据库的名称
HOST_ID() --函数返回服务器端计算机的名称
HOST_NAME() --函数返回服务器端计算机的名称
IDENTITY(<data_type>[, seed increment]) [AS column_name])
--IDENTITY() 函数只在SELECT INTO 语句中使用用于插入一个identity column列到新表中
/*select identity(int, 1, 1) as column_name
into newtable
from oldtable*/
ISDATE() --函数判断所给定的表达式是否为合理日期
ISNULL(<check_expression>, <replacement_value>) --函数将表达式中的NULL 值用指定值替换
ISNUMERIC() --函数判断所给定的表达式是否为合理的数值
NEWID() --函数返回一个UNIQUEIDENTIFIER 类型的数值
NULLIF(<expression1>, <expression2>)
--NULLIF 函数在expression1 与expression2 相等时返回NULL 值若不相等时则返回expression1 的值
--------------------------------------------------------------------------------
sql中的保留字
action add aggregate all
alter after and as
asc avg avg_row_length auto_increment
between bigint bit binary
blob bool both by
cascade case char character
change check checksum column
columns comment constraint create
cross current_date current_time current_timestamp
data database databases date
datetime day day_hour day_minute
day_second dayofmonth dayofweek dayofyear
dec decimal default delayed
delay_key_write delete desc describe
distinct distinctrow double drop
end else escape escaped
enclosed enum explain exists
fields file first float
float4 float8 flush foreign
from for full function
global grant grants group
having heap high_priority hour
hour_minute hour_second hosts identified
ignore in index infile
inner insert insert_id int
integer interval int1 int2
int3 int4 int8 into
if is isam join
key keys kill last_insert_id
leading left length like
lines limit load local
lock logs long longblob
longtext low_priority max max_rows
match mediumblob mediumtext mediumint
middleint min_rows minute minute_second
modify month monthname myisam
natural numeric no not
null on optimize option
optionally or order outer
outfile pack_keys partial password
precision primary procere process
processlist privileges read real
references reload regexp rename
replace restrict returns revoke
rlike row rows second
select set show shutdown
smallint soname sql_big_tables sql_big_selects
sql_low_priority_updates sql_log_off sql_log_update sql_select_limit
sql_small_result sql_big_result sql_warnings straight_join
starting status string table
tables temporary terminated text
then time timestamp tinyblob
tinytext tinyint trailing to
type use using unique
unlock unsigned update usage
values varchar variables varying
varbinary with write when
where year year_month zerofill
sql语句,有的全要
SELECT --从数据库表中检索数据行和列
INSERT --向数据库表添加新数据行
DELETE --从数据库表中删除数据行
UPDATE --更新数据库表中的数据
--数据定义
CREATE TABLE --创建一个数据库表
DROP TABLE --从数据库中删除表
ALTER TABLE --修改数据库表结构
CREATE VIEW --创建一个视图
DROP VIEW --从数据库中删除视图
CREATE INDEX --为数据库表创建一个索引
DROP INDEX --从数据库中删除索引
CREATE PROCEDURE --创建一个存储过程
DROP PROCEDURE --从数据库中删除存储过程
CREATE TRIGGER --创建一个触发器
DROP TRIGGER --从数据库中删除触发器
CREATE SCHEMA --向数据库添加一个新模式
DROP SCHEMA --从数据库中删除一个模式
CREATE DOMAIN --创建一个数据值域
ALTER DOMAIN --改变域定义
DROP DOMAIN --从数据库中删除一个域
--数据控制
GRANT --授予用户访问权限
DENY --拒绝用户访问
REVOKE --解除用户访问权限
--事务控制
COMMIT --结束当前事务
ROLLBACK --中止当前事务
SET TRANSACTION --定义当前事务数据访问特征
--程序化SQL
DECLARE --为查询设定游标
EXPLAN --为查询描述数据访问计划
OPEN --检索查询结果打开一个游标
FETCH --检索一行查询结果
CLOSE --关闭游标
PREPARE --为动态执行准备SQL 语句
EXECUTE --动态地执行SQL 语句
DESCRIBE --描述准备好的查询
---局部变量
declare @id char(10)
--set @id = '10010001'
select @id = '10010001'
---全局变量
---必须以@@开头
--IF ELSE
declare @x int @y int @z int
select @x = 1 @y = 2 @z=3
if @x > @y
print 'x > y' --打印字符串'x > y'
else if @y > @z
print 'y > z'
else print 'z > y'
--CASE
use pangu
update employee
set e_wage =
case
when job_level = ’1’ then e_wage*1.08
when job_level = ’2’ then e_wage*1.07
when job_level = ’3’ then e_wage*1.06
else e_wage*1.05
end
--WHILE CONTINUE BREAK
declare @x int @y int @c int
select @x = 1 @y=1
while @x < 3
begin
print @x --打印变量x 的值
while @y < 3
begin
select @c = 100*@x + @y
print @c --打印变量c 的值
select @y = @y + 1
end
select @x = @x + 1
select @y = 1
end
--WAITFOR
--例 等待1 小时2 分零3 秒后才执行SELECT 语句
waitfor delay ’01:02:03’
select * from employee
--例 等到晚上11 点零8 分后才执行SELECT 语句
waitfor time ’23:08:00’
select * from employee
***SELECT***
select *(列名) from table_name(表名) where column_name operator value
ex:(宿主)
select * from stock_information where stockid = str(nid)
stockname = 'str_name'
stockname like '% find this %'
stockname like '[a-zA-Z]%' --------- ([]指定值的范围)
stockname like '[^F-M]%' --------- (^排除指定范围)
--------- 只能在使用like关键字的where子句中使用通配符)
or stockpath = 'stock_path'
or stocknumber < 1000
and stockindex = 24
not stocksex = 'man'
stocknumber between 20 and 100
stocknumber in(10,20,30)
order by stockid desc(asc) --------- 排序,desc-降序,asc-升序
order by 1,2 --------- by列号
stockname = (select stockname from stock_information where stockid = 4)
--------- 子查询
--------- 除非能确保内层select只返回一个行的值,
--------- 否则应在外层where子句中用一个in限定符
select distinct column_name form table_name --------- distinct指定检索独有的列值,不重复
select stocknumber ,"stocknumber + 10" = stocknumber + 10 from table_name
select stockname , "stocknumber" = count(*) from table_name group by stockname
--------- group by 将表按行分组,指定列中有相同的值
having count(*) = 2 --------- having选定指定的组
select *
from table1, table2
where table1.id *= table2.id -------- 左外部连接,table1中有的而table2中没有得以null表示
table1.id =* table2.id -------- 右外部连接
select stockname from table1
union [all] ----- union合并查询结果集,all-保留重复行
select stockname from table2
***insert***
insert into table_name (Stock_name,Stock_number) value ("xxx","xxxx")
value (select Stockname , Stocknumber from Stock_table2)---value为select语句
***update***
update table_name set Stockname = "xxx" [where Stockid = 3]
Stockname = default
Stockname = null
Stocknumber = Stockname + 4
***delete***
delete from table_name where Stockid = 3
truncate table_name ----------- 删除表中所有行,仍保持表的完整性
drop table table_name --------------- 完全删除表
***alter table*** --- 修改数据库表结构
alter table database.owner.table_name add column_name char(2) null .....
sp_help table_name ---- 显示表已有特征
create table table_name (name char(20), age smallint, lname varchar(30))
insert into table_name select ......... ----- 实现删除列的方法(创建新表)
alter table table_name drop constraint Stockname_default ---- 删除Stockname的default约束
***function(/*常用函数*/)***
----统计函数----
AVG --求平均值
COUNT --统计数目
MAX --求最大值
MIN --求最小值
SUM --求和
--AVG
use pangu
select avg(e_wage) as dept_avgWage
from employee
group by dept_id
--MAX
--求工资最高的员工姓名
use pangu
select e_name
from employee
where e_wage =
(select max(e_wage)
from employee)
--STDEV()
--STDEV()函数返回表达式中所有数据的标准差
--STDEVP()
--STDEVP()函数返回总体标准差
--VAR()
--VAR()函数返回表达式中所有值的统计变异数
--VARP()
--VARP()函数返回总体变异数
----算术函数----
/***三角函数***/
SIN(float_expression) --返回以弧度表示的角的正弦
COS(float_expression) --返回以弧度表示的角的余弦
TAN(float_expression) --返回以弧度表示的角的正切
COT(float_expression) --返回以弧度表示的角的余切
/***反三角函数***/
ASIN(float_expression) --返回正弦是FLOAT 值的以弧度表示的角
ACOS(float_expression) --返回余弦是FLOAT 值的以弧度表示的角
ATAN(float_expression) --返回正切是FLOAT 值的以弧度表示的角
ATAN2(float_expression1,float_expression2)
--返回正切是float_expression1 /float_expres-sion2的以弧度表示的角
DEGREES(numeric_expression)
--把弧度转换为角度返回与表达式相同的数据类型可为
--INTEGER/MONEY/REAL/FLOAT 类型
RADIANS(numeric_expression) --把角度转换为弧度返回与表达式相同的数据类型可为
--INTEGER/MONEY/REAL/FLOAT 类型
EXP(float_expression) --返回表达式的指数值
LOG(float_expression) --返回表达式的自然对数值
LOG10(float_expression)--返回表达式的以10 为底的对数值
SQRT(float_expression) --返回表达式的平方根
/***取近似值函数***/
CEILING(numeric_expression) --返回>=表达式的最小整数返回的数据类型与表达式相同可为
--INTEGER/MONEY/REAL/FLOAT 类型
FLOOR(numeric_expression) --返回<=表达式的最小整数返回的数据类型与表达式相同可为
--INTEGER/MONEY/REAL/FLOAT 类型
ROUND(numeric_expression) --返回以integer_expression 为精度的四舍五入值返回的数据
--类型与表达式相同可为INTEGER/MONEY/REAL/FLOAT 类型
ABS(numeric_expression) --返回表达式的绝对值返回的数据类型与表达式相同可为
--INTEGER/MONEY/REAL/FLOAT 类型
SIGN(numeric_expression) --测试参数的正负号返回0 零值1 正数或-1 负数返回的数据类型
--与表达式相同可为INTEGER/MONEY/REAL/FLOAT 类型
PI() --返回值为π 即3.1415926535897936
RAND([integer_expression]) --用任选的[integer_expression]做种子值得出0-1 间的随机浮点数
----字符串函数----
ASCII() --函数返回字符表达式最左端字符的ASCII 码值
CHAR() --函数用于将ASCII 码转换为字符
--如果没有输入0 ~ 255 之间的ASCII 码值CHAR 函数会返回一个NULL 值
LOWER() --函数把字符串全部转换为小写
UPPER() --函数把字符串全部转换为大写
STR() --函数把数值型数据转换为字符型数据
LTRIM() --函数把字符串头部的空格去掉
RTRIM() --函数把字符串尾部的空格去掉
LEFT(),RIGHT(),SUBSTRING() --函数返回部分字符串
CHARINDEX(),PATINDEX() --函数返回字符串中某个指定的子串出现的开始位置
SOUNDEX() --函数返回一个四位字符码
--SOUNDEX函数可用来查找声音相似的字符串但SOUNDEX函数对数字和汉字均只返回0 值
DIFFERENCE() --函数返回由SOUNDEX 函数返回的两个字符表达式的值的差异
--0 两个SOUNDEX 函数返回值的第一个字符不同
--1 两个SOUNDEX 函数返回值的第一个字符相同
--2 两个SOUNDEX 函数返回值的第一二个字符相同
--3 两个SOUNDEX 函数返回值的第一二三个字符相同
--4 两个SOUNDEX 函数返回值完全相同
QUOTENAME() --函数返回被特定字符括起来的字符串
/*select quotename('abc', '{') quotename('abc')
运行结果如下
----------------------------------{
{abc} [abc]*/
REPLICATE() --函数返回一个重复character_expression 指定次数的字符串
/*select replicate('abc', 3) replicate( 'abc', -2)
运行结果如下
----------- -----------
abcabcabc NULL*/
REVERSE() --函数将指定的字符串的字符排列顺序颠倒
REPLACE() --函数返回被替换了指定子串的字符串
/*select replace('abc123g', '123', 'def')
运行结果如下
----------- -----------
abcdefg*/
SPACE() --函数返回一个有指定长度的空白字符串
STUFF() --函数用另一子串替换字符串指定位置长度的子串
----数据类型转换函数----
CAST() 函数语法如下
CAST() (<expression> AS <data_ type>[ length ])
CONVERT() 函数语法如下
CONVERT() (<data_ type>[ length ], <expression> [, style])
select cast(100+99 as char) convert(varchar(12), getdate())
运行结果如下
------------------------------ ------------
199 Jan 15 2000
----日期函数----
DAY() --函数返回date_expression 中的日期值
MONTH() --函数返回date_expression 中的月份值
YEAR() --函数返回date_expression 中的年份值
DATEADD(<datepart> ,<number> ,<date>)
--函数返回指定日期date 加上指定的额外日期间隔number 产生的新日期
DATEDIFF(<datepart> ,<number> ,<date>)
--函数返回两个指定日期在datepart 方面的不同之处
DATENAME(<datepart> , <date>) --函数以字符串的形式返回日期的指定部分
DATEPART(<datepart> , <date>) --函数以整数值的形式返回日期的指定部分
GETDATE() --函数以DATETIME 的缺省格式返回系统当前的日期和时间
----系统函数----
APP_NAME() --函数返回当前执行的应用程序的名称
COALESCE() --函数返回众多表达式中第一个非NULL 表达式的值
COL_LENGTH(<'table_name'>, <'column_name'>) --函数返回表中指定字段的长度值
COL_NAME(<table_id>, <column_id>) --函数返回表中指定字段的名称即列名
DATALENGTH() --函数返回数据表达式的数据的实际长度
DB_ID(['database_name']) --函数返回数据库的编号
DB_NAME(database_id) --函数返回数据库的名称
HOST_ID() --函数返回服务器端计算机的名称
HOST_NAME() --函数返回服务器端计算机的名称
IDENTITY(<data_type>[, seed increment]) [AS column_name])
--IDENTITY() 函数只在SELECT INTO 语句中使用用于插入一个identity column列到新表中
/*select identity(int, 1, 1) as column_name
into newtable
from oldtable*/
ISDATE() --函数判断所给定的表达式是否为合理日期
ISNULL(<check_expression>, <replacement_value>) --函数将表达式中的NULL 值用指定值替换
ISNUMERIC() --函数判断所给定的表达式是否为合理的数值
NEWID() --函数返回一个UNIQUEIDENTIFIER 类型的数值
NULLIF(<expression1>, <expression2>)
--NULLIF 函数在expression1 与expression2 相等时返回NULL 值若不相等时则返回expression1 的值
--------------------------------------------------------------------------------
sql中的保留字
action add aggregate all
alter after and as
asc avg avg_row_length auto_increment
between bigint bit binary
blob bool both by
cascade case char character
change check checksum column
columns comment constraint create
cross current_date current_time current_timestamp
data database databases date
datetime day day_hour day_minute
day_second dayofmonth dayofweek dayofyear
dec decimal default delayed
delay_key_write delete desc describe
distinct distinctrow double drop
end else escape escaped
enclosed enum explain exists
fields file first float
float4 float8 flush foreign
from for full function
global grant grants group
having heap high_priority hour
hour_minute hour_second hosts identified
ignore in index infile
inner insert insert_id int
integer interval int1 int2
int3 int4 int8 into
if is isam join
key keys kill last_insert_id
leading left length like
lines limit load local
lock logs long longblob
longtext low_priority max max_rows
match mediumblob mediumtext mediumint
middleint min_rows minute minute_second
modify month monthname myisam
natural numeric no not
null on optimize option
optionally or order outer
outfile pack_keys partial password
precision primary procere process
processlist privileges read real
references reload regexp rename
replace restrict returns revoke
rlike row rows second
select set show shutdown
smallint soname sql_big_tables sql_big_selects
sql_low_priority_updates sql_log_off sql_log_update sql_select_limit
sql_small_result sql_big_result sql_warnings straight_join
starting status string table
tables temporary terminated text
then time timestamp tinyblob
tinytext tinyint trailing to
type use using unique
unlock unsigned update usage
values varchar variables varying
varbinary with write when
where year year_month zerofill
常用SQL语句,看这篇就够了
本文主要以 Mysql 数据库为基础,对常用 SQL 语句进行一次深度总结,由于篇幅较长,难免会有些遗漏的地方,欢迎网友批评指出!
具体内容主要有以下几个部分:
创建数据库比较简单,在创建的时候直接指定字符集、排序规则即可!
例子:
数据库修改库名的有三种方法,如果是 MyISAM 存储引擎,那么可以直接去数据库目录 mv 就可以了,如果是 Innodb 完全不行,会提示相关表不存在。
这个语法在 mysql-5.1.7 中被添加进来,到了 mysql-5.1.23 又去掉了,官方不推荐,会有丢失数据的危险!
思路是先创建一个新库,之后将旧库的数据导入到新库,即可完成修改库名!
当然这种方法虽然安全,但是如果数据量大,会比较耗时,同时还需要考虑到磁盘空间等硬件成本。
例子:
直接跑一个 shell 脚本!
其中 p123456 , p 是 password 的简称, 123456 表示数据库密码值!
删除库,比较简单,直接删除即可!
或者
MySQL 主要有以下几种运算符:
运算符描述实例 +加法select 1+2; 结果为3 -减法select 1-2; 结果为-1 *乘法select 2*3; 结果为6 /除法select 6/3; 结果为2 %取余select 10%3; 结果为1
说明: 在除法运算和模运算中,如果除数为0,将是非法除数,返回结果为NULL 。
SELECT 语句中的条件语句经常要使用比较运算符。通过这些比较运算符,可以判断表中的哪些记录是符合条件的。比较结果为真,则返回 1,为假则返回 0,比较结果不确定则返回 NULL。
运算符描述实例 =等于select * from t_user where user_id = 1 查询用户ID为1的信息 !=不等于select * from t_user where user_id != 1 查询用户ID不为1的信息 >大于select * from t_user where user_id > 1 查询用户ID大于1的信息 >=大于select * from t_user where user_id >= 1 查询用户ID大于等于1的信息 大于select * from t_user where user_id < 1 查询用户ID小于1的信息 <=大于select * from t_user where user_id <= 1 查询用户ID小于等于1的信息 BETWEEN AND在两值之间select * from t_user where user_id between 1 and 100 查询用户ID在1和100之间的信息,类似user_id >=1 and user_id <=100 NOT BETWEEN AND不在两值之间select * from t_user where user_id not between 1 and 100 查询用户ID不在1和100之间的信息,类似user_id 100 IN在集合中select * from t_user where user_id in ('1','2') 查询用户ID为 1 或者 2 的信息 NOT IN不在集合中select * from t_user where user_id not in ('1','2') 查询用户ID不为 1 和 2 的信息 LIKE模糊匹配,%表示0个或者多个匹配select * from t_user where user_name like '%张%' 查询用户姓名包含张的信息 IS NULL为空select * from t_user where user_name is null 查询用户姓名为空的信息 IS NOT NULL不为空select * from t_user where user_name not is null 查询用户姓名不为空的信息
说明: mysql中,IN 语句中参数个数是不的。不过对整段 sql 语句的长度有了,最大不超过 4M !
逻辑运算符用来判断表达式的真假。如果表达式是真,结果返回 1。如果表达式是假,结果返回 0。
运算符描述实例 NOT 或 !逻辑非select not 1; 结果为0 AND逻辑与select 2 and 0; 结果为0 OR逻辑或select 2 or 0; 结果为1 XOR逻辑异或select null or 1; 结果为1
位运算符是在二进制数上进行计算的运算符。位运算会先将操作数变成二进制数,进行位运算。然后再将计算结果从二进制数变回十进制数。
运算符描述实例 &按位与select 3&5; 结果为1 I按位或select 3I5; 结果为7 ^按位异或select 3I5; 结果为7 ^按位异或select 3^5; 结果为6 ~按位取反select ~18446744073709551612; 结果为3 >>按位右移select 3>>1; 结果为1 <按位左移select 3<<1; 结果为6
优先级(从高到底)运算符 1! 2-(负号),~(按位取反) 3^(按位异或) 4*,/(DIV),%(MOD) 5+,- 6>>,<< 7& 8I 9=(比较运算),,<,,>=,!=,>,IN,IS NULL,LIKE,REGEXP 10BETWEEN AND,CASE,WHEN,THEN,ELSE 11NOT 12&&,AND 13XOR 14II,OR 15=(赋值运算),:=
说明: 在无法确定优先级的情况下,可以使用圆括号 () 来改变优先级,并且这样会使计算过程更加清晰 。
视图(view)是一种虚拟存在的表,是一个逻辑表,本身并不包含数据。作为一个select语句保存在数据字典中的。
参数说明:
基本格式:
创建视图示例:
删除视图是指删除数据库中已存在的视图,删除视图时,只能删除视图的定义,不会删除数据,也就是说不动基表:
删除示例:
函数描述实例 char_length(s)返回字符串 s 的字符长度select char_length("hello") as content; concat(s1,s2...sn)字符串 s1,s2 等多个字符串合并为一个字符串select concat("hello ", "world") as content; format(x,n)将数字 x 进行格式化,到小数点后 n 位,最后一位四舍五入select format(500.5634, 2) as content; lower(s)将所有字母变成小写字母select lower('HELLO'); current_timestamp()返回当前日期和时间select current_timestamp(); DATE_FORMAT(date,format)格式化时间或者日期select DATE_FORMAT(current_timestamp(),"%Y-%m-%d %H:%i:%s"); IFNULL(v1,v2)如果 v1 的值不为 NULL,则返回 v1,否则返回 v2select IFNULL(null,'hello word');
参数说明:
参数说明:
参数说明:
参数说明:
示例:
参数说明:
参数说明:
创建一个查询用户信息的存储过程示例:
输出结果:
删除示例:
触发器是与表有关的数据库对象,在满足定义条件时触发,并执行触发器中定义的语句集合。
定义语法
参数说明:
示例,创建了一个名为trig1的触发器,一旦在 t_user 表中有插入动作,就会自动往 t_time 表里插入当前时间。
创建有多个执行语句的触发器语法
示例如下:
一旦插入成功,就会执行 BEGIN ...END 语句!
所有触发器信息都存储在information_schema数据库下的triggers表中,可以使用SELECT语句查询,如果触发器信息过多,最好通过TRIGGER_NAME字段指定查询。
示例如下:
删除触发器之后最好使用上面的方法查看一遍。
触发器尽量少的使用,因为不管如何,它还是很消耗资源,如果使用的话要谨慎的使用,确定它是非常高效的:触发器是针对每一行的;对增删改非常频繁的表上切记不要使用触发器,因为它会非常消耗资源。
在 MySQL 中,可以有如下几种途径实现唯一值:
在mysql中,一般我们可以给某个主键字段设置为自增模式,例如:
这种模式,在单库单表的时候,没啥问题,但是如果要对 test_db 表进行分库分表,这个时候问题就来了,如果水平分库,这个时候向 test_db_1 、 test_db_2 中插入数据,就会出现相同的 ID !
当然,为了避免出现这种情况,有的大神就自己单独创建了一张自增序列表,单独维护,这样就不会出现在分表的时候出现相同的ID!
实现过程也很简单!
这方案,某种情况下解决了分表的问题,但是如果分库还是会出现相同的ID!
UUID 基于 16 进制,由 32 位小写的 16 进制数字组成,如下:
比如 d0c754a8-178e-11eb-ae3d-2a7bea22ed3d 就是一个典型的 UUID。
在 MySQL 的 UUID() 函数中,前三组数字从时间戳中生成,第四组数字暂时保持时间戳的唯一性,第五组数字是一个 IEEE 802 节点标点值,保证空间唯一。
使用 UUID() 函数,可以生成时间、空间上都独一无二的值。据说只要是使用了 UUID,都不可能看到两个重复的 UUID 值。当然,这个只是在理论情况下。
使用方法也很简单,在 sql 可以直接当成函数调用即可!
在 MySQL 5.1 之后的版本,提供 UUID_SHORT() 函数,生成一个 64 位无符号整数,在java中可以用 Long 类型接受。另外,需要注意的是,server_id 的范围必须为 0-255 ,并且不支持 STATEMENT 模式复制,否则有可能会产生重复的ID
同时,需要注意的是, UUID_SHORT() 返回的是 unsigned long long 类型,在字段类型设置的时候,一定要勾选 无符号 类型,否则有可能生成的ID超过 Long 类型最大长度!
说明:
在给其他授权前,请先用管理员账户登录!
注意:用以上命令授权的用户不能给其它用户授权,如果想让该用户可以授权,用以下命令!
在结尾加上 WITH GRANT OPTION 就可以了!
可以使用如下命令,来一键设置 root 用户的密码,同时拥有所有的权限并设置为远程访问!
如果想关闭 root 用户远程访问权限,使用如下命令即可!
最后使用如下命令,使其生效!
创建用户并进行授权,也可以使用如下快捷命令!
最后需要注意的是:mysql8,使用强校验,所以,如果密码过于简单,会报错,密码尽量搞复杂些!
本文主要围绕 Mysql 中常用的语法进行一次梳理和介绍,这些语法大部分也同样适用于其他的数据库,例如 oracle、sqlserver、postgres 等等,在数据操作栏,除了分页函数以外,基本都是通用的!
请高手帮我解一下SQL语句呢?谢谢各位啦!
一(1):SQL>select * from 学生表;
or select 学号,姓名,专业 from 学生表;
(2)SQL>select 姓名 from 学生表 where 学号=’A050040012’;
(3)SELECT TOP 5 * FROM 成绩表
(4)select 学号,姓名,课程号,成绩 from 学生表,成绩表,课程表 where 学生表.学号=成绩表.学号and 课程表.课程号=成绩表.课程号;
(5)select 学号,成绩 from 学生表,成绩表
where 学生表.学号=成绩表.学好 and 课程号=’02’and 成绩>=80;
(6)select学号,成绩 from 成绩表 where 课程号=’03’and 成绩 between 75 and 85; 其他=下 太多了 一时做不来
二(1)INSERT INTO 成绩表 values('A050010012','02','','80');
(2)UPDATE 学生表 SET 班级=’0012’,专业=’计算机应用’
where 姓名 IN
(SELECT 姓名 FROM 学生表
WHERE 姓名=’王玮’);
(3)UPDATE 成绩表 SET 成绩=92
WHERE 姓名 IN
(SELECT 姓名=李丽);
(4)DELETE FROM 成绩表,学生表
WHERE 学号 IN
(SELECT 学号 FROM 学生表,成绩表
WHERE 学生表.学号=成绩表.学号AND 学号=’A050010025’);
(5)CREATE UNQUE INDEX INDEX-1
ON 成绩表(学生表,课程表);
请高手帮我解一下SQL语句呢?谢谢各位啦!
一(1):SQL>select * from 学生表;
or select 学号,姓名,专业 from 学生表;
(2)SQL>select 姓名 from 学生表 where 学号=’A050040012’;
(3)SELECT TOP 5 * FROM 成绩表
(4)select 学号,姓名,课程号,成绩 from 学生表,成绩表,课程表 where 学生表.学号=成绩表.学号and 课程表.课程号=成绩表.课程号;
(5)select 学号,成绩 from 学生表,成绩表
where 学生表.学号=成绩表.学好 and 课程号=’02’and 成绩>=80;
(6)select学号,成绩 from 成绩表 where 课程号=’03’and 成绩 between 75 and 85; 其他=下 太多了 一时做不来
二(1)INSERT INTO 成绩表 values('A050010012','02','','80');
(2)UPDATE 学生表 SET 班级=’0012’,专业=’计算机应用’
where 姓名 IN
(SELECT 姓名 FROM 学生表
WHERE 姓名=’王玮’);
(3)UPDATE 成绩表 SET 成绩=92
WHERE 姓名 IN
(SELECT 姓名=李丽);
(4)DELETE FROM 成绩表,学生表
WHERE 学号 IN
(SELECT 学号 FROM 学生表,成绩表
WHERE 学生表.学号=成绩表.学号AND 学号=’A050010025’);
(5)CREATE UNQUE INDEX INDEX-1
ON 成绩表(学生表,课程表);
SQL是通用的功能极强的关系数据库标准语言,其中什么语句最常用于实现数据查询功能的操作
SQL语言包含以下功能:
一:数据查询语言(DQL:Data Query Language):
其语句,也称为“数据检索语句”,用以从表中获得数据,确定数据怎样在应用程序给出。保留字SELECT是DQL(也是所有SQL)用得最多的动词,其他DQL常用的保留字有WHERE,ORDER BY,GROUP BY和HAVING。这些DQL保留字常与其他类型的SQL语句一起使用。
二:数据操作语言(DML:Data Manipulation Language):
其语句包括动词INSERT,UPDATE和DELETE。它们分别用于添加,修改和删除表中的行。也称为动作查询语言。
三:事务处理语言(TPL):
它的语句能确保被DML语句影响的表的所有行及时得以更新。TPL语句包括BEGIN TRANSACTION,COMMIT和ROLLBACK。
四:数据控制语言(DCL):
它的语句通过GRANT或REVOKE获得许可,确定单个用户和用户组对数据库对象的访问。某些RDBMS可用GRANT或REVOKE控制对表单个列的访问。
五:数据定义语言(DDL):
其语句包括动词CREATE和DROP。在数据库中创建新表或删除表(CREAT TABLE 或 DROP TABLE);为表加入索引等。DDL包括许多与人数据库目录中获得数据有关的保留字。它也是动作查询的一部分。
六:指针控制语言(CCL):
它的语句,像DECLARE CURSOR,FETCH INTO和UPDATE WHERE CURRENT用于对一个或多个表单独行的操作。
如下图所示,需要查询得到的数据就是标红色部分的 ,请问怎么写sql语句?
语句为:select a.uid,a.uname,a.upsw,a.urealname,a.utel,a.remark,if exists (select * from sysdatabases where name='databaseName',drop database databaseName go table
sql 语句简介:
结构化查询语言(Structured Query Language)简称SQL,结构化查询语言是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统;sql 语句就是对数据库进行操作的一种语言。
常用sql 语句:
数据库:CREATE DATABASE database-name
删除数据:drop database dbname
创建表:create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)
折叠删除新表
drop table tabname
增加:Alter table tabname add column col type
设主键:Alter table tabname add primary key(col)
删除主键:Alter table tabname drop primary key(col)
创建索引:create [unique] index idxname on tabname(col….)
删除索引:drop index idxname