当前位置:首页 » 编程语言 » sql语句难点
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

sql语句难点

发布时间: 2023-05-13 23:22:52

① 怎么学习sql语句

创建数据库
创建之前判断该数据库是否存在 if exists (select * from sysdatabases where name='databaseName') drop database 'databaseName' go Create DATABASE database-name
删除数据库
drop database dbname
备份sql server
--- 创建 备份数据的 device USE master EXEC sp_admpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat' --- 开始 备份 BACKUP DATABASE pubs TO testBack
创建新表
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
删除新表
drop table tabname
增加一个列
Alter table tabname add column col type 注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。
添加主键
Alter table tabname add primary key(col) 说明:删除主键: Alter table tabname drop primary key(col)
创建索引
create [unique] index idxname on tabname(col….) 删除索引:drop index idxname on tabname 注:索引是不可更改的,想更改必须删除重新建。
创建视图
create view viewname as select statement 删除视图:drop view viewname
几个简单的基本的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%’ (所有包含‘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[separator]
几个高级查询运算词
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),不消除重复行。 注:使用运算词的几个查询结果行必须是一致的。
使用外连接
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: 全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。

② 很有意思的SQL查询题目,看看大家如何解决

两个难点:
1、如何让Sql Server取到字符串中的数字,比如1、2、4和11、12、4虽然都是三位数字,但前者只有个位,后者含有十位和个位,用substring肯定是不行了。
2、如果取出了数字,还要依次遍历整张表,循环取ID,并去除重复ID

总得说来第一条智能取数比较折磨人。

标记一下,看有无高人进来
--------------------------------
仔细思考了下,还是做出来了,真的很折磨人。
下面的语句全部一下执行就可以看到结果了。
其中@strIn就是需要查找的字符串,如果要查看其他数据,修改这个值就可以了。
思路是把一个字段值变成多行数据,把','变为' union all'拼接语句实现。
--建立测试变量表@T,并赋值
declare @T table(id int,strnum varchar(50))
insert into @T
select 1,'1,2,4,5,8,9'
union all
select 2,'1,3,5,6,7,8,9,11'
union all
select 3,'3,4,5,6,7'
union all
select 4,'1,5,7,8,9'
union all
select 5,'3,5,6,9,11,12'
union all
select 6,'2,3,4,5,7'
union all
select 7,'3,4,5,6,7,8'
union all
select 8,'1,2,3,4,5,6,7,8,9,10'
union all
select 9,'1,7,8,9'
--@strIn查找的字符串
declare @strIn varchar(1000)
set @strIn = '1,11,12'

declare @strtable table(strSql varchar(4000))
insert into @strtable
Select 'select '''+cast(id as varchar(3))+''' as id,'''+replace(strnum,',',''' as num Union all Select ' + ''''+cast(id as varchar(3))+''' as id, ''') + ''' as num'
from @T

declare @comtable table(strSql varchar(4000))
insert into @comtable
select 'select '''+replace(@strIn,',',''' as num Union all Select ''' )+ ''' as num'

declare @textsql varchar(4000)
set @textsql = ''
Select @textsql=@textsql+strSql+' Union all ' from @strtable
set @textsql = substring(@textsql,1,len(@textsql)-10)

declare @comsql varchar(4000)
set @comsql = ''
Select @comsql=@comsql+strSql+' Union all ' from @comtable
set @comsql = substring(@comsql,1,len(@comsql)-10)

set @textsql = 'declare @Rtexttable table(id int,num varchar(3)) insert into @Rtexttable '+@textsql+
' declare @Rcomtable table(num varchar(3)) insert into @Rcomtable '+@comsql+' select distinct id from @Rtexttable a join @Rcomtable b on a.num = b.num'
exec (@textsql)

-------------------------
看了WHITE_WIN的,醍醐灌顶,豁然开朗。本人不喜欢用函数就改成存储过程了
declare @T table(id int,strnum varchar(50))
insert into @T
select 1,'1,2,4,5,8,9'
union all
select 2,'1,3,5,6,7,8,9,11'
union all
select 3,'3,4,5,6,7'
union all
select 4,'1,5,7,8,9'
union all
select 5,'3,5,6,9,11,12'
union all
select 6,'2,3,4,5,7'
union all
select 7,'3,4,5,6,7,8'
union all
select 8,'1,2,3,4,5,6,7,8,9,10'
union all
select 9,'1,7,8,9'

declare @strIn varchar(100)
set @strIn = '1,11,12'

declare @RT table (strnum varchar(30))

while charindex(',',@strIn)>0
begin
insert into @RT select left(@strIn,charindex(',',@strIn)-1)
set @strIn = substring(@strIn,charindex(',',@strIn)+1,len(@strIn))
end
If(len(@strIn)>0)
begin
insert into @RT select @strIn
end

select a.id from @T a, @RT b where ','+a.strnum+',' like '%,'+b.strnum+',%'
group by a.id
order by a.id

③ 使用SQL语句创建并测试数据库的难点和注意事项是什么

首先说说怎么用SQL语句创建数据库,创建数据库的语句有如下几种:
1. CREATE TABLE(创建新表)
2. CREATE INDEX(增加索引)
3. DROP INDEX(删除索引)
4. CONSTRAINT(约束语句)
5. ALTER TABLE(修改表)
6. DROP TABLE(删除表)

CREATE TABLE语句:
在数据库中生成新表,表中字段的类型能够为:INTEGER(整型)、LONG(长整型)、 SINGLE(单精度浮点数)、DOUBLE(双精度浮点数)、DATETIME(日期型,也能够写成DATE)、BIT(布尔型)、 TEXT(字符串型,最大255个字节)、MEMO(字符串型,最大可达1.2G字节)、 COUNTER(自动递增长整型,可确定记录的唯一性)、CURRENCY(货币型,精确到小数点左边15位,右边4位)、 BINARY(字节型,最大255个)、LONGBINARY(用于OLE对象)、GUID(全局唯一标识符)。
生成表NewTable,该表有文本字段Field1和整型字段Field2,表名和字段名能够随便您取,不区分大小写,但是,有些保留字不能用作表名字段名,比如Number
CREATE TABLE NewTable(Field1 TEXT(30), Field2 INTEGER);
CREATE INDEX语句:
INDEX是为了加快查找记录的速度,或是为了增加字段约束关系而配置的。
创建索引语句执行前表中能够有记录,但存在的记录必须满足该索引语句的约束关系,否则语句不能执行,另外要注意的是在同一个数据库中(而不但仅是在同一个表中),索引名不能相同,否则语句也会失败。
生成字段Field1的索引字段NewIndex,两条语句作用相同
生成后Field1字段能够有相同的值,能够有空值(NULL)
CREATE INDEX NewIndex ON NewTable (Field1);
CREATE INDEX NewIndex ON NewTable (Field1) WITH IGNORE NULL;

生成字段Field1的索引字段NewIndex,注意,每个表里只能有一个主索引(PRIMARY)。生成后Field1字段不能有相同的值,不能有空值(当然,假如是TEXT类型,能够有一个空串,但是空串不是空值)
CREATE INDEX NewIndex ON NewTable(Field1) WITH PRIMARY;

字段Field1不能有相同的值,但能够有空值(两个空值不算相同的值)
CREATE UNIQUE INDEX NewIndex ON NewTable(Field1);

字段Field1能够有相同的值,但不能有空值
CREATE INDEX NewIndex ON NewTable(Field2) WITH DISALLOW NULL

能够在索引语句中加入ASC(升序)或DESC(降序)来控制记录排列顺序假如不使用顺序字,SQL则默认使用ASC顺序
CREATE INDEX NewIndex ON NewTable(Field1 ASC, Field2 DESC);
DROP INDEX语句:
删除表NewTable中的索引NewIndex,语句执行前索引NewIndex必须存在
DROP INDEX NewIndex ON NewTable;

CONSTRAINT语句:
CONSTRAINT子句用于创建数据库完整性的索引,他和INDEX语句作用相同,有些地方能够互相替代,他能够使用PRIMARY KEY(主关键字),UNIQUE(唯一)和FOREIGN KEY(外部关键字),和INDEX相比不能使用IGNOR NULL和DISALLOW NULL,但多了FOREIGN KEY(这也是他最强大的地方)。另外, CONSTRAINT语句必须和CREATE TABLE或ALTER TABLE语句一起使用。
生成表NewTable,主关键字段是Field1,主索引是NewPK
CREATE TABLE NewTable(Field1 LONG CONSTRAINT NewPK PRIMARY KEY, Field2 MEMO, Field3 DATETIME);

生成索引为NewUK的表NewTable,Field1不能有相同值,能够有空值
CREATE TABLE NewTable(Field1 INTEGER CONSTRAINT NewUK UNIQUE);

生成多列的主索引,两条记录的Field1和Field2不能全部相同,也不能为空值
CREATE TABLE NewTable(Field1 INTEGER, Field2 CURRENCY, CONSTRAINT NewPK PRIMARY KEY(Field1, Field2));

生成多列的UNIQUE索引,两条记录的Field1和Field2不能全部相同注意,假如两条记录其中一个字段相同而另一个字段都是空值,那也算两个字段不同
CREATE TABLE NewTable(Field1 INTEGER, Field2 CURRENCY, CONSTRAINT NewUK UNIQUE(Field1, Field2));
要在几个不同的表之间建立联系,就要使用FOREIGN KEY REFERENCES子句,他能够限定某个表的字段内容必须存在于另外一个表中。
第一个例子:
首先,生成主关键字段为Field1的表NewTable1
CREATE TABLE NewTable1(Field1 INTEGER CONSTRAINT NewPK PRIMARY KEY);

然后,再生成外部索引,两个表的Field1必须类型相同,并且第一个表的Field1是主关键字段或UNIQUE字段。生成外部索引后,表NewTable2要增加记录,他的Field1字段值必须已存在于表NewTable1的Field1字段中。
下面两条语句作用相同,因为Field1是NewTable1的主关键字段,能够省略不写
CREATE TABLE NewTable2(Field1 INTEGER CONSTRAINT NewFK REFERENCES NewTable1);
CREATE TABLE NewTable2(Field1 INTEGER CONSTRAINT NewFK REFERENCES NewTable1(Field1));

第二个例子:
首先,生成主关键字段为Field1和Field2的表NewTable1
CREATE TABLE NewTable1(Field1 INTEGER, Field2 TEXT(20), CONSTRAINT NewPK PRIMARY KEY(Field1, Field2));

然后,生成多列外部索引
CREATE TABLE NewTable2(Field1 INTEGER, Field2 TEXT(20), CONSTRAINT NewFK FOREIGN KEY(Field1, Field2) REFERENCES NewTable1(Field1, Field2));
ALTER TABLE语句:
在表生成之后,假如想修改表的结构,就使用这条语句,他能增加或删除字段连同约束关系。
给表NewTable增加日期型字段Field3,语句执行前表NewTalbe必须没有字段Field3
ALTER TABLE NewTable ADD COLUMN Field3 DATE;

删除表NewTable中的字段Field3,语句执行前字段Field3必须存在表NewTable中
ALTER TABLE NewTable DROP COLUMN Field3;

给表NewTable增加NewUK约束关系
ALTER TABLE NewTable ADD CONSTRAINT NewUK UNIQUE(Field1,Field2);

删除表NewTable的NewUK约束关系
ALTER TABLE NewTable DROP CONSTRAINT NewUK;
DROP TABLE语句:
删除表NewTable,语句执行前表NewTable必须存在
DROP TABLE NewTable;

④ 学数据库的难点在那里呢

数据库有很多种,如ACCESS、SQL等,首先先弄清楚你要达到什么要求,然后开始学习,简单的先学习ACCESS,弄清,数据库里包含的表,弄清楚每个表的字段,还要弄清楚SQL语言,学会用数据库进行查询、统计等功能。总而言之,先易后难,相信你很快能掌握一些常用数据库的。

⑤ 学sql server是不是要先学sql语言难不难学有啥要求吗

不算难,主要是弄清楚存储过程,权限,索引,这些稍微难点,其他就相对比较简单,T-SQL语句之类的都比较简单