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]
View Code

相关文章:

  • 2021-07-17
  • 2022-01-25
  • 2021-09-19
  • 2021-12-23
  • 2021-09-02
  • 2022-12-23
猜你喜欢
  • 2021-09-04
  • 2021-05-19
  • 2021-12-29
  • 2022-12-23
  • 2022-12-23
  • 2021-12-29
  • 2022-01-17
相关资源
相似解决方案