//创建表
create table user(
id int(11) not null auto_increment,
name varchar(50) default null,
password varchar(50) default null,
primary key(id)
)
//distinct 关键字是查询数据库中不相等的数据如果有相同的数据则显示一条数据
SELECT distinct name FROM user
//and(并且) or(或)查询where语句的条件
SELECT * FROM user where City="上海" and name="admian3"
SELECT * FROM user where City="上海" or name="admian3"
//如果and 和or 结合来用的时候则要用到()处理
SELECT * FROM user where (City="上海" or name = "admian3") and name="xxx"
//order by(关键字排序)(按照名字的顺序来做升序排序)
select * from user order by name
//order by 后面可以接多个排序列表中间用,隔开
select * from user order by name,City,....
//desc (降序的关键字)
select * from user order by name desc
//asc (升序的关键字 order by 后面不跟有降序的关键字那么就是默认为升序)
select * from user order by name desc,City asc
//添加数据
insert into user(name,password,Address,City,OrderNumber)values("ddsds","ssss","广东","广州",1234656)
//更新数据
upate user set name="ffff" where id =6
//删除数据
delete from user where id = 6
//limit (关键字是查询数据库中多少条数据 再mysql里面用 如果是sql server用则用top ) select * form user limit 2
//in (关键字允许我们在where语句中存在多个条件)
select * from user where name in("xxxxs","zdasdsa")
//between ....and..(关键字是处理在什么之间到什么之间的操作)
select * from user where name between "fffff" and "ssss"
//as(关键字是用于给表或数据库起一个别名)
select * name as n,password as p from user
//inner join (关键字使用了内连接来查询两个表的数据,其中还有 left join(左连接) right
join(右连接) full join(左右连接))
select u.name,u.Address,n.number from user as u “inner join” number as n on u.id = n.user_id order by u.Address
//union(命令将两条sql语句拼接起来)
select * from user
union
select * from number
//select into(关键字是为了把一个表的数据插入到另一个表当中)
select * into user from number
//create database(创建数据库)
create database my_db
//create table(创建表)
create table Persons
(
id int(10),
lastName varchar(25)
........
)
//约束
not null (不为null值)
unique (唯一)
primary key(主键)
foreign key(外键)
check(查询约束)
default(默认值约束)
//create index (创建索引)
create index ff on user (name,Address)
第二篇:SQL学习总结
SQL学习总结
一些常用的知识
1. NULL
1. ISNULL函数做一个空值的判断,语法表达式为ISNULL(EXPRESSION1,0),意思是如果是0则返回NULL,如果不是零,则返回EXPRESSION1的表达式
ISNULL函数,经常跟CASE WHEN…THEN..ELSE..END 表达式联合在一起做一个复杂的ISNULL判断,他的意图是先统一表中的NULL值和对查询结果不产生影响的值。
2.NULLIF函数,语法表达式为NULLIF(EXPRESSION1,EXPRESSION2),意思是如果两个表达式相等则返回NULL,如果两个表达式不相等则返回EXPRESSION1.
2.数据类型的转换
1. 一般情况来说SQL里面从低级的数据类型转换成高级的数据类型是默认的,但从高级转换为低级的数据类型则需要做定义。
数据类型排序(从高到低)
DATETIME—FLOAT—INT—VARCHAR—CHAR
当自己不能判断哪个数据类型比较高时,可以先不做转换,如果SQL可以运行,则说明是向高级转换,如果不能运行,则必须做一个转换
2.CONVERT函数
表达式;CONVERT(数据类型(长度),EXPRESSION1,样式)
例子;CONVERT(VARCHAR(8),GETDATE(),112)
3.CAST函数
表达式;CAST(EXPRESSION1 AS 数据类型(长度))
例子;CAST(GETDATE() AS VARCHAR(8))
3.当查询的结果存在小数点时,我们为了查询的结果美观,好比较,可以根据需要定义保留的小数点位数
1.CONVERT函数
表达式;CONVERT(数据类型(长度),EXPRESSION1)
例子;CONVERT(NUMERIC(18,2),EXPRESSION1)
解释;将EXPRESSION1保留两位小数
2. CAST函数
表示式;CAST(EXPRESSION AS 数据类型(长度))
例子;CAST(EXPRESSION AS NUMERIC(18,2))
4.排序函数
当我们想对查询的结果取一个极值时,通常容易用到排序函数;ROW_NUMBER
表达式;ROW_NUMBER () OVER(PARTITION BY COLUMN_NAME1 ORDER BY
COLUMN_NAME2 ASC/DESC) AS 新列名
解释;PARTITION BY 这个函数是为了区别要排序的的结果,而ORDER BY 函数是鬼结
果进行排序。
例子;ROW_NUMBER () OVER(PARTITION BY 基金代码 ORDER BY 基金净值
DESC) AS 最大基金净值
取出每个基金最大的基金净值
5.用函数计算和定义时间间隔
1.DATEADD函数
我们可以通过DATEADD函数来定义时间间隔。
例如;近一周 DATEADD(DD,-7,GETDATE())
近一个月 DATEADD(MM,-1,GETDATE())
近半年 DATEADD(MM,-6,GETDATE())
近一年 DATEADD(YY,-1,GETDATE())
2. DATEDIFF函数
我们可以通过DATEDIFF函数来计算时间间隔
表达式;DATEDIFF(DD/mm/yy,EXPRESSION1,EXPRESSION2)
例如;现在和TDATE的时间间隔
DATEDIFF(DD/MM/YY,TDATE,GETDATE())
3. DATEADD和DATEDIFF的交叉使用
例如;这是计算一个月第一天的SQL 脚本:
SELECT DATEADD(mm, DATEDIFF(mm,0,getdate()), 0)
本周的星期一
SELECT DATEADD(wk, DATEDIFF(wk,0,getdate()), 0)
一年的第一天
SELECT DATEADD(yy, DATEDIFF(yy,0,getdate()), 0)
季度的第一天
SELECT DATEADD(qq, DATEDIFF(qq,0,getdate()), 0)
4. 备注;在使用这两个函数的时候我们必须注意间隔不能用小数来定义,这两个函数
无法识别小数
5. 题目要求查询的结果随自然日的变化而变化也要用到这两个函数。
例子;取上月中证500指数权重数据,列名;指数代码,指数名称,日期,权
重股代码,权重股市场代码,权重(issweight表),并按照日期,权重股
代码排序。
--注日期要能随自然日变化而变化
SELECT指数代码=ISYMBOL,指数名称=INAME,日期=TDATE,权重股代码=SYMBOL, 权重股市场代码=EXCHANGE,权重=WEIGHING
FROM ISSWEIGHT
WHERE INAME='中证500指数'
AND
LEFT(CONVERT(VARCHAR(8),TDATE,112),6)=LEFT(CONVERT(VARCHAR(8),DATEADD(MM,-1,GETDATE()),112),6)
ORDER BY 日期
6.对查询的结果进行行业分类
--中信标普
SELECT * FROM CINDUSTRY WHERE STYLE='504'
--申万1级
SELECT * FROM CINDUSTRY WHERE Style='464'
--申万2级
SELECT * FROM CINDUSTRY WHERE Style='489' AND RIGHT(STYLECODE,2)='00'AND RIGHT(STYLECODE,3)<>'000'
--取证监会一级
SELECT * FROM CINDUSTRY WHERE Style='009' AND DATALENGTH(STYLECODE)=2 --取证监会二级
SELECT * FROM CINDUSTRY WHERE Style='009'
AND DATALENGTH(STYLECODE)=CASE WHEN
STYLECODE<>'ZC99' THEN 3 ELSE 4 END STYLECODE LIKE '%C%' AND
注释:LEN(STYLECODE)=2 表示取对应代码长度为2的
LEN(STYLECODE)=CASE WHEN STYLECODE LIKE '%C%' AND STYLECODE<>'ZC99'
THEN 3 ELSE 4 END 表示制造业的时候是取长度为3的对应代码,其他的长度为4的时候都是属于证监会二级分