1.主键
分为逻辑主键与业务主键。
业务主键:具有真实意义的,比如身份证、银行卡等,一旦变化,难以维护。
逻辑主键:没有任何实际含义,只为了标识当前列在当前数据表里的位置的唯一标识。
不可以手动编辑,特殊情况下除外。
·每一张表都推荐有标识列·
·推荐使用逻辑主键·
·每一张表都推荐有主键列,并设置标识·
·主键标识列,就算数据被删除了,也会按照原先的标识增长
命令方式创建数据库
create database MySchool –数据库名
on
(
name=’MySchool_data’, –数据库名称
filename=’d:\MySchool_data.mdf’, –物理文件名
size=5mb, –初始大小
maxsize=10mb, –最大文件大小
filegrowth=15% –主文件增长率
)
log on
(
name=’MySchool_log’, –日志文件名
filename=’MySchool_log.ldf, –日志物理文件名
size=2mb,
maxsize=4mb,
filegrowth=1mb
)
go
命令方式创建表 - 要先选择要 创建表的位置
格式:
列名 类型 标识 主键 是否允许为空
id INT IDENTITY(1,1)
create table Student
(
id INT IDENTITY(1,1) PRIMARY KEY,
name NVARCHAR(16) NOT NULL,
age INT NOT NULL
)
DML数据库操作语言
·增删查改
·增加数据
INSERT INTO 表名(…列名) VALUES(…要插入的数据)
· INSERT INTO 表名 VALUES(…要插入的数据) –完全插入
· INSERT INTO 表名(…要插入的列名) VALUES(…对应的数据) –选择性插入
注意: 1.插入数据的时候,bit字段要用"0/1"表示True/False 2.时间字段要用单引号括起,单引号中的内容要遵循基本的时间格式,如‘2014-10-10’ 3.INSERT语句中列的数目要和VALUE后值的数目一致 4.不能为标识列插入数据(特殊情况下可以,SET IDENTITY_INSERT 表名 ON)(同理 SET IDENTITY_INSERT 表名 OFF) 5.直接拖拽‘列’可以快速插入列名 6.除了标识列,其他所有字段的值都要写出来,而且还要按照顺序写出来 7.数据表中的 NULL 不是空指针也不是空字符串,而是表示数据库不知道为何值 8.在服务器上执行的代码中显示的 UNICODE字符串常量 必须以大写字母 N 为前缀,避免插入特殊字符时无法识别 9.INSERT INTO 表名(列名) VALUES(DEFAULT) VALUES 后的值可以为 DEFAULT 值,即默认值 10.INSERT INTO Student(Name) VALUES('张''三') 插入的数据中有单引号的时候,需要输入两个单引号表示一个单引号(转义字符)·删除数据 DELETE FROM Student --删除表中的所有数据 TRUNCATA TABLE Studeng --重置表 (包括重置标识) ·以上两者效率有很大差别,如果用 DELETE 会产生很多的日志,而使用 TRUNCATE 只会产生一行日志。 DROP TABLE Student --直接从数据库中删除该表(慎用)·修改语句 UPDATE 表名 SET 列名1=数据1,列名2=数据2··· WHERE 列名1=数据1( AND 列名2=数据2 AND 列名3=数据3 ···)( OR 列名2=数据2 ···)( AND 列名2=数据2 OR 列名3=数据3) UPDATE Student SET age=age+1 UPDATE Student SET age+=1 update Student set Phone='10010' where name='王五' and Gender=1 or name='王五6' UPDATE Student SET Address='未知' WHERE Address IS NULL WHERE Address IS NOT NULL WHERE Address=' ' WHERE Address 注意: 1. AND 优先于 OR 执行 2. SET 的时候可以取出原来的值 3. WHERE 中可以使用的其他逻辑运算符:(||)OR 、 (&&)AND 、 (!)NOT 、 < 、 > 、 >= 、 <= 、 <>(同!=)(不等)等 约束: 非空约束:数据不能为空 主键约束:唯一且不能为空 唯一约束:数据唯一,允许为空,但只能出现一次 默认约束:如果不给值,则为默认值 检查约束:范围以及各式限制。在设计界面的列名上右键-CHECK约束 外键约束:添加主外键关系,外键的值必须来自主键表·查询语句 select 列名1( as 重命名),列名2( as 重命名)··· from 表名 where 条件 select 列名1( as '重命名'),列名2( as '重命名')··· from 表名 where 条件 select 列名1( 重命名),列名2( 重命名)··· from 表名 where 条件 select 1+1 --计算表达式值 SELECT GETDATE() --方便快捷的取到服务器系统的时间 -TOP --在查询出的整个结果集中取前一部分数据 select top 10 * from Student --取出Student表中前10条的所有数据 select top 10 Name,Gender,Age from Student --取出Student表中前10条的部分数据 select top 10 percent * from Student --从Student表中取出前10%的数据,所有计算的结果是进位的,如 21/10=2.1=>3 -ORDER BY (效率较低,能不使用就不使用) --将当前查询出来的数据结果进行排序,排序方式按照后面指定的列排序 --order by 列名 desc : 按照降序排序数据 --order by 列名 asc : 按照升序排序数据 select top 10 * from Student order by id desc -DISTINCT --针对查询之后的结果去除重复行。两行数据中只要有一个数据不同就不认为是重复行。 select distinct Name,Gender,Age from Student --将查询出的整个结果集进行重复处理。
·聚合函数
MAX(列名) –返回一行数据
MIN(列名) –返回一行数据
AVG(列名) –返回一行数据
SUM(列名) –返回一行数据
COUNT(列名) –返回筛选成功的数据量。建议使用 COUNT(ID)
注:1.聚合函数对NULL值不计算。如果一行的值都是NULL,COUNT(*) 包含对空值行、重复行的统计。 2.对于查询表中的所有数据,【select 分别列出所有的列名 from 表名】要比【select * from Student】 运行效率高。例:select max(age) from Student --取出表中的最大年龄 select min(age),max(age),avg(age),sum(age) from Student --计算出各种值 select count(*) from Student where age=10 --计算符合要求的行的数据量
·排序规则
-先后顺序为 数字、字母、汉子(拼音)
·WHERE
- < > <= >= <> != 等判断符号
- BETWEEN...AND... (该函数经过优化,在大数据中使用时,明显查询效率) -例如 BETWEEN 20 AND 30 其显示的结果中包含20与30 -SELECT * FROM STUDENT WHERE AGE BETWEEN 20 AND 30- IN (数据1,2...) (查询表中列中的值为括号中的值的数据) -SELECT * FROM STUDENT WHERE CID IN (1,2) 同 SELECT * FROM STUDENT WHERE CID=1 OR CID=2 -SELECT * FROM dbo.Student WHERE Gender IN ('男','女')注:1.BETWEEN and 在数据库内部是做过特殊优化的,执行效率比> and < 等这种方式快
·模糊查询
-使用系统已经定义好的匹配符,按照定义的规则筛选数据
-匹配符: _ % [] ^
_ 代表一个任意字符
% 代表零个或多个任意字符
[] 代表一个字符的取值区间
-不区分大小写
^ 配合[]使用,表示不属于该区间
-该匹配符数据库不兼容,SQL SERVER可以使用,其他数据库要使用 NOT LIKE
注:1.使用匹配符筛选数据效率很低 2.当要转义匹配符时一般使用 [] 进行转义,而'^'不用,因为当'^'在[]外时就代表一个普通的'^'符号-例如:SELECT * FROM STUDENT WHERE NAME LIKE '%王%' --从表中筛选出名字中有'王'字的人 SELECT * FROM STUDENT WHERE NAME LIKE '王%' --从表中筛选出姓'王'的人 SELECT * FROM STUDENT WHERE NAME LIKE '_A%' --从表中筛选出名字第二个字是'A'的人 SELECT * FROM STUDENT WHERE NAME LIKE '%[A-Z]%] --从表中筛选出名字中有字母的人 SELECT * FROM STUDENT SHERE NAME LIKE '%[0-9]%' --查询表中名字中有数字的人 SELECT * FROM STUDENT WHERE NAME LIKE '%[0-9(,)A-Z]%' -- SELECT * FROM STUDENT WHERE NAME LIKE '%[^0-9A-Z]%' --查询名字中没有数字和字母的人 SELECT * FROM STUDENT WHERE NAME NOT LIKE '%[0-9A-Z]%' --同上,查询名字中没有数字和字母的人 特殊: SELECT * FROM STUDENT WHERE NAME LIKE '%[%]%' --查询名字中有一个'%'的人 SELECT * FROM STUDENT WHERE NAME LIKE '%[_]%' --查询名字中有一个'_'的人 SELECT * FROM STUDENT WHERE NAME LIKE '%['']%' --查询名字中有一个 单引号 的人 SELECT * FROM STUDENT WHERE NAME LIKE '%['']%' --同上 SELECT * FROM STUDENT WHERE NAME LIKE '%^%' --匹配出名字中有一个'^'的人
·空值判断
-SELECT * FROM STUDENT WHERE ADRESS IS NULL
-SELECT * FROM STUDENT WHERE ADRESS IS NOT NULL
·ISNULL() 函数
-如:SELECT NAME,ISNULL(AGE,符合AGE类型的其他值) FROM STUDENT WHERE … –当查询的结果中,AGE的值为’NULL’,则显示为要替换的值
·类型转换
-CAST(AGE AS NVARCHAR(10)) –将原本为INT类型的AGE转换成NVARCHAR(10)类型
-CONVERT(INT,’123’) –将字符串’123’转换成INT类型
-
·GROUP BY
CAST(EXPRESSION AS DATA_TYPE)
CONVERT(DATA_TYPE,EXPRESSION,[STYLE])
-根据某一列数据进行分组,返回的数据表格中一行代表一组,通常配合聚合函数使用。
-例如:SELECT GENDER,MAX(AGE),MIN(AGE),SUM(AGE) FROM STUDENT GROUP BY GENDER
SELECT * FROM STUDENT GROUP BY GENDER
-注:1.分组后只能获得作为分组依据的原表数据,其他数据需通过聚合函数获得
-HAVING -其作用是对分组后的信息进行过滤。可用的参数为GROUP BY子句中的参数和聚合函数 -例如:SELECT AGE,COUNT(ID) FROM STUDENT GROUP BY AGE HAVING AGE>25 SELECT AGE,COUNT(ID) FROM STUDENT GROUP BY AGE HAVING COUNT(ID)>1
·SQL语句的执行顺序
1.SELECT -> DISTINCT -> TOP
2.FROM 表
3.WHERE 条件 –形成结果集
4.GROUP BY 列
5.HAVING 筛选条件
6.ORDER BY 列
`UNION 联合查询
-1.两个结果集必须具有相同的列数
2.列具有相同的数据类型(至少能隐式转换)
3.最终输出的集合的列名由第一个结果集的列名确定
-SELECT * FROM STUDENT WHERE AGE>25 UNION SELECT * FROM STUDENT WHERE AGE<30 UNITON ... (可进行多结果集联合,但结果中不会出现重复数据) -SELECT * FROM STUDENT WHERE AGE>25 UNION ALL SELECT * FROM STUDENT WHERE AGE<30 UNITON ALL ... (可进行多结果集联合,结果中可能包含重复数据)
·批量插入 = 插入语句 + 结果集
-将结果集当成值插入数据库,结果集的列数量、类型都要一样
INSERT INTO STUDENT(STUNO,ENGLISH,MATH)
SELECT 1,80,100 UNION
SELECT 1,80,100 UNION
SELECT 3,50,59 UNION ALL
SELECT 4,66,89 UNION
SELECT 5,59,100
-可以复制一张表,但是没有主键 Select * into Score2 from Score where 1<>1
·字符串函数
-LEN(STRING) 计算字符串中的字符个数
-DATALENGTH(STRING) 计算字符串的字节长度
-LOWER(STRING) 将字符串转换成小写
-UPPER(STRING) 将字符串转换成大写
-LTRIM(STRING) 去除字符串左侧的空白字符
-RTRIM(STRING) 去除字符串右侧的空白字符
-LEFT(STRING,LENGTH) 取得字符串从左侧开始取的LENGTH长度的字符串
-RIGHT(STRING,LENGTH) 取得字符串从右侧开始取的LENGTH长度的字符串
-SUBSTRING(STRING,START_NUM,LENGTH) 从字符串中第START_NUM个字符开始取LENGTH个字符
·日期函数
-GETDATE() 取得当前日期
-DATEADD(PART_NAME,NUM,DATE) 在DATE的基础上增加NUM的时间
例如:SELECT DATEADD(YEAR,2,GETDATE())
SELECT DATEADD(MONTH,2,GETDATE())
SELECT DATEADD(DAY,2,GETDATE())
SELECT DATEADD(HOUR,2,GETDATE())
…
-DATEDIFF(DATE_NAME,START_DATE,END_DATE) 取得以DATE_NAME为时间单位的两个时间的差
例如:SELECT DATEDIFF(MINUTE,GETDATE(),DATEADD(YEAR,2,GATDATE()))
-DATEPART(DATE) 取得一个日期的特定部分
例如:SELECT DATEPART(YEAR,GETDATE())
SELECT DATEPART(MONTH,GETDATE())
SELECT DATEPART(HOUR,GETDATE())
-YEAR(DATE) 取得时间的年
-MONTH(DATE) 取得时间的月
-DAY(DATE) 取得时间的日
·取绝对值 ABS(数值)
【高级运用】
-INSERT
1.在 INSERT 语句的 VALUES 前加上 OUTPUT INSERTED.列名 ,这样就能取得新增数据的列名值,和普通的 INSERT 语句相比,当使用 OUTPUT 时将返回列名值,与 @@IDENTITY 类似。
-DELETE
1. DELETED.列名 ,在 WHERE 前使用,效果同 INSERTED.列名 。(若删除多行,则返回多个值)
为已存在的表的列添加默认值约束
ALTER TABLE [表名] ADD CONSTRAINT [约束名] DEFAULT([默认值]) FOR [列名]