group by用于对查询结果分组统计
having子句用于限制分组显示结果
自增长:identity(1,1)
创建聚集索引:
create clustered index xxx(索引名称) on xxx表名(xxx列名)
创建非聚集索引:
create nonclustered index xxx(索引名称)on xxx表名(xxx列名)
删除索引
drop index 表名.索引名
Update text1(表名) set sal=sal*1.1 (后面可以加where)
外部候选人jane schaffer 的测试成绩将加2分
update xxx(表名)set sitestscore=sitestscort +2 where ccandidatecode=’jane schaffer’
Age float(2)将显示8位数,包括小数(不够8位全显示,超过8位只显示前8位)。
定义2位小数的numeric(10,2)
删除语句
主键可以更改
`子查询多表查询分页查询等等。。
insert into 表名 字段列表
外键:
customerId nvarchar(50) foreign key references customer(customerId)
修改表中列的属性:
alter table xxx(表名)
add constranint xxx (列名) +条件
create table dept(
deptno int primary key,
dname nvarchar(30),
loc nvarchar(30)
)
select * from emp
select * from dept
create table emp2(
empno int primary key,
ename nvarchar(30),
job nvarchar(30),
mgr int,
hiredate datetime,
sal numeric(10,2),
comm numeric (10,2),
deptno int foreign key references dept(deptno)
)
insert into emp(empno,ename,job,mgr,hiredate,sal,deptno) values(,'','',,'',,)
insert into emp values(,'','',,'',,,)
insert into emp(empno,ename,job,mgr,hiredate,sal,deptno) values(7369,'smith','clerk',7902,'1980-12-17',1600.00,20)
insert into emp values(7499,'allen','salesman',7698,'1981-2-20',1600.00,300,30)
insert into emp values(7521,'ward','salesman',7698,'1981-2-22',1250.00,500,30)
insert into emp(empno,ename,job,mgr,hiredate,sal,deptno) values(7566,'jones','manager',7839,'1981-5-1',2975.00,20)
insert into emp values(7654,'martin','salesman',7698,'1981-9-28',1250.00,1400.00,30)
insert into emp(empno,ename,job,mgr,hiredate,sal,deptno) values(7698,'blake','manager',7839,'1981-5-1',2850.00,30)
insert into emp(empno,ename,job,mgr,hiredate,sal,deptno) values(7782,'clark','manager',7839,'1981-6-9',2450.00,10)
insert into emp(empno,ename,job,mgr,hiredate,sal,deptno) values(7788,'scott','analyst',7566,'1987-4-19',3000.00,20)
insert into emp(empno,ename,job,hiredate,sal,deptno) values(7839,'king','president','1981-11-17',5000.00,10)
insert into emp values(7844,'turner','salesman',7698,'1981-9-8',1500.00,0,30)
insert into emp(empno,ename,job,mgr,hiredate,sal,deptno) values(7876,'adams','clerk',7788,'1987-5-23',1100.00,20)
insert into emp(empno,ename,job,mgr,hiredate,sal,deptno) values(7900,'james','clerk',7698,'1981-12-3',930.00,30)
insert into emp(empno,ename,job,mgr,hiredate,sal,deptno) values(7902,'ford','analyst',7566,'1981-12-3',3000.00,20)
insert into emp(empno,ename,job,mgr,hiredate,sal,deptno) values(7934,'miller','clerk',7782,'1982-1-23',1300.00,10)
insert into emp values(9999,'shunping','clerk',7782,'1988-5-5',2456.34,55.66,10)
insert into dept values(10,'accounting','new york')
insert into dept values(20,'resercher','dallas')
insert into dept values(30,'sales','chicago')
insert into dept values(40,'operations','boston')
查询 smith的薪水工作和部门
select sal,job,deptno from emp where ename=’xx’
取消重复行的显示:
select distinct ename,xx,xx from emp where XXXX
显示人名和年工资
select ename,sal*13 '年工资' from emp order by sal
select ename '钱',(sal+comm)*13 '年工资' from emp order by sal
把null换成0
select ename '钱',(sal+isnull(comm,0))*13 '年工资' from emp order by sal
入职时间在xxx以后的
select * from emp where hiredate>'1982-1-1'
工资在2000和2500之间的人
select * from emp where sal between 2000 and 2500
首字母是s的人
select ename from emp where ename like 's%'
第三个字母是m的人
select ename from emp where ename like '__m%'
显示empno为123,453,11、、、的雇员的情况
select * from emp where empno in(10,20)
工资大于500或工作是manager,同时他们的姓名首字母必须是j的员工信息
select * from emp where (sal>500 or job='manager') and ename like 'j%'
升序,降序:
select * from emp order by hiredate desc, ename desc
显示薪水最低员工的姓名和薪水
select ename,sal from emp where sal=(select min(sal) from emp)
显示平均工资和总工资
select avg(sal)平均工资,sum(sal)总工资 from emp
把高于平均工资的员工的名字和他的工资显示出来
select ename,sal from emp where sal>(select avg(sal)from emp)
统计共有多少员工
select count (*) from emp
select count(xxx)from emp
把高于平均工资的员工的名字和他的工资显示出来并显示平均工资
select ename,sal,(select avg(sal)from emp)平均工资 from emp where sal>(select avg(sal) from emp)
显示每个部门的平均工资
select avg(sal),deptno from emp group by deptno
如何显示每个部门的平均工资和最高工资
select max(sal),avg(sal),deptno from emp group by deptno
显示每个部门每种岗位的平均工资和最高工资
select max(sal),avg(sal),deptno from emp group by deptno,job
显示平均工资低于2000的部门号和他的平均工资
select avg(sal),deptno from emp group by deptno having avg(sal)<2000
复制信息:
create table test(
testId int primary key identity(1,1),
testName varchar(30),
testPass varchar(30),
)
insert into test(testName,testPass) values ('shunping','123321')
insert into test(testName,testPass) select testName,testPass from test
找出即买了a产品,又买了b产品,还买了c产品的客户
select custom where
多表查询高于部门平均工资的员工的信息
select emp.ename,emp.sal,tem.myavg,emp.deptno from emp,(不能用and)
(select avg(sal) myavg,deptno from emp group by deptno)tem
where emp.sal>tem.myavg and emp.deptno=tem.deptno
分页查询
显示第5到第10个入职的雇员:先显示前4个入职的
select top 4 * from emp order by hiredate
然后显示不在这4个里的前6个
select top 6 * from emp where empno not in
(select top 4 empno from emp order by hiredate ) order by hiredate
注意:::括号里 必须是empno 而不能是*
显示第五到第九人的信息(薪水高低 )
select top 5* from emp where empno not in (
select top 4 empno from emp order by sal desc
) order by sal desc
删除一张表中的重复记录
select distinct * into #emp from emp
delete from emp
insert into emp select * from # emo
drop table #emp
把第一张表非重复记录和第二张表的非重复记录显示出来
select distinct * from emp union all select*from #emp order by empno
把两张表的非重复记录显示出来:
select distinct * from emp union select*from #emp order by empno
左外连接右外连接
select w.ename,b.ename from emp w,emp b where w.mgr=b.empno(内连接)
左外连:显示没有上级的人,和有上级的人的名字和上级的名字(左边表的记录全部显示,如果没有匹配用null)
select w.ename,b.ename from emp w left join emp b on w.mgr=b.empno
右外连:
select w.ename,b.ename from emp w left join emp b on w.mgr=b.empno
列出title表中标题id和标题名,条件是价格大于出版商id为0736所出版的所有书的价格
select id,tltle from title where price >all(select price from title where id=0736)
列出titiles表中标题id和标题名,条件是大于出版商id为0736所出版书的最低价格
select id,title from title where price>any(select price from tltle where id=0736)
列出title表中标题id和标题名,该出版商所在城市包含在作者表中的城市
select id,title form title where city=any(select city from authors)
存入新表
select * into b from a where id=xxx
唯一的:
testname varchar(30) unique 可以不给值,空也算unique
复合主键:
由多个列共同构成一个主键,不能为空
都写完后 primary key(testId,testname)
check
规范输入值:
sal int check(sal>1000 and sal<2000)
定义时间:
mesDate datetime default getdate()不给时间则按默认时间
商品表:
create table goods(
goodsId nvarchar(50) primary key,
goodsName nvarchar(80) not null,
unitprice numeric(10,2) check (unitprice>0),
category nvarchar(3)check(category in('食物','日用品')),
provider nvarchar(50)
)
select *from goods
客户表
create table customer(
customerId nvarchar(50) primary key,
customerName nvarchar(30) not null,
address nvarchar(100),
email nvarchar(100) unique,
sex nchar(1) check(sex in('男','女'))default '男',
cardId nvarchar(18) not null
)
服务表:
create table purchase(
customerId nvarchar(50) foreign key references customer(customerId),
goodsId nvarchar(50) foreign key references goods(goodsId),
nums int check(nums>0 and nums<30)
)
修改表:
Sql语言包含4个部分:数据定义语言:CREATE、DROP、ALTER等
数据操作语言:INSERT、UPDATE、DELETE
数据查询语言:SELECT
数据控制语言:GRANT、REVOKE、COMMIT、ROLLBACK等
表名能以
字母,_开头,不能以数字开头
长度不能超过128字符
不能使用aql server的保留字 (除非用[]包起来)
不能用以下字符 A-Z,a-z,0-9,$,#,-等
字符类型:
Big5编码:支持繁体
Iso-8859-1编码:支持欧文字母
国标码(gb2312):针对中国汉字
Gbk码:支持更多的汉字
Unicode 编码:用两个字节表示一个字符(可为英文可为汉字)(适合汉字)
非unicode编码:一个字节表示一个字母,两个字节表示一个汉字
Char 定长 最大8000字符(非unicode编码)(查询时速度快)
Char(10)’小a’,前3个字符放“小a”,后6个空格补全(非unicode编码)
Varchar(10)变长 ’小韩’,前4个字符放小韩,后面回收
Nchar 定长 最大4000字符(unicode编码)
Nvarchar 变长(unicode编码)
Ntext 可变长度unicode数据编码最大长度为2的30次方-1个字符
Text 可变长度非unicode数据编码最大长度为2的31次方-1个字符
Bit 范围 0到1
Int 范围-2的31次方到2的31次方-1
Bigint 范围-2的63次方到2的63次方-1
Float 存放小数,不推荐使用
Numeric 小数(如果存放小数最好用numeric)
Unicode编码:用两个字节表示一个字符(可以是英文字母可以是汉字)
非unicode 编码:用一个字节表示一个字母,两个字节表示汉字
Datetime 表示日期(用函数getdate()读取)
insert into stu values(getdate())
Timestamp 时间戳
Decimal(3,1)float型,3位有效,1位小数
Image 保存图像(很少用)一般保存图片在图片服务器(要求:带宽足够大)
Binary 可以存放视频,但往往将视频文件保存在文件服务器上,sql server中只保留文件路径,存取效率高。
Primary key 主键,用于表示唯一的记录(不能重复出现且不能为空)(主键也可以修改但不能改成已存在的主键)
外键:名字 类型 foreign key references 表单名(主键)
Batch 批量查询/批量增删改查。
插入部分字段 insert into (表单名)(字段名) values ()(外键只能指向主键,数据类型要一致)
Order by(按顺序排列)(默认升序排列)(一般放在最后)
Order by desc(按顺序排列)(降序排列)
分页查询:用到子查询(后面讲)
Select语句优化的原则
尽可能让能减少结构集的条件写在右面
Group by(用于对查询的结果分组统计)
Having(限制分组显示结果)(往往和group by 结合使用,可以对分组查询到的结果进行筛选)
多表查询是指基于两个和两个以上的表或是视图的查询,在实际应用中,查询单个表可能不能满足你的需求
自连接:把一个表看做两个表
外连接:(左外链接,右外连接)
子查询:单行子查询:右面的select语句返回单行
多行子查询
分页查询 :
请显示第五个到第10个入职的雇员(按照时间的先后顺序)
左外链接:
左边的表的记录全部都要显示,如果没有匹配的记录,就用空来填写
Select w.ename,b.ename from emp w left join emp b on w.mgr=b.empno
约束:
用于确保数据库数据满足特定的商业规则,在oracle中,约束包括:not null
,unique(与主键一样不能为空,但unique能放null),primary key(外键数据必须在主表中存在或者为null),foreign key和check 5种
行级定义和表级定义:
Default:
Preparedstatement 可以提高执行效率(预编译)
可以防止注入漏洞,但是要求用问号赋值的方法才可以
Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”);
Connection ct=DriverManager.getConnection(“jdbc:odbc:mytest”,”sa”,”123321”);
Statement sm=ct.creatStatement();
sm.excuteUpdate(“insert into article values(‘’,’’,’’)”);//添加删除修改
ResultSet rs=sm.excuteQuery(“select *from dept”)//结果集,resultset可以理解为表行的结果集
Rs指向结果集的第一行的上一行,可以循环取出
条件赋值语句
ps=ct.prepareStatement("select * from users0 where username=? and passwd=? " );
ps.setObject(1, username);
ps.setObject(2, password)
SQL Server编程
常用以下术语:
批量,变量,打印消息,注解,控制流语句
使用变量存储一些值:declare @定义名 属性
declare @cahrge int select @charge=max(列名)from 表名