A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 赵大宝 中级黑马   /  2012-11-5 12:50  /  1907 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

sql server 笔记:
--------------------------------------------
DBMS 数据库管理系统
Catalog 分类
table   表
Column  列
field   字段
primarykey 主键:业务主键:有业务意义如身份证;(会有重复)
           逻辑主键:没有任何意义的,给程序看的,推存使用它;

一般用俩种做主键:int或Guid(产生的算法永远不会重复)
                  sql 中生成guid的函数是newid(),
                  .net中生成的方法:Guid.NewGuid(),
                   返回类型是Guid类型;

    int自增字段的优点:占用空间小,无需开发人员干预、易读;
                 缺点:效率低,数据导入导出的时候很痛苦;
    Guid的优点:效率高、数据导入导出方便;
          缺点:占用空间大(大约数据库%20--%30),不易读;
    业界主流倾向Guid;

表间关系、外键(foreignKey)
----------------------------------------------------
常用字段类型:bit(可选址0或1),datetime,int,varchar(不补空格),
             nvarchar(可能含有中文用它);

----------------------------------------------------------
sql 语句:
ddl(数据定义语言) dml(数据操作语言)

插入 insert into 表名(列名1,列名2...)values('*','*'...);
     insert into 表名 values('*'..);  可以省略字段名,不建议用.
     insert into 表名 (id)values(newid()),  

数据更新:
更新一个列:update 表名 set age=30;
更新多个列:update 表名 set age=50,name='*';
                       也可以 age=age+1 等等....

带过滤语句的条件的:
  uptate ** set 列名=n'年轻人'
  where age>=20  等于判断一个=号;<>不等于
  还有或者:where age=20 or(或者) and(并且) not(否的) age=30

数据删除:

删除表中全部数据:delete from 表名
drop 表名  把表全部删除
-----------------------------------------------------
数据检索:
   select *(字段) from 表名 检索所有的字段
   where 字段<.....
   select  name as 姓名   取别名;

   select count(*) from 表名  查看表有多少条数据

   select max(列名) from 表名   最大
          min                   最小
          avg                   平均
          sum                   求和    这些叫做聚合函数

select * from 表
order by 字段 asc(升序) desc(降序)   根据那个字段进行排序
!!where 要在order by 之前

----------------------------------------------------------

通配符:
通配符过滤使用like
  单字符  like'_*';
  多字符  like %*%;


空值处理:null 表示不知道   null +谁都是不知道

查询字段里有null的。  where 字段 is(not)  null;

where 字段 in(1,2,3) 在这个范围内的

where 字段 between 20 and 30  20--30之间

-------------------------------------------------
数据分组:

group by 字段    分组里面的个数

select 年龄,conut(*) from 表
group by 年龄
having conut(*)>1

having 是对分最后信息的过滤,能用的列和select中能用的
列是一样的。 having 无法代替where。



top 几 就是前几行的意思

select top 3 * from table


select top 3*from 表    //取第6--8 三个的工资 降序
where 字段 not in(select top 5 字段 from 表 order by 工资 desc)
order by 工资 desc

-------------------------------------------------------
alter table 表 add 字段....  增加字段

select distinct 字段...   //distinct 是针对整行有重复的                             去掉重复的。


union 把俩个查询结果加他,能混成一个结果。
      上下俩个类型要相同。个数要一样。
      它默认会把重复的数据只保留一条。
可以用union all 都显示。


-------------------------------------------------
函数:

select abs();  求绝对值

ceiling() 舍入到最大的整数

floor()  舍入最小整数

round 四舍五入

  字符串函数:

len() 字符串长度

lower()转小写
upper()转大写

ltrim() 去掉左空格
rtrim() 去掉右空格  

substring('abcdef',2,3) 'bcd'

日期函数:

   getdate  获取当前日期

   select dateadd(day,-3,getdate)
   dateadd +
   datediff -


select datepart(year,getdate()) 取今年年份

类型转换函数:

cast(被转换的 as 数据类型)

convert(date_type,expression)


空值处理函数

isnull(字段,'***')  如果有Null就返回****

------------------------------------------------------
重要滴:case


select 字段
(
  case ziduan
  when 1 then 'sdf'
  when 2 then 'sdf'
  else'未知'
  end
) as 客户 类型
from 表



select 字段
(
case
when 工资<2000 then'低收入'
when     >=2000 and   <=5000 then''
else ''
end
) as ***
from ....

----------------------------------------------
练习 :
有一张表T_Scores,记录比赛成绩
  Date       Name  Score
  2008-8-8   拜仁  胜
  2008-8-9   奇才  胜
  2008-8-9   湖人  胜
  2008-8-10  拜仁  负
  2008-8-8   拜仁  负
  2008-8-12  奇才  胜

要求输出下面的格式:

  name  胜  负
  拜仁  1    2
  湖人  1    0
  奇才  2    0

评分

参与人数 1技术分 +1 收起 理由
张文 + 1

查看全部评分

5 个回复

倒序浏览
值得学习ing!
回复 使用道具 举报
很好哦~~
回复 使用道具 举报
学习了···
回复 使用道具 举报
收下了,努力...
回复 使用道具 举报
基本可以看懂!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马