SQL语句1
要求:将本机数据库2中表的数据导入到本机数据库1的表中。
方法:使用sqlserver编写如下代码即可:
insert intoSB(SB_ID,YSXZ_ID,XQ_ID,SB_KHH,SB_KHXM,SB_BH,SB_YSRS,SB_DH,SB_DZ,SB_WZ,SB_XH,SB_YE,SB_CJ,SB_DQBDS,SB_ZJCBRQ,SB_BZ,SB_SFYX)
selectSB_ID,YSXZ_ID,XQ_ID,SB_KHH,SB_KHXM,SB_BH,SB_YSRS,SB_DH,SB_DZ,SB_WZ,SB_XH,SB_YE,SB_CJ,SB_DQBDS,SB_ZJCBRQ,SB_BZ,SB_SFYX
from HelperLY.dbo.SB b
注意:数据库1中的表字段与数据库2中的表字段要一一对应。
要求:使用select语句完成功能:利用表达式查询水表中的用水人数和水表位置。
方法:如果直接按照如下写法:
select SB_YSRS +SB_WZ
from SB
会出现错误:在将varchar 值'2#东北' 转换成数据类型int 时失败。
在C#中如果一个int类型的数据和一个string类型的数据进行+运算,则结果返回string类型;但是在SqlServer中,一个int类型的数据和一个char(数据库中没有string类型)类型的数据进行+操作,而不做任何类型转变的话,就会出现错误。
正确的写法应该是:
select convert(varchar(100),SB_YSRS) +SB_WZ
from SB
注意:在数据库中int类型和char类型进行+运算,要进行强制类型转换。
如果两个类型的值进行+运算,且其中有一个值是null类型,则返回结果是null类型。
要求:从SB中查出小区名称中包含“物资”两个字的信息列表。
方法:使用带有in的sql语句如下所示:
select *
from SB
where XQ_ID in
(select XQ_ID from XQ where XQ_MC like '%物资%')
注意:in后面不仅仅可以跟一个条件列表,还可以跟一个sql语句。
要求:区分简单case和布尔case的区别,及其应注意的事项。
方法:如下sql语句是简单case:
select *,
case substring(SB_DH,1,3)
when '151' then '移动'
when '130' then '联通'
else '未知'
end as 电话服务商
from SB
如下sql语句是布尔case:
select *,
case
when substring(SB_DH,1,3) in ('151') then '移动'
when substring(SB_DH,1,3) in ('130') then '联通'
else '未知'
end as 电话服务商
from SB
注意:简单case和布尔case的select语句后面都有逗号,;简单case后面会有一个表达式,但是布尔case后面是空的;简单case只能进行相等比较,布尔case在when后面会有一些简单的判断。
要求:在录入表底数模块中,按照时间选择抄表项的时候,应该选择离目前时间最近的时间,这里会用到sql语句。
方法:sql语句如下所示:
select MAX(CB_ID) from CB WHERE CB_YF=(select MAX(CB_YF) from CB)
注意:要注意本sql语句中where子句的条件:
WHERE CB_YF=(select MAX(CB_YF) from CB)
要求:将水表表和抄表明细表进行关联。
方法:sql语句如下所示:
select a.SB_KHH,a.SB_KHXM,a.SB_YSRS,b.*
from SB a,CBMX b
where a.XQ_ID =34 and b.CB_ID =8 and b.CBMX_BCBDS is not null
and a.SB_ID=b.SB_ID
注意:将两个表的关联放在后面的原因是:两个表的关联比较耗时。某些时候where条件的顺序不同可能会导致查询结果所需时间可以相差十几倍。
SQL语句2
要求:统计每个小区的水量、水费
方法: sql语句如下所示:
select b.XQ_ID,SUM(a.CBMX_BCBDS -a.CBMX_SCBDS) as SL,SUM(a.CBMX_YJSF) as YJSF,
SUM (a.CBMX_SJSF) as SJSF
from CBMX a,SB b
where a.SB_ID =b.SB_ID
group by b.XQ_ID
或者使用下面的sql语句:
select x.*,y.XQ_MC
from
(
select b.XQ_ID,sum(a.CBMX_BCBDS -a.CBMX_SCBDS) as SL, SUM(a.CBMX_YJSF) as YJSF,
SUM (a.CBMX_SJSF) as SJSF
from CBMX a,SB b
where a.SB_ID =b.SB_ID
group by b.XQ_ID
)x,XQ y
where x.XQ_ID=y.XQ_ID
注意:如果使用了group by,那么色了传统中的字符按,要么在group by中出现,要么使用了聚合函数。
要求:显示小区名称、用水人数和水表数量
方法:sql语句如下所示:
select a.XQ_ID,b.XQ_MC, COUNT(a.SB_ID) as SBSL,SUM(a.SB_YSRS) as YSRS
from SB a,XQ b
where a.XQ_ID =b.XQ_ID
group by a.XQ_ID ,b.XQ_MC
注意:count的使用和sum的使用
①如果要求显示水表数量大于100的小区名称和用水人数,则sql语句如下所示:
select a.XQ_ID,b.XQ_MC, COUNT(a.SB_ID) as SBSL,SUM(a.SB_YSRS) as YSRS
from SB a,XQ b
where a.XQ_ID =b.XQ_ID
group by a.XQ_ID ,b.XQ_MC
having COUNT(a.SB_ID)>100
注意:having的使用(在分组的基础之上进一步过滤,过滤的条件是某个聚合的结果)。having之和group by一起使用
②如果要显示用水性质是居民用水的小区名称和用水人数,则sql语句如下所示:
select a.XQ_ID,b.XQ_MC, COUNT(a.SB_ID) as SBSL,SUM(a.SB_YSRS) as YSRS
from SB a,XQ b
where a.XQ_ID =b.XQ_ID and a.YSXZ_ID =1
group by a.XQ_ID ,b.XQ_MC
注意:在条件的过滤之下进行分组
要求:根据SB表中的用水人数分析用水家庭的情况
方法:sql语句如下所示:
select a.SB_KHXM,
case SB_YSRS
when 1 then '可能是一个光棍'
when 2 then '可能是一对夫妻'
when 3 then '可能是一家三口'
when 5 then '可能是两代人住在一起'
else '不能预测'
end 分析结果
from SB a
注意:简单case是相等比较
要求:根据SB表中的用水人数分析用水人数的多或少
方法:sql语句如下所示:
select SB_KHXM,
case
when SB_YSRS<2 then '用水人数比较少'
when SB_YSRS <4 then '用水人数一般'
else '人数比较多'
end 分析结果
from SB
注意:复杂case后面没有表达式
行变列问题
①方法:sql语句如下所示:
select
SUM(case when SB_DH like '131%' then 1 else 0 end) as 联通131,
SUM(case when SB_DH like '134%' then 1 else 0 end) as 联通134,
SUM(case when SB_DH like '138%' then 1 else 0 end) as 移动138,
SUM(case when SB_DH like '151%' then 1 else 0 end) as 移动151
from SB
注意:在本例中给列起别名时,不能使用数字。
②要求:计算平均成绩
方法:sql语句如下所示:
select
AVG
(
case
when Score_Subject ='数学' then Score_FS
else 0
end
) 数学,
AVG
(
case
when Score_Subject='语文' then Score_FS
else 0
end
) 语文
from Score
注意:两个AVG之间使用 , 相隔
SQL语句3
要求:判断两个字符串是否相等。
方法:sql语句如下所示:
if('abc'='Abc')
print '二者相等'
else
print '二者不相等'
返回结果是:二者相等
if('abc'='Abec')
print '二者相等'
else
print '二者不相等'
返回结果是:二者不相等
注意:在sql中判断两个字符串是否相等时,不区分大小写。
要求:判断某个字符串中是否存在空格。
方法:sql语句如下所示:
if (CHARINDEX(' ','ac dc',1)>0)
print '字符串中包含空格'
else
print '字符串中不包含空格'
返回结果是:字符串中包含空格
if (CHARINDEX(' ','acdc',1)>0)
print '字符串中包含空格'
else
print '字符串中不包含空格'
返回结果是:字符串中不包含空格
要求:计算SB表中sb_dh字段中的数据中3的个数
方法:sql语句如下所示:
select sb_dh,LEN(SB_DH)-LEN(REPLACE(sb_dh,3,'')) from SB
注意:在计算某个字段中包含什么值时,可以使用如下方式:总长度-将目标字符替换成空后的长度。
要求:将SB进行分页时,如果每页放10行,计算可以放多少页
方法:sql语句如下所示:
select CEILING(COUNT(*)/10.0) from SB
注意:在这里使用的是10.0,而不是整数10
要求:保留两位小数位数
方法:sql语句如下所示:
select CONVERT(decimal(18,2),ROUND(18.12345,2))
要求:如果某小区拥有的水表数量是,则显示为0;并显示相应的小区名称。
方法:sql语句如下所示:
select x.XQ_MC,ISNULL(y.水表数量,0)
from XQ x
left join
(
select xq_id,COUNT(SB_ID) as 水表数量
from SB
group by XQ_ID
) y
on x.XQ_ID=y.XQ_ID
要求:找到工资最高的员工
方法:sql语句如下所示:
select * from Employee where Salary =
(select MAX(Salary)
from Employee)
要求:找到每个部门的最低工资的职工
方法:sql语句如下所示:
select * from Employee where Salary in
(select MIN(Salary)
from Employee
group by DepID)
也可以使用如下sql语句:
select x.*,y.*
from Employee x,
(select DepID,MIN(Salary) as minsalary
from Employee
group by DepID) y
where x.DepID=y.DepID and x.Salary=y.minsalary
在上面的基础上显示职工所隶属的部门:
with temp as
(select x.*,y.minsalary
from Employee x,
(select DepID,MIN(Salary) as minsalary
from Employee
group by DepID) y
where x.DepID=y.DepID and x.Salary=y.minsalary
)
select a.*,b.Name
from temp a,Department b
where a.depid=b.depid
要求:查找水表个数低于100的小区
方法:sql语句如下所示:
with temp as
(
select XQ_ID,COUNT(SB_ID) as sbsl
from SB
GROUP by XQ_ID
having COUNT(SB_ID)<100
)
select a.*,b.*
from temp a,XQ b
where a.XQ_ID=b.XQ_ID
SQL 语句4
要求:更新Employee表中的Salary项(条件是:Salary=a.Salary *(1+b.RaiseFactor))
方法:sql语句如下所示:
update Employee
set Salary=a.Salary *(1+b.RaiseFactor)
from Employee a,Department b
where a.DepID=b.DepID
要求:将名字用,隔开
方法:sql语句如下所示:
declare @name varchar(20)
set @name=''
select @name =@name+','+name from Employee
print @name
要求:找到工资大于小叶子工资的员工
方法:sql语句如下所示:
declare @salary money
select @salary=salary from Employee
where Name='小叶子'
select * from Employee
where Salary>@salary
也可以使用如下sql语句完成上述功能:
select *
from Employee
where Salary>
(select Salary from Employee where Name='小叶子')
要求:@@ERROR示例
方法:sql语句如下所示:
insert into Employee(DepID,Name,Salary,DateHire,Address)
values(10,'江户川柯南',1000,' 2010-10-10','河北理工大学')
print '错误号:'+convert(varchar(100),@@error)
insert into Employee(DepID,Name,Salary,DateHire,Address)
values(100,'毛利兰',2000,'2011-11-11','河北理工大学')
print '错误号:'+convert(varchar(100),@@error)
运行结果是:消息547,级别16,状态0,第1 行
INSERT 语句与FOREIGN KEY 约束"FK_Employee_Department"冲突。该冲突发生于数据库"dbXDL",表"dbo.Department", column 'DepID'。
语句已终止。
错误号:
消息547,级别16,状态0,第4 行
INSERT 语句与FOREIGN KEY 约束"FK_Employee_Department"冲突。该冲突发生于数据库"dbXDL",表"dbo.Department", column 'DepID'。
语句已终止。
错误号:
要求:@@identity示例
方法:sql语句如下所示:
insert into Employee(DepID,Name,Salary,DateHire,Address)
values(1,'江户川柯南',1000,'2010-10-10','河北理工大学')
print @@identity
insert Card(UserName,Balance)
values('新一',1000)
print @@identity
运行结果是:(1 行受影响)
21
(1 行受影响)
3
要求:计算员工的平均工资,如果高于2000,显示“高工资”,如果低于2000,则显示“低工资”
方法:sql语句如下所式:
declare @avgSalary money;
select @avgSalary=AVG(salary) from Employee
if(@avgSalary>2000)
begin
print '高工资'
end
else
begin
print '低工资'
end
要求:给员工提高工资,要求都在2000元以上,加工资的规则是:全部加100,看是否满足要求;如果不满足,再加,直到满足要求。
方法:sql语句如下所示:
declare @minSalary money;
select @minSalary=MIN(salary) from Employee
while(@minSalary<2000)
begin
update Employee set Salary=Salary+100;
select @minSalary=MIN(salary) from Employee;
end
也可以使用如下sql语句完成上述功能:
declare @minSalary money;
select @minSalary=MIN(salary) from Employee
while(@minSalary<2000)
begin
update Employee set Salary=Salary+100;
set @minSalary=@minSalary+100;
end
要求:临时表示例
方法:sql语句如下所示:
select * into #EmployeeTemp
from Employee where Salary>2000
select * from #EmployeeTemp
注意:临时表创建完后,当确定不在使用后,应该将其删除,sql语句如下所示:
drop table #EmployeeTemp
作为一个刚入门Silverlight的人来说,学习新知识就要做好笔记。我是刚入门。在不断在摸索。写这篇文章是让打算入门和刚入门的人有所了解Silverlight。这篇文章主要是讲的Silverlight 2种查询的方法。步入正题
第一步:引入命名空间 System.Windows.Controls.Data(后面会讲有什么用)
第二步:创建文件夹和相应的类。下面是我写的对应的文件夹和类

第三步 编写内容。
首先是 model文件夹下的类
public class Student
{
public string Name { get; set; }
public int Age { get; set; }
}
其次是viewmodel下的类
public class StudentViewModel:INotifyPropertyChanged
{
public StudentViewModel() {
Getstu();
}
public ObservableCollection<Student> Students { get; set; }
public ObservableCollection<Student> Getstu()
{
Students = new ObservableCollection<Student>()
{
new Student{ Name = "张三", Age = 21 },
new Student{Name = "李四", Age = 22 },
new Student{Name = "王五", Age = 23 },
};
return Students;
}
#region INotifyPropertyChanged 成员
public event PropertyChangedEventHandler PropertyChanged;
#endregion
第四步:编写前台内容
第一种方法:
<UserControl x:Class="ceshi.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
//第一步 引入System.Windows.Controls.Data 对应的是前面引入的命名空间
xmlns:data="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data"
第二步//这个是绑定的viewmodel
xmlns:model="clr-namespace:ceshi.ViewModel"
d:DesignHeight="300" d:DesignWidth="400" xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk">
<UserControl.Resources>
第三步 //使用viewmodel 设置别名 StudentViewModel就是viewmodel下的类名
<model:StudentViewModel x:Key="page" />
</UserControl.Resources>
第四步 //看到DataContext 了吗?意思是整个Grid 都用哪个viewmodel 绑定数据
<Grid x:Name="LayoutRoot" Background="White" Height="280" Width="372" DataContext="{StaticResource page}">
//ItemsSource 绑定的是viewmodel的集合
<data:DataGrid AutoGenerateColumns="False" Height="190" HorizontalAlignment="Left" Margin="36,48,0,0" Name="dataGrid1" VerticalAlignment="Top" Width="275" ItemsSource="{Binding Students}">
<data:DataGrid.Columns>
<data:DataGridTextColumn Header="姓名" Width="145" Binding="{Binding Name}" d:IsLocked="True"/>
<data:DataGridTextColumn Header="年龄" Width="130" Binding="{Binding Age}" d:IsLocked="True"/>
</data:DataGrid.Columns>
</data:DataGrid>
</Grid>
</UserControl>
第二种方法是:删除二,三,四步骤,在后台代码加入2句话。替代二三四三步
public partial class MainPage : UserControl
{
public MainPage()
{
InitializeComponent();
StudentViewModel model = new StudentViewModel();
this.DataContext = model;
}
}
写先到这里,有不懂的可以交流。我也是新手,有问题多多提出来!
最近忙了一段时间,总算闲下来2天。看着7月7日发售的仙剑,我虽然如约拿到了游戏,但是真是没时间玩。最为一个仙剑迷,拿到游戏却不能玩,这是痛苦呀!前2天试玩了一下,感觉还可以。总体来说比仙四有进步。
据说仙剑4和仙剑5的开发引擎是同一个,虽然我不懂,但是我相信技术应该也都差不多。为什么仙五比仙四好呢,只是画面做工比较上进。
如果没记错仙四是07年的产品,仙五是11年的产品,这四年间,游戏一直停留在07年的水平,有点说不过去了。这四年发展多快。为什么中国游戏总用旧的引擎呢?我认为好游戏和好电影一样,十年磨一剑。为什么暗黑这么火呢。应为这几年这个团队一直在创新。研究新引擎。没有创新就没有发展,以后就会没人买。
最近打的火热的战地3和现在战争3 就是一个例子,现在战争3用的和使命召唤7 同一个引擎。战地3就抓住了这一个特点,进行抨击。确实在国外竞争很激烈。国内竞争不那么激烈,但是我们也要创新呀!为了游戏而去做游戏,肯定做不好。
其实我也不喜欢新技术,觉得老技术有把握。但是总停留在老技术上,就没有创新。我也在试着学习一些新的技术。虽然接触有些难度,但是我能坚持。不求多,一二样足以!
我希望国产游戏不只是模仿,突破下自己,才能赢得未来。
最后我要说一句,国产游戏我支持正版,毕竟是国人自己做的。做软件的,都不容易!
1.针对数组元素的查询和转换操作
加入有个int类型的数组,要转换成double,那该怎么做呢?
数组类型基类有一个Array的ConvertAll方法实现。
实现代码如下:
1 static Converter<int, double> intdouble = delegate(int ele) { return (double)ele; };
2 public static void Main()
3 {
4 int[] intarr = new int[] { 1, 5, 6, 7, 8, 9, 10 };
5 double[] arrdouble = Array.ConvertAll<int, double>(intarr, intdouble);
6 Array.ForEach<double>(arrdouble, ele => { Console.WriteLine("{0:N}\n", ele); });
7
8 }
不知道还有没有更好的办法?
2.针对数组的每个元素都做相同的改变,那该怎么做呢?
可以用 public static void ForEach<T>(T[] array, Action<T> action);这个方法。第二个参数是一个Action的委托。
直接贴出代码了:
1 static void Main(string[] args)
2 {
3 //源数组
4 int[] SourceArr = new int[]
5 {
6 0,1,2,3,4,5,6,7,8,9
7 };
8 //目标数组
9 int[] TargetArr = new int[SourceArr.Length];
10 int index=0;
11 //将施加于每个数组元素的“加工方法”
12 Action<int> DoubleElement = delegate(int element)
13 {
14 TargetArr[index++] = element * 2;
15 };
16 //完成源数组的“加工”
17 Array.ForEach<int>(SourceArr, DoubleElement);
18 //显示处理结果
19 Array.ForEach<int>(TargetArr, (elelm) => { Console.WriteLine(elelm); });
20
21 Console.ReadKey();
22 }
3.数组元素的排序
排序的方法很多,我就不多说了。我问介绍的一个排序肯定是不常用的。直接上代码了:
View Code
class Program
{
static void Main(string[] args)
{
MyClass[] Objs = new MyClass[10];
Random ran=new Random();
for (int i = 0; i < 10; i++)
Objs[i] = new MyClass { Value = ran.Next(1, 100) };
Comparison<MyClass> WhoIsGreater = delegate(MyClass x, MyClass y)
{
if (x.Value > y.Value)
return 1;
else
if (x.Value == y.Value)
return 0;
else
return -1;
};
Array.Sort<MyClass>(Objs,WhoIsGreater);
Array.ForEach<MyClass>(Objs,(obj)=>{Console.WriteLine(obj.Value);});
Console.ReadKey();
}
}
class MyClass
{
public int Value;
}
4.在多态数组中筛选特定类型数组
如果一个数组是object,这个数组称为“多态数组”
比如我定义一个 object[] obj = new object[] { 1,"hello",100,"string"};
打算在里面查询出所有字符串数组怎么办?
.net有一个IEnumerable 类型,
定义如下: public static IEnumerable<TResult> OfType<TResult>(this IEnumerable source);
数组基类Array实现IEnumerable<T>接口。可以使用OfType<T>方法从多态数组中选取字符串
object[] obj = new object[] { 1,"hello",100,"string"};
IEnumerable<string> strs = obj.OfType<string>();
foreach (var item in strs)
{
Console.WriteLine(item);
}
5.检测数组中的元素是否满足某个条件
数组基类Array提供了相应的静态方法
public static bool TrueForAll<T>(T[] array, Predicate<T> match);
Predicate<T>是一个委托,返回bool值的方法,此方法代表数组元素必须满足的条件,其接收的参数就是数组元素自身。
例如:检测某整数是否小于100
int[] arr1 = new int[] { 1,2,3,4,8,5};
Predicate<int> match=delegate(int value){
return value<100?true:false;
};
bool isLessthan100= Array.TrueForAll<int>(arr1, match);
Console.WriteLine(isLessthan100);
6.连动数组的排序
Array 有一个Sort 重载: public static void Sort<TKey, TValue>(TKey[] keys, TValue[] items);
假设有2个一样长的数组,(分别叫做keys和items),这2个数组的元素是一一对应的。keys数组第一个元素对应的是items第一个数组的元素。
并且这2个数组之间对应是连动关系的。
上述sort方法对应keys数组中的元素进行排序,同事会改变items数组的元素位置。
回家编辑...