• Net学习日记_SQL_3


    约束

    非空约束---就是不能为 null

    主键约束(PK) primary key constraint---唯一(不重复的) 且 不为空唯一约束+非空位数

    唯一约束 (UQ)unique constraint           唯一,允许为空(null),但只能出现一次

    默认约束 (DF)default constraint            如果不给值,默认值

    检查约束 (CK)check constraint             范围以及格式限制(男,女,其余的不行),在设计界面,字段上右键,有“check约束”,点击之后

    外键约束 (FK)foreign key constraint     表关系—主外键关系,添加主外键关系,外键的值必须来自主键表

    查询语句

    SELECT TOP 10 * FROM dbo.Student--取出前10条的所有数据
    SELECT TOP 10 Name,Gender,Age FROM dbo.Student--取出前10条的部分数据
    
    SELECT TOP 10 PERCENT * FROM dbo.Student---取出前面10%的数据,所有小数,是进位的,21/10=2.1  3 
    --19/10 1.9  2

    Distinct

    去除重复行,但是是正对于查询之后的结果,来去除重复行,它是判断结果数据中,整行数据,只要有一个列不相同,那么就不认为是相同数据。

    Top和distinct结合使用的话,distinct是先执行的,先去除重复项,然后在去除想要的条数。

    SELECT DISTINCT Name,Age FROM dbo.Student
    SELECT TOP 10 PERCENT * FROM dbo.Student --升序 进位

    聚合函数

    SELECT MAX(Age),MIN(Age),SUM(Age),AVG(Age) FROM dbo.Student
    --数字,字母,汉字(拼音)
    SELECT COUNT(id) FROM dbo.Student WHERE Name='钱七' AND Pwd='888888'

    Where

    BETWEEN and 在数据库内部是做过特殊优化的,执行效率比> and < 等这种方式快
    SELECT * FROM dbo.Student WHERE Age BETWEEN 25 AND 30 ---25的有,30也有
    相当于Age>=25 AND Age<=30
    SELECT * FROM dbo.Student WHERE id BETWEEN (num-1*5+1 AND num*5
    1:1-5
    2:6-10
    IN关键字
    判断一个列的值是否在后面括号内,
    
    SELECT * FROM dbo.Student WHERE Gender IN ('','')--正确
    SELECT * FROM dbo.Student WHERE Gender IN (0,1,2)--错误,两者数据的类型不同

    模糊查询

    使用系统已经定义好的匹配符,按照定义的规则匹配数据,如果能匹配就查出来!

    通配符,匹配符:_ % [] ^

    _ 代表一个任意字符

    % 代表零个或多个任意字符

    [] 代表一个字符 的 取值区间

    ^ 配合[]使用,表示不是这个区间,数据库不兼容的,sqlserver可以用,其他数据库要用not like

    里面不区分大小写

    效率很低

    如果在匹配时,就要匹配这几个符号,那么需要把符号放在[]中,^不用,因为,它不放在[]中就默认是普通字符了

    SELECT * FROM dbo.Student WHERE Name LIKE '王%[0-9]%'
    SELECT * FROM dbo.Student WHERE Name LIKE '%^%'

    空值判断

    SELECT * FROM dbo.Student WHERE Address <> NULL        —错误
    SELECT * FROM dbo.Student WHERE Address IS NULL        —判断是为null 的
    SELECT * FROM dbo.Student WHERE Address IS NOT NULL    —判断不是为null 的
    SELECT Name,ISNULL([Address],'地球') FROM dbo.Student  -Isnull可以判断后面是否为null,为null就用第二个参数代替
    SELECT Name,ISNULL(Age,20) FROM dbo.Student

    数据排序

    SELECT * FROM dbo.Student WHERE Age >20 ORDER BY Gender DESC,Name DESC
    
    SELECT * FROM dbo.Teacher ORDER BY Salary DESC

    ORDER

    将当前查询出来的数据结果,进行排序,排序按照后面指定的列排序

    SELECT * FROM dbo.Student ORDER BY Gender DESC

    DESC—倒序排序(降序),ASC—正序排序(升序)

    9876543210  0123456789

    汉字,用拼音的首字母排序,升序是从a-z,降序是从z-a

    Order by 是放在where后面的

    系统默认的是升序排序,关键字:ASC;如果想倒过来,关键字:DESC

    如果是根据多个列排序,那么两个之间用逗号隔开

    排序会先按照前面一个排序之后,再按照后面一个排序

    Group By

    最数据进行分组,分组之后的数据就是“分组信息”,和原来的表里的信息就没有联系了。

    分组之后,可以取到分组根据,就是根据什么字段分组,就能去到字段的名字,还能使用聚合函数。

    SELECT Address,COUNT(id) FROM dbo.Student GROUP BY Address
    
    SELECT Gender,COUNT(id),MAX(Age),MIN(Age),SUM(Age) FROM dbo.Student GROUP BY Gender
    
    SELECT Age,Name FROM dbo.Student GROUP BY Age
    
    SELECT * FROM dbo.Student ORDER BY Gender

    Having

    对分组信息进行过滤,因为分组之后的信息和原来的表信息没有关系了。

    Having可以用的之后出现在group子句中的列,还有聚合函数。

    SELECT Age,COUNT(id) FROM dbo.Student WHERE Age >25 group BY Age HAVING Age>25
    
    SELECT Age,COUNT(id) FROM dbo.Student WHERE Age >25 group BY Age HAVING COUNT(id)>1
    
    SELECT Age,COUNT(id) FROM dbo.Student WHERE Age >25 group BY Age HAVING AVG(Age)>30

    执行顺序:

    查询某张表,如果表里面有1000W数据,我们只查出100条数据--->再对着100条数据进行分组,可以筛选分组;

    如果指定列,结果集就更小了,这里只有100条指定列的数据,取出前面几条,或者取出重复。

    最进行排序,排序就只需要对100条数据排序了

    类型转换

    SELECT Name,ISNULL(CAST(Age AS NVARCHAR(10)),'保密') FROM dbo.Student
    
    SELECT CAST(Age AS NVARCHAR(10)) FROM dbo.Student
    
    SELECT CAST('123' AS INT)
    
    SELECT CONVERT(INT,'a')
    
    CAST(Age AS NVARCHAR(10))=='转换过后'
    SELECT ISNULL(转换过后 ,'保密') FROM dbo.Student
    
    SELECT CAST(NULL AS NVARCHAR(10))
    
    Select '您的班级编号'+ 1
    Select '123'+ 1   -1231
    SELECT '123' + CAST(1 AS NVARCHAR(10))
    
    SELECT getdate()
    select convert(varchar(20),getdate(),104)

    联合结果集

    连接两个结果集

    1. 两个集合必须具有相同的列数
    2. 列具有相同的数据类型(至少能隐式转换的)
    3. 最终输出的集合的列名由第一个集合的列名来确定
    SELECT Name,Age,Gender FROM dbo.Student--19
    UNION
    SELECT Name 姓名,Age 年龄,Gender 性别 FROM dbo.Student—19
    Union默认会去除重复行
    
    SELECT Name,Age,Gender FROM dbo.Student--19
    UNION All
    SELECT Name 姓名,Age 年龄,Gender 性别 FROM dbo.Student—19
    Union all 不会去除重复行

    一般都是使用union all

    批量插入

    INSERT INTO dbo.Student (Name, Pwd, Gender, Address, Phone, Age, Birthday, CardId, CId) 
    SELECT Name, Pwd, Gender, Address, Phone, Age, Birthday, CardId, CId FROM dbo.Student
    将一个结果集当成值插入数据库,结果集的列数量,类型,都要一样
    Select * into Score2 from Score where 1<>1 可以复制一张表的结构信息,没有主键

    字符串函数

    --**************字符串函数
    SELECT LEN('今天天气很不错,北 京居然没有雾霾a')--18,计算字符串的字符个数
    SELECT DATALENGTH('今天天气很不错北,京居然没有雾1')
    --一个汉字两个字节数
    --一个字母一个字节
    --一个中文标点符号两个字节
    --一个英文标点符号一个字节
    --一个数字是一个字节
    
    SELECT LOWER('AA')--转换成小写
    SELECT UPPER('aa')--转换成大写
    SELECT DATALENGTH('   aaa   ')
    SELECT LTRIM('   aaa   ')--去除左边空格
    SELECT LTRIM('a     a')--不能去除中间的空格
    SELECT DATALENGTH(RTRIM('   aaa   '))--去除右边空格
    SELECT DATALENGTH(LTRIM(RTRIM('   aaa   ')))
    
    SELECT LEFT('今天天气很不错,北 京居然没有雾霾a',5)--从左向右截取5个字符
    SELECT RIGHT('今天天气很不错,北 京居然没有雾霾a',5)--从右往左,截取5个字符
    --从中间开始截取,从第几个开始截取,从滴5 个开始,截取5个
    
    --'今天天气  很不错,北    京居然没有雾霾a'
    --SELECT LEN('今天天气很不错,北京居然没有雾霾a')-LEN()
    SELECT SUBSTRING('今天天气很不错,北京居然没有雾霾a',5,5)--从第二个参数的下标开始,截取第三个参数的长度
    
    SELECT GETDATE()--去的当前日期
    SELECT DATEADD(YEAR,2,GETDATE())
    SELECT DATEADD(month,2,GETDATE())
    SELECT DATEADD(day,2,GETDATE())
    SELECT DATEADD(hour,2,GETDATE())--在第三个参数的实践基础上,加上第一个参数指定的部分,加的量是第二个参数
    
    SELECT DATEDIFF(MINute,DATEADD(YEAR,2,GETDATE()),GETDATE())--取得两个时间之间的差,
    
    SELECT DATEPART(YEAR,GETDATE())
    SELECT DATEPART(month,GETDATE())
    SELECT DATEPART(day,GETDATE())
    SELECT DATEPART(hour,GETDATE())--取得一个日期的特定部分,如:年,月等
    
    SELECT YEAR( GETDATE() )--取到一个日期的年份
    SELECT month( GETDATE() )--取到日期的月份
    SELECT DAY( GETDATE() )--取到日期的天
    
    SELECT DAY('2012-10-10')--日期的字符串表现形式
  • 相关阅读:
    部署prerender服务器
    Bzoj4727--Poi2017Turysta
    Bzoj4818--Sdoi2017序列计数
    Heoi2014系列题解
    scoi2017酱油记
    Burnside引理与Pólya定理
    2017省选前北京集训总结
    奥妙重重的随机发生器
    ???--???Insection is not allowed
    反演
  • 原文地址:https://www.cnblogs.com/lisong-home/p/7732894.html
Copyright © 2020-2023  润新知