1、什么是数据库?数据库特点?
数据库就是存放数据的仓库
海量存储、查找速度快、并发性问题控制、安全性、数据完整性(保存在数据库中的数据是正确的,真是的)
2、主键的作用?选择主键的注意事项?
唯一标识表中的一条记录
尽量选择单列作为主键:
1>必须唯一(不能有重复)
2>该列不能为空值
3>比较稳定的列(不经常更新的,最好是建好以后再也不更新)
4>选择主键列的时候,推荐使用“逻辑主键”(例如:自动编号、guid等),不推荐“业务主键”(选择有实际意义的列作为主键(例如:身份证号,工号、学号等。))
3、下表,分析为什么要有外键?
数据冗余-数据重复出现,占用空间多,想修改厂家信息得修改很多行,每次录入新的货物的话必须把厂家地址、厂家电话等信息重新录入一次。
使用外键:可以降低数据冗余量~不用太多字符串占硬盘空间~之间用整形数据代表编号就行~
假设两张表中都有主键,A表,B表。A表中的主键为AId。B表中的主键为Bid.
这时,A表中引用了B表中的Bid作为一列,这时,我们就叫A表为B表的外键表,而B表叫做主键表。
当创建了主外键关系后,如果在外键表中有任何记录引用了主键表中的某条记录,则在主键表中不能删除该记录。同时主键表也不能删除。
4、登陆数据库的方式及区别是什么?
用户名验证: 通过用户名和密码登陆,在互联网使用较多
Windows身份验证:当前操作系统的身份来验证,一般在局域网访问系统使用
5、、char和varchar的区别是什么? 最长长度8000
英文和数字都是占一个字节,其它字符占两个字节(中文)
a)Char声明无论多少字节,它都会自动补齐,空格补齐(声明4,输入22,则会有两个空格补齐)~
不可变的~就是说声明多少输入少了它依然补齐声明存放的大小
b)Varchar声明多少字节,存多少数据就是多少,不会空格补齐~
可变的~就是说声明多少就存多少~
6、nchar和nvchar区别是什么? 最长长度4000
nchar(4):Unicode编码~实际一个字符(任何字符)要两个字节存 固定长度
nvchar(4)Unicode编码~实际一个字符(任何字符)要两个字节存 可变长度
7、len函数和datalength函数返回的是什么?
字符数 字节数
select len(‘a’),datalength(‘a’) 输出都是1
select len(‘没’),datalength(‘没’) 输出1,2
8、创建数据库的关键字是什么?
----创建 数据库 数据库名称
CREATE DATABASE GuangzhouBlog
ON PRIMARY --默认就属于PRIMARY主文件组,可省略
(
NAME='GuangzhouBlog', --主数据文件的逻辑名
FILENAME='E:\Itcast\广州\广州Dotnet一期\db\GuangzhouBlog_data.mdf', --主数据文件的物理名
SIZE=3mb, --主数据文件初始大小
MAXSIZE=10mb, --主数据文件最大的值
FILEGROWTH=15% --主数据文件的增长率
)
LOG ON-- 日志文件
(
NAME='GuangzhouBlog_Log',
FILENAME='E:\Itcast\广州\广州Dotnet一期\db\GuangzhouBlog_log.ldf',
SIZE=3mb, --日志文件初始大小
MaxSize=20mb,
FILEGROWTH=1MB
)
9、怎么指定一个数据库来创建数据表?
USE GuangzhouBlog -- 设置当前使用的数据库,即数据表要创建到哪个数据库
--创建 表 表名
CREATE TABLE Score
(
ScoreId INT IDENTITY(1,1),
SId INT NOT NULL ,
English INT NOT NULL,
Math INT NOT NULL
)
10、bit数据类型在sql语句和设计器里面分别用什么表示?
bit数据类型在写SQL语句时,用1和0表示,设计器里面就是用true和false表示
11、插入数据的sql语句是什么?
--a.不指定列,直接新增所有列的值
INSERT INTO Classes VALUES ('黑豹训练营一期',38,getdate(),0)
--b.指定列新增 insert into 表(列值1,列值2…列值n) values()
INSERT INTO Classes(className,count) VALUES ('黑豹训练营二期',138)
--c.insert into talbe select from table
从自己表里复制一些到自己表 insert into 数据表(列值1,列值2….列值n) select 列值1,列值2….列值n 数据表
INSERT INTO Classes(className,count) SELECT classname,count FROM classes
--c.2INTO select (前提是自己先建好Classes2表,列名相同) insert into 目标表(列值1,列值2….列值n) select 列值1,列值2….列值n 数据源表
-- 从Classes复制一些数据到Classes2表
-- 先执行后面的select语句,获得一个结果集(两列),然后循环结果集里的行,每次取出行里的两个值,
-- 然后再执行insert 语句,生成values语法,并将循环到的两个值赋进去,最后,完成新增
INSERT INTO Classes2(className,count) --values('班级名',40)
SELECT classname,count FROM classes
--c.3 insert select 常量union
INSERT INTO Score (SId,English,Math)
SELECT 1,10,99 UNION
SELECT 2,66,77 UNION
SELECT 2,66,88 UNION
SELECT 1,77,54 UNION
SELECT 1,88,99
--d.SELECT INTO
复制一张表(是在复制的同时创建一张新表) select 列值1,列值2,…..列值n into 新表 from 数据源表
SELECT id,classname,count,adddate,isdel --(指定从数据源表中查询列出来,然后直接作为新表的列名)
INTO Classes4 -- 这个是新表的名称,此时表并不存在
FROM classes -- 数据源表
12、更新数据表的sql语句是什么?
update 表名称 set 要改变的列值 where 修改的条件
--1.普通更新
UPDATE classes SET count=45 WHERE id=3--将id=3的行的count列的值设置成45
--2.更新多个列
UPDATE classes SET count=55,className='黑豹训练营二.五期' WHERE id=3
--3.更新多行
UPDATE classes SET COUNT=COUNT+2 WHERE count<50
--4.或or
UPDATE classes SET COUNT=COUNT+10 WHERE count=55 OR count<50
--5.与and
UPDATE classes SET COUNT=COUNT+2 WHERE count=56 and className='广州传智播客.Net训练营一期'
13、删除数据表的sql语句是什么?
--1.删除整个表的数据
DELETE FROM classes4 --DELETE classes4
--2.删除满足条件的数据
DELETE FROM classes3 WHERE COUNT<50 --and or
--3.删除多条ID记录
DELETE FROM classes WHERE id=4 OR id=5 OR id=6
DELETE FROM classes WHERE id in(4,5,6)
--4.TRUNCATE 能够清空表数据,并且重置主键ID使ID从1开始,而且还不会为每行删除的记录生成删除的日志,而仅仅生成一条日志,不会触发删除触发器
TRUNCATE TABLE classes2
--DELETE TABLE classes2
truncate只能操作表,不能操作数据库
14、查询数据表的sql语句是什么?
--1.查询表里所有的行和列数据*代表查询所有列
-- (尽量不要使用*,因为会先到系统表里去查询classes表里的所有列名,然后再去查询classes表列数据)
SELECT * FROM classes
SELECT id,classname,count,adddate,isdel FROM classes--尽量使用指定列名的查询方式
--2.为列取别名
SELECT id AS 编号,classname 班级名,count,adddate,isdel FROM classes
--3.通过where 来筛选查询结果集的行
SELECT * FROM classes WHERE [count]>50
--4.直接使用select 显示常量和执行表达式
SELECT 1,'我爱北京天安门'
SELECT 1+1
SELECT getdate()
--5.使用top选择筛选行
SELECT * FROM classes
--5.1获得前几行
SELECT TOP 3 * FROM classes
--获得人数最多的前三个班
SELECT TOP 3 * FROM Classes ORDER BY [count] DESC --降序排列 asc 升序排列
--5.2根据百分比来取行
SELECT TOP 50 PERCENT * FROM Classes ORDER BY [count]
--6.distinct去除重复项,先把数据表里的行都获取,然后把列逐个的取出放入结果集,在放之前,先检查结果集中是否已存在相同值,如果有,就不添加
SELECT DISTINCT [count] FROM Classes
SELECT DISTINCT [count],classname FROM Classes
15、有哪些聚合函数?
--1.Max求最大值
SELECT * FROM classes
SELECT max(id) from classes
--2.Sum求和
SELECT sum(id) from classes
--3.Min 求最小值
SELECT min(id) from classes
--4.Count 求行数
SELECT COUNT(id) from classes
--5.求平均数
SELECT avg(id) from classes
SELECT sum(id)/COUNT(id) from classes
16、类型转换
--1.Cast
SELECT * FROM classes
SELECT cast('2012-08-04' AS DATETIME) + 1
--SELECT '2012-08-04' + 1
--2.Convert
SELECT convert(DATETIME,'2012-08-04')+1
SELECT cast(adddate AS VARCHAR(10)) FROM Classes c
17、查询
--查询----------------------------------------------
--1.Between and
SELECT * FROM Students
SELECT * FROM Students s WHERE s.age BETWEEN 21 AND 26
--2. in
SELECT * FROM Students s WHERE age in(20,21,22)
SELECT * FROM Students s WHERE s.age IN (SELECT age FROM Students s WHERE gender=1)
18、什么是数据库约束?数据库约束有哪些?
数据库约束:是为了保证数据的完整性(正确性)而实现的一套机制
非空约束:设计器里面的表格数据不允许为空
主键约束:设置主键,唯一约束,值不能重复
唯一约束:设计器选定表格变量右键,索引键,添加一个列名,选择列名,选择是唯一
默认约束:找到某列的列属性有默认值绑定,添加默认值
检查约束:设计器变量右键添加Check约束,添加年龄一个表达式age>0 and age<100
外键约束:就是主外键,右键变量关系,删除一个关系,添加新的关系,选择主外键
19、什么是级联删除?
设置级联删除,能够将两个表中的主外键联系的数据删掉,如果没有设置级联删除,那么删除主外键有关系的id就不能删除
表中设计器打开-右键变量-关系=删除规则-级联
20、模糊查询的关键字是什么?4个通配符的含义 是什么?
LIKE 关键字
a)% 包含零个或多个字符的任意字符串。
b)_ 任何单个字符。
c)[ ] 指定范围(例如 [a-f])或集合(例如 [abcdef])内的任何单个字符。
d)[^] 不在指定范围(例如 [^a - f])或集合(例如 [^abcdef])内的任何单个字符。请将通配符和字符串用单引号引起来
如:把所有姓王的人查出来
-- %代表任意长度的任意字符
SELECT * FROM Students WHERE NAME LIKE '王%'
如:取姓王的,有两个、三个字符
-- _代表长度的任意字符
SELECT * FROM Students WHERE NAME LIKE '王_'
SELECT * FROM Students WHERE NAME LIKE '王_ _'
如:取一位、两位数,[]范围只能是[0-9]或[a-z]
-- []代表长度的[范围]内字符
SELECT * FROM Students WHERE id LIKE '[0-9]' 只能查出一位数
SELECT * FROM Students WHERE id LIKE '[0-9][0-9]' 能查两位数
SELECT * FROM Students WHERE name LIKE '[a-z]'
SELECT * FROM Students WHERE name LIKE '[a-z][a-z]'
-- ^ 代表取反,常结合[范围]通配符使用(只有MSSQLSERVER支持)
SELECT * FROM Students WHERE name LIKE '[^a-b]' --查询名字为一个字符,但不在a-b之间。
-- not 取反几乎所有数据库都支持
SELECT * FROM Students WHERE NAME not LIKE '[a-b]' --查询不是单个的a-b之间的字符的所有名字
21、数据库中的null表示什么?怎么进行空值判断?
数据库中的null表示“不知道”,而不是表示没有。因此select null+1结果是null,因为“不知道”加1的结果还是“不知道”
is null、is not null
SELECT * FROM Students WHERE cid is NULL
SELECT * FROM Students WHERE cid IS NOT NULL
--isnull函数isnull(值,为空默认值)--------------------------------
SELECT isnull(null,'默认值')
SELECT id,isnull(cid,0),name,age,gender,birthdate,regdate,isdel FROM Students
22、数据排序的关键字是什么?一般放在语句的什么位置?
order by 一般要放到所有语句的后面
--order by 排序(升序-asc 降序-desc)---------------------------------
SELECT * FROM Students ORDER BY id--默认为asc 升序排列
SELECT * FROM Students ORDER BY id DESC --倒序排列
--按照字符排序
SELECT * FROM students ORDER BY NAME --如果排序列的值是字符类型,则按照字母的先后次序排列,若果有中文,则按照中文的拼音字母排列
--按照多个列排序
SELECT * FROM students ORDER BY name,age--当name相等时,按照年龄升序排列
SELECT * FROM students ORDER BY name,age DESC --当name相等时,按照年龄降序排列
23、数据分组的关键字是什么?必须放在语句的什么位置?
group by必须放到WHERE语句之后
--分组(结果集不再是表数据,而是分组的组数据,每一行代表一个组)--------
--SELECT * FROM students GROUP BY cid
--再次强调:分组的结果集是组数据
SELECT cid,count(id) AS 人数 FROM students GROUP BY cid
--分组查询的结果集里的列,必须是group by 的列名或者用聚合函数求的的列值
SELECT age,count(id) AS 人数,max(id) as 每个组id最大的值 FROM students GROUP BY age
--分组:最后一次强调,查询的结果是组信息,不是表信息。组信息是程序员自己求出来的!!!
-- 也就是说,查询的列,必须是组的聚合(行数,最大值,最小值,平均值)信息。
--按照多个条件分组(就可以看成是按照多个列的组合值来分组--也就是看组合值是否有相同的,如果有,就算成一个组)
--按照年龄和性别分组
SELECT age,gender FROM students GROUP BY age,gender
SELECT * FROM students
--按照班级和年龄分组
SELECT cid FROM students GROUP BY cid
SELECT cid,age FROM students GROUP BY cid,age
--先查询满足条件的人,再分组 一般不用这个方法!!!
--SELECT age FROM students WHERE age>22 GROUP BY age
24、having和where的区别是什么?
where是先查询满足条件,再分组;having是先分组再筛选
a)注意Having中不能使用未参与分组的列,Having不能替代where。作用不一样,Having是对组进行过滤。
b)Having 是Group By的条件对分组后的数据进行筛选(与Where类似,都是筛选,只不过having是用来筛选分组后的组的。)
c)在Where中不能使用聚合函数,必须使用Having,Having要位于Group By之后。
d)Having的使用几乎是与where一样的,也可以用in。
Having count(*) in (5,8,10)
--having 分组之后筛选条件
--先分组,然后再筛选满足条件的组
SELECT age,count(id)AS 总人数 FROM students GROUP BY age HAVING age>22 and COUNT(id) >3
--注意:常见错误
--此举报错,因为having是在select之前执行,也就是说执行having的时候压根儿就没有总人数这个列!
--SELECT age,count(id)AS 总人数FROM students GROUP BY age HAVING age>22 and 总人数>3
SELECT age,count(id)AS 总人数 FROM students GROUP BY age HAVING age>22 and COUNT(id) >3 order by 总人数 desc
25、SQL语句的执行顺序
5>…Select 5-1>选择列,5-2>distinct,5-3>top
1>…From 表
2>…Where 条件
3>…Group by 列
4>…Having 对组来做筛选条件
6>…Order by 列
26、类型转换
--类型转换
SELECT '您的班级编号'+ 1 报错!!!
SELECT convert(INT,'123')+ 1 不会报错!!!因为转成的是数字!!!
SELECT cast('123' as int)+ 1
--补充截取方法
SELECT left('abcd',2)
SELECT right('abcd',2)
--convert来转日期
SELECT getdate()
SELECT CONVERT(VARCHAR,GETDATE(),110)
SELECT CONVERT(VARCHAR,GETDATE(),102)
SELECT CONVERT(VARCHAR,GETDATE(),113)
27、Union集合运算符的基本原则是什么?
每个结果集必须有相同的列数;每个结果集的列必须类型相容
c)联合:将多个结果集合并成一个结果集。union(去除重复,相当于默认应用了distinct)、union all
d)Union因为要进行重复值扫描,所以效率低,因此如果不是确定要合并重复行,那么就用UNION ALL
--Union联合结果集
--联合结果集时要注意列的数量和数据类型必须一致或兼容
--union会自动合并相同数据行
SELECT * FROM Classes 有7条内容
UNION
SELECT * FROM Classes2 有1条内容
输出显示为合并成8条
--union all 联合结果集,不会去除重复行
SELECT * FROM Classes
UNION ALL
SELECT * FROM Classes2
SELECT * FROM students
UNION
sELECT NULL,NULL,'年龄统计',sum(age),null,null,null,null FROM students
--Union因为要进行重复值扫描,所以效率低,因此如果不是确定要合并重复行,那么就用UNION ALL
SELECT [sid] ,[name] ,[age] ,[sex] ,[address] FROM [TestDB].[dbo].[UserInfo] UNION ALL SELECT [sid] ,[name] ,[age] ,[sex] ,[address] FROM [TestDB].[dbo].[UserInfoTest]