精华内容
下载资源
问答
  • sql语句结构化查询语言(StructuredQueryLanguage)缩写为SQL。结构化查询语言是一种数据库查询和编程语言,用于访问数据以及查询,更新和管理关系数据库系统;程序功能创建数据库CREATEDATABASEdatabase-name删除...

    sql语句

    结构化查询语言(StructuredQueryLanguage)缩写为SQL。结构化查询语言是一种数据库查询和编程语言,用于访问数据以及查询,更新和管理关系数据库系统;

    程序功能

    创建数据库

    CREATEDATABASEdatabase-name

    删除数据库

    dropdatabasedbname

    创建新表

    createtabletabname(col1type1[notnull][primarykey],col2type2[notnull],..)

    删除新表

    droptabletabname

    增加一个列

    Altertabletabnameaddcolumncoltype

    添加主键

    Altertabletabnameaddprimarykey(col)

    删除主键

    Altertabletabnamedropprimarykey(col)

    创建索引

    create[unique]indexidxnameontabname(col….)

    删除索引

    dropindexidxname

    创建视图

    createviewviewnameasselectstatement

    删除视图

    dropviewviewname

    8a19f937695167af0af345bf0b1bccd4.png

    sql数据库查询语句大全

    常用sql查询语句如下所示:

    一、简单查询语句

    1.查看表结构

    SQL>DESCemp;

    2.查询所有列

    SQL>SELECT*FROMemp;

    3.查询指定列

    SQL>SELECTempmo,ename,mgrFROMemp;

    SQL>SELECTDISTINCTmgrFROMemp;只显示结果不同的项

    4.查询指定行

    SQL>SELECT*FROMempWHEREjob=’CLERK’;

    5.使用算术表达式

    SQL>SELECTename,sal*13+nvl(comm,0)FROMemp;

    nvl(comm,1)的意思是,如果comm中有值,则nvl(comm,1)=comm;comm中无值,则nvl(comm,1)=0。

    SQL>SELECTename,sal*13+nvl(comm,0)year_salFROMemp;(year_sal为别名,可按别名排序)

    SQL>SELECT*FROMempWHEREhiredate>’01-1月-82′;

    6.使用like操作符(%,_)

    %表示一个或多个字符,_表示一个字符,[charlist]表示字符列中的任何单一字符,[^charlist]或者[!charlist]不在字符列中的任何单一字符。

    SQL>SELECT*FROMempWHEREenamelike’S__T%’;

    7.在where条件中使用In

    SQL>SELECT*FROMempWHEREjobIN(‘CLERK’,’ANALYST’);

    8.查询字段内容为空/非空的语句

    SQL>SELECT*FROMempWHEREmgrIS/ISNOTNULL;

    9.使用逻辑操作符号

    SQL>SELECT*FROMempWHERE(sal>500orjob=’MANAGE’)andenamelike’J%’;

    10.将查询结果按字段的值进行排序

    SQL>SELECT*FROMempORDERBYdeptno,salDESC;(按部门升序,并按薪酬降序)

    二、复杂查询

    1.数据分组(max,min,avg,sum,count)

    SQL>SELECTMAX(sal),MIN(age),AVG(sal),SUM(sal)fromemp;

    SQL>SELECT*FROMempwheresal=(SELECTMAX(sal)fromemp));

    SQL>SELECCOUNT(*)FROMemp;

    2.groupby(用于对查询结果的分组统计)和having子句(用于限制分组显示结果)

    SQL>SELECTdeptno,MAX(sal),AVG(sal)FROMempGROUPBYdeptno;

    SQL>SELECTdeptno,job,AVG(sal),MIN(sal)FROMempgroupbydeptno,jobhavingAVG(sal)<2000;

    对于数据分组的总结:

    a.分组函数只能出现在选择列表、having、orderby子句中(不能出现在where中)

    b.如果select语句中同时包含有groupby,having,orderby,那么它们的顺序是groupby,having,orderby。

    c.在选择列中如果有列、表达式和分组函数,那么这些列和表达式必须出现在groupby子句中,否则就是会出错。

    使用groupby不是使用having的前提条件。

    3.多表查询

    SQL>SELECTe.name,e.sal,d.dnameFROMempe,deptdWHEREe.deptno=d.deptnoorderbyd.deptno;

    SQL>SELECTe.ename,e.sal,s.gradeFROMempe,salgradesWHERe.salBETWEENs.losalANDs.hisal;

    4.自连接(指同一张表的连接查询)

    SQL>SELECTer.ename,ee.enamemgr_namefromemper,empeewhereer.mgr=ee.empno;

    5.子查询(嵌入到其他sql语句中的select语句,也叫嵌套查询)

    5.1单行子查询

    SQL>SELECTenameFROMempWHEREdeptno=(SELECTdeptnoFROMempwhereename=’SMITH’);查询表中与smith同部门的人员名字。因为返回结果只有一行,所以用“=”连接子查询语句

    5.2多行子查询

    SQL>SELECTename,job,sal,deptnofromempWHEREjobIN(SELECTDISTINCTjobFROMempWHEREdeptno=10);查询表中与部门号为10的工作相同的员工的姓名、工作、薪水、部门号。因为返回结果有多行,所以用“IN”连接子查询语句。

    in与exists的区别:exists()后面的子查询被称做相关子查询,它是不返回列表的值的。只是返回一个ture或false的结果,其运行方式是先运行主查询一次,再去子查询里查询与其对应的结果。如果是ture则输出,反之则不输出。再根据主查询中的每一行去子查询里去查询。in()后面的子查询,是返回结果集的,换句话说执行次序和exists()不一样。子查询先产生结果集,然后主查询再去结果集里去找符合要求的字段列表去。符合要求的输出,反之则不输出。

    5.3使用ALL

    SQL>SELECTename,sal,deptnoFROMempWHEREsal>ALL(SELECTsalFROMempWHEREdeptno=30);或SQL>SELECTename,sal,deptnoFROMempWHEREsal>(SELECTMAX(sal)FROMempWHEREdeptno=30);查询工资比部门号为30号的所有员工工资都高的员工的姓名、薪水和部门号。以上两个语句在功能上是一样的,但执行效率上,函数会高得多。

    5.4使用ANY

    SQL>SELECTename,sal,deptnoFROMempWHEREsal>ANY(SELECTsalFROMempWHEREdeptno=30);或SQL>SELECTename,sal,deptnoFROMempWHEREsal>(SELECTMIN(sal)FROMempWHEREdeptno=30);查询工资比部门号为30号的任意一个员工工资高(只要比某一员工工资高即可)的员工的姓名、薪水和部门号。以上两个语句在功能上是一样的,但执行效率上,函数会高得多。

    5.5多列子查询

    SQL>SELECT*FROMempWHERE(job,deptno)=(SELECTjob,deptnoFROMempWHEREename=’SMITH’);

    5.6在from子句中使用子查询

    SQL>SELECTemp.deptno,emp.ename,emp.sal,t_avgsal.avgsalFROMemp,(SELECTemp.deptno,avg(emp.sal)avgsalFROMempGROUPBYemp.deptno)t_avgsalwhereemp.deptno=t_avgsal.deptnoANDemp.sal>t_avgsal.avgsalORDERBYemp.deptno;

    5.7分页查询

    数据库的每行数据都有一个对应的行号,称为rownum.

    SQL>SELECTa2.*FROM(SELECTa1.*,ROWNUMrnFROM(SELECT*FROMempORDERBYsal)a1WHEREROWNUM<=10)a2WHERErn>=6;

    指定查询列、查询结果排序等,都只需要修改最里层的子查询即可。

    5.8用查询结果创建新表

    SQL>CREATETABLEmytable(id,name,sal,job,deptno)ASSELECTempno,ename,sal,job,deptnoFROMemp;

    5.9合并查询(union并集,intersect交集,unionall并集+交集,minus差集)

    SQL>SELECTename,sal,jobFROMempWHEREsal>2500UNION(INTERSECT/UNIONALL/MINUS)SELECTename,sal,jobFROMempWHEREjob=’MANAGER’;

    合并查询的执行效率远高于and,or等逻辑查询。

    5.10使用子查询插入数据

    SQL>CREATETABLEmyEmp(empIDnumber(4),namevarchar2(20),salnumber(6),jobvarchar2(10),deptnumber(2));先建一张空表;

    SQL>INSERTINTOmyEmp(empID,name,sal,job,dept)SELECTempno,ename,sal,job,deptnoFROMempWHEREdeptno=10;再将emp表中部门号为10的数据插入到新表myEmp中,实现数据的批量查询。

    5.11使用了查询更新表中的数据

    SQL>UPDATEempSET(job,sal,comm)=(SELECTjob,sal,commFROMempwhereename=’SMITH’)WHEREename=’SCOTT’;

    以上所述就是本文给大家介绍的日常收集常用SQL查询语句大全,希望大家喜欢。

    展开全文
  • 数据库查询语句 *****mysql 多表关系 查询语句 索引添加数据补充:将一个查询结果插入到另一张表中create table student(name char(10),gender int);insert into student values("jack",1);insert into student ...

    数据库查询语句 *****

    mysql 多表关系 查询语句 索引

    添加数据补充:

    将一个查询结果插入到另一张表中

    create table student(name char(10),gender int);

    insert into student values("jack",1);

    insert into student values("rose",0);

    create table student_man(name char(10),gender int);

    insert into student_man select * from student where gender = 1;

    所有的select 关键字

    select distinct * from table_name

    where

    group by

    having

    order by

    limit a,b

    必须存在的有:

    select

    * 可以换成任意的一个或多个字段名称

    from

    table_name

    #注意: 关键字的顺序是固定的不能随意变化

    where 条件

    select * from table_name

    where

    where 后面可以是

    1.比较运算符

    > < >= <= = !=

    2.成员运算符

    in not in 后面是一个set

    3.逻辑运算符

    and or not

    not 要放在表达式的前面 and 和 or 放到两个表达式中间

    4.模糊查询

    like

    % 表示 任意个数的任意字符

    _ 表示一个任意字符

    #

    请查询 姓小的 数学小于 80 分 并且 英语 > 20分 的人的 数学成绩

    select math,name from stu where math < 80 and english > 20 and name like "小%";

    distinct 去除重复记录

    select distinct * from stu;

    # 注意仅当查询结果中所有字段全都相同时 才算重复的记录

    指定字段

    1.星号表示所有字段

    2.手动指定需要查询的字段

    3.还可也是四则运算

    4.聚合函数

    #请查询 英语及格的人的 平均分

    select name,(math+english) / 2 平均分 from stu where english >= 60;

    取别名

    select name,math+english as 总分 from stu where name = "赵云";

    as 可以省略

    统计函数

    ​也称之为聚合函数

    ​将一堆数据经过计算得出一个结果

    求和 sum(字段名)

    平均数 avg(字段名)

    最大值 max(字段名)

    最小值 min(字段名)

    个数 count(字段名) # 字段名称可以使用* 代替 另外如果字段为空会被忽略

    可以用在 字段的位置 或是分组的后面

    例如: 查询所有人的平均工资

    select avg(salary) from emp

    错误案例: 查询工资最高的人的姓名

    select name,max(salary) from emp;

    #默认显示的第一个name 因为name有很多行 而max(salary) 只有一行 两列的行数不匹配

    # 不应该这么写 逻辑错误

    select name from emp where salary = max(salary);

    # 报错

    # 原因: 伪代码

    for line in file:

    if salary = max(salary) #

    #分析 where 读取满足条件的一行 ,max()先要拿到所有数据 才能求最大值,

    #这里由于读取没有完成所有无法 求出最大值

    #结论 where 后面不能使用聚合函数

    group by

    group 是分组的意思 即将一个整体按照某个特征或依据来分为不同的部分

    为什么要分组 分组是为了统计,例如统计男性有几个 女性有几个

    语法:

    select xxx from table_name group by 字段名称;

    需求:统计每个性别有几个人

    select sex,count(*) from emp group by sex;

    需求: 查询每个性别有几个 并且显示名字

    select name,sex,count(*) from emp group by sex;

    # mysql 5.6下 查询的结果是name仅显示该分组下的第一个

    # 5.7以上则直接报错 ,5.6也可以手动开启这个功能

    # 我们可以用group_concat 将分组之外的字段 做一个拼接 ,但是这是没有意义

    # 如果要查询某个性别下的所有信息 直接使用where 即可

    #结论: 只有出现在了group by 后面得字段才能出现在select的后面

    having

    ​用于过滤,但是与where不同的是,having使用在分组之后

    案例:

    # 求出平均工资大于500的部门信息

    select dept,avg(salary) from emp group by dept having avg(salary) > 5000;

    #查询 部门人数少于3的 部门名称 人员名称 人员个数

    select dept,group_concat(name),count(*) from emp group by dept having count(*) < 3;

    order

    根据某个字段排序

    语法:

    select * from table_name order by 字段名称;

    # 默认是升序

    # 改为降序

    select * from table_name order by 字段名称 desc;

    # 多个字段 第一个相同在按照第二个 asc 表示升序

    select * from table_name order by 字段名称1 desc,字段名称2 asc;

    案例:

    select * from emp order by salary desc,id desc;

    limit (主要用于数据分页)

    用于限制要显示的记录数量

    语法1:

    select * from table_name limit 个数;

    语法2:

    select * from table_name limit 起始位置,个数;

    # 查询前三条

    select * from emp limit 3;

    # 从第三条开始 查询3条 3-5

    select * from emp limit 2,3;

    # 注意:起始位置 从0开始

    # 经典的使用场景:分页显示

    1.每一页显示的条数 a = 3

    2.明确当前页数 b = 2

    3.计算起始位置 c = (b-1) * a

    select * from emp limit 0,3;

    select * from emp limit 3,3;

    select * from emp limit 6,3;

    # django 提供了现成的分页组件 但是它是先查询所有数据 丢到列表中 再取出数据 这样如果数据量太大可能会有问题

    子查询

    ​将一个查询语句的结果作为另一个查询语句的条件或是数据来源

    ​当我们一次性查不到想要数据时就需要使用子查询

    in 关键字子查询

    ​当内层查询 (括号内的) 结果会有多个结果时, 不能使用 = 必须是in ,另外子查询必须只能包含一列数据

    ​需求: 指定一个部门名称,获取改部门下的所有员工信息

    1.查询出 平均年龄 大于25的部门编号

    select dept_id from emp group by dept_id having avg(age) > 25;

    2.再根据编号查询部门的名称

    select name from dept where id in (select dept_id from emp group by dept_id having avg(age) > 25);

    子查询的思路:

    1.要分析 查到最终的数据 到底有哪些步骤

    2.根据步骤写出对应的sql语句

    3.把上一个步骤的sql语句丢到下一个sql语句中作为条件

    exists 关键字子查询

    当内层查询 有结果时 外层才会执行

    案例:

    select* from dept where exists (select * from dept where id = 1);

    # 由于内层查询产生了结果 所以 执行了外层查询dept的所有数据

    多表查询

    笛卡尔积查询

    select * from table1,table2,......

    # 笛卡尔积查询的结果会出现大量的错误数据即,数据关联关系错误!

    添加过滤条件 从表外键值 等于 主表的主键值

    # 并且会产生重复的字段信息 例如员工里的 部门编号 和 部门表的id字段

    在select 后指定需要查询的字段名称

    案例:

    select dept.name 部门 ,dept.id 部门编号,emp.name 姓名,emp.id 员工编号,sex from emp ,dept where dept.id = dept_id;

    内连接查询:

    本质上就是笛卡尔积查询

    语法:

    select * from table1 inner join table2;

    案例:

    select * from emp inner join dept where dept_id = dept.id;

    inner可以省略

    select * from emp join dept where dept_id = dept.id;

    左外连接查询

    左边的表无论是否能够匹配都要完整显示

    右边的仅展示匹配上的记录

    需求: 要查询所有员工以及其所属的部门信息

    select * from emp left join dept on dept_id = dept.id;

    注意: 在外连接查询中不能使用where 关键字 必须使用on专门来做表的对应关系

    右外连接查询

    右边的表无论是否能够匹配都要完整显示

    左边的仅展示匹配上的记录

    需求: 要查询所有部门以及其对应的员工信息

    select * from emp right join dept on dept_id = dept.id;

    全外连接查询

    无论是否匹配成功 两边表的数据都要全部显示

    需求:查询所有员工与所有部门的对应关系

    select * from emp full join dept on dept_id = dept.id;

    注意:mysql不支持全外连接

    我们可以将 左外连接查询的结果 和 右外连接查询的结果 做一个合并

    select * from emp left join dept on dept_id = dept.id

    union

    select * from emp right join dept on dept_id = dept.id;

    union的用法:

    select * from emp

    union

    select * from emp;

    # union将自动去除重复的记录

    # union all 不去重复

    select sex,name from emp

    union

    select * from dept;

    # 注意 union 必须保证两个查询结果 列数相同 一般用在多个结果结构完全一致时

    总结: 外连接查询 查到的是没有对应关系的记录,但是这样的数据原本就是有问题的,所以最常用的是内连接查询

    内连接表示 只显示匹配成功的记录

    外连接 没有匹配成功的也要实现

    多表查询案例:

    create table stu(id int primary key auto_increment,name char(10));

    create table tea(id int primary key auto_increment,name char(10));

    create table tsr(id int primary key auto_increment,t_id int,s_id int,

    foreign key(s_id) references stu(id),

    foreign key(t_id) references tea(id));

    insert into stu values(null,"张三"),(null,"李四");

    insert into tea values(null,"egon"),(null,"wer");

    insert into tsr values(null,1,1),(null,1,2),(null,2,2);

    #egon老师教过哪些人?

    select tea.name,stu.name from tea join tsr join stu

    on

    tea.id = t_id and stu.id = s_id

    where tea.name = "egon";

    # 子查询实现

    select * from stu where id in (select s_id from tsr where t_id = (select id from tea where name = "egon"));

    小结:

    select [distinct] *|字段名|四则运算|函数 from table_name

    where 比较运算符 逻辑运算符 成员运算符 区间 between and 模糊匹配 like exists regexp 正则匹配

    group by

    having 通常根聚合函数 count sum max min avg

    order by

    limit a,b

    子查询

    多表查询

    笛卡尔积 内连接 外连接

    内连接最常用

    通常一个需求 可以用连表 也可以 用子查询

    展开全文
  • 数据库查询语句面试

    2021-03-15 14:26:47
    Student(S#,Sname,Sage,Ssex)学生表Course(C#,Cname,T#)课程表SC(S#,C#,score)成绩表Teacher(T#,Tname)教师表问题:1、查询“001”课程比“002”课程成绩高的所有学生的学号;selecta.S#from(selects#,...

    Student(S#,Sname,Sage,Ssex) 学生表

    Course(C#,Cname,T#) 课程表

    SC(S#,C#,score) 成绩表

    Teacher(T#,Tname) 教师表

    问题:

    1、查询“001”课程比“002”课程成绩高的所有学生的学号;

    select a.S#

    from (select s#,score from SC where C#=’001′) a,

    (select s#,score from SC where C#=’002′) b

    where a.score>b.score and a.s#=b.s#;

    2、查询平均成绩大于60分的同学的学号和平均成绩;

    select S#,avg(score)

    from sc

    group by S# having avg(score) >60;

    3、查询所有同学的学号、姓名、选课数、总成绩;

    select Student.S#,Student.Sname,count(SC.C#),sum(score)

    from Student left Outer join SC on Student.S#=SC.S#

    group by Student.S#,Sname

    4、查询姓“李”的老师的个数;

    select count(distinct(Tname))

    from Teacher

    where Tname like ‘李%’;

    5、查询没学过“叶平”老师课的同学的学号、姓名;

    select Student.S#,Student.Sname

    from Student

    where S# not in (select distinct( SC.S#) from SC,Course,Teacher where SC.C#=Course.C# and Teacher.T#=Course.T# and Teacher.Tname=’叶平’);

    6、查询学过“001”并且也学过编号“002”课程的同学的学号、姓名;

    select Student.S#,Student.Sname

    from Student,SC

    where Student.S#=SC.S# and SC.C#=’001′and exists( Select * from SC as SC_2 where SC_2.S#=SC.S# and SC_2.C#=’002′);

    7、查询学过“叶平”老师所教的所有课的同学的学号、姓名;

    select S#,Sname

    from Student

    where S# in

    (select S#

    from SC ,Course ,Teacher

    where SC.C#=Course.C# and Teacher.T#=Course.T# and Teacher.Tname=’叶平’ group by S# having count(SC.C#)=(select count(C#) from Course,Teacher where Teacher.T#=Course.T# and Tname=’叶平’));

    8、查询所有课程成绩小于60分的同学的学号、姓名;

    select S#,Sname

    from Student

    where S# not in (select Student.S# from Student,SC where S.S#=SC.S# and score>60);

    9、查询没有学全所有课的同学的学号、姓名;

    select Student.S#,Student.Sname

    from Student,SC

    where Student.S#=SC.S#

    group by Student.S#,Student.Sname having count(C#) 

    10、查询至少有一门课与学号为“1001”的同学所学相同的同学的学号和姓名;

    select S#,Sname

    from Student,SC

    where Student.S#=SC.S# and C# in (select C# from SC where S#='1001');

    11、删除学习“叶平”老师课的SC表记录;

    Delect SC

    from course ,Teacher

    where Course.C#=SC.C# and Course.T#= Teacher.T# and Tname='叶平';

    12、查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,最低分

    SELECT L.C# 课程ID,L.score 最高分,R.score 最低分

    FROM SC L ,SC R

    WHERE L.C# = R.C#

    and

    L.score = (SELECT MAX(IL.score)

    FROM SC IL,Student IM

    WHERE IL.C# = L.C# and IM.S#=IL.S#

    GROUP BY IL.C#)

    and

    R.Score = (SELECT MIN(IR.score)

    FROM SC IR

    WHERE IR.C# = R.C#

    GROUP BY IR.C# );

    13、查询学生平均成绩及其名次

    SELECT 1+(SELECT COUNT( distinct 平均成绩)

    FROM (SELECT S#,AVG(score) 平均成绩

    FROM SC

    GROUP BY S# ) T1

    WHERE 平均成绩 > T2.平均成绩) 名次, S# 学生学号,平均成绩

    FROM (SELECT S#,AVG(score) 平均成绩 FROM SC GROUP BY S# ) T2

    ORDER BY 平均成绩 desc;

    14、查询各科成绩前三名的记录:(不考虑成绩并列情况)

    SELECT t1.S# as 学生ID,t1.C# as 课程ID,Score as 分数

    FROM SC t1

    WHERE score IN (SELECT TOP 3 score

    FROM SC

    WHERE t1.C#= C#

    ORDER BY score DESC)

    ORDER BY t1.C#;

    15、查询每门功成绩最好的前两名

    SELECT t1.S# as 学生ID,t1.C# as 课程ID,Score as 分数

    FROM SC t1

    WHERE score IN (SELECT TOP 2 score

    FROM SC

    WHERE t1.C#= C#

    ORDER BY score DESC )

    ORDER BY t1.C#;

    补充:

    已经知道原表

    year salary

    ——————

    2000 1000

    2001 2000

    2002 3000

    2003 4000

    解:

    select b.year,sum(a.salary)

    from salary a,salary b

    where a.year<=b.year

    group by b.year

    order by b.year;

    在面试过程中多次碰到一道SQL查询的题目,查询A(ID,Name)表中第31至40条记录,ID作为主键可能是不是连续增长的列,完整的查询语句如下:

    方法一:

    select top 10 *

    from A

    where ID >(select max(ID) from (select top 30 ID from A order by ID ) T) order by ID

    方法二:

    select top 10 *

    from A

    where ID not In (select top 30 ID from A order by ID)

    order by ID

    数据库面试题 1

    1. 在一个查询中,使用哪一个关键字能够除去重复列值?

    答案:使用distinct关键字

    2. 什么是快照?它的作用是什么?

    答案:快照Snapshot是一个文件系统在特定时间里的镜像,对于在线实时数据备份非常有用。快照对于拥有不能停止的应用或具有常打开文件的文件系统的备份非常重要。对于只能提供一个非常短的备份时间而言,快照能保证系统的完整性。

    3. 解释存储过程和触发器

    答案:

    存储过程是一组Transact-SQL语句,在一次编译后可以执行多次。因为不必重新编译Transact-SQL语句,所以执行存储过程可以提高性能。

    触发器是一种特殊类型的存储过程,不由用户直接调用。创建触发器时会对其进行定义,以便在对特定表或列作特定类型的数据修改时执行。

    4. SQL Server是否支持行级锁,有什么好处?

    答案:支持动态行级锁定

    SQL Server 2000动态地将查询所引用的每一个表的锁定粒度调整到合适的级别。当查询所引用的少数几行分散在一个大型表中时,优化数据并行访问的最佳办法是使用粒度锁,如行锁。但是,如果查询引用的是一个表中的大多数行或所有行,优化数据并行访问的最佳办法可以是锁定整个表,以尽量减少锁定开销并尽快完成查询。

    SQL Serve 2000通过为每个查询中的每个表选择适当的锁定级别,在总体上优化了数据并发访问。对于一个查询,如果只引用一个大型表中的几行,则数据库引擎可以使用行级锁定;如果引用一个大型表的几页中的多行,则使用页级锁定;如果引用一个小型表中的所有行,则使用表级锁定。

    5. 数据库日志干什么用,数据库日志满的时候再查询数据库时会出现什么情况。

    答案:每个数据库都有事务日志,用以记录所有事务和每个事务对数据库所做的修改。

    6. 存储过程和函数的区别?

    答案:存储过程是用户定义的一系列SQL语句的集合,涉及特定表或其它对象的任务,用户可以调用存储过程,而函数通常是数据库已定义的方法,它接收参数并返回某种类型的值并且不涉及特定用户表

    7. 事务是什么?

    答案:事务是作为一个逻辑单元执行的一系列操作,一个逻辑工作单元必须有四个属性,称为 ACID(原子性、一致性、隔离性和持久性)属性,只有这样才能成为一个事务:

    (1) 原子性

    事务必须是原子工作单元;对于其数据修改,要么全都执行,要么全都不执行。

    (2) 一致性

    事务在完成时,必须使所有的数据都保持一致状态。在相关数据库中,所有规则都必须应用于事务的修改,以保持所有数据的完整性。事务结束时,所有的内部数据结构(如 B 树索引或双向链表)都必须是正确的。

    (3) 隔离性

    由并发事务所作的修改必须与任何其它并发事务所作的修改隔离。事务查看数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看中间状态的数据。这称为可串行性,因为它能够重新装载起始数据,并且重播一系列事务,以使数据结束时的状态与原始事务执行的状态相同。

    (4) 持久性

    事务完成之后,它对于系统的影响是永久性的。该修改即使出现系统故障也将一直保持。

    8. 游标的作用?如何知道游标已经到了最后?

    答案:游标用于定位结果集的行,通过判断全局变量@@FETCH_STATUS可以判断是否到了最后,通常此变量不等于0表示出错或到了最后。

    9. 触发器分为事前触发和事后触发,这两种触发有何区别?语句级触发和行级触发有何区别?

    答案:

    事前触发器运行于触发事件发生之前,而事后触发器运行于触发事件发生之后。通常事前触发器可以获取事件之前和新的字段值。

    语句级触发器可以在语句执行前或后执行,而行级触发在触发器所影响的每一行触发一次。

    10. 解决死锁的方法有哪些?

    答案:

    解决手段一:SQL Server自动检测和消除死锁

    解决手段二:设置死锁优先级

    解决手段三:设置锁定超时

    解决手段四:使用更新锁避免死锁

    11. 提高数据库运行效率的办法有哪些?

    答案:在给定的系统硬件和系统软件条件下,提高数据库系统的运行效率的办法是:

    (1) 在数据库物理设计时,降低范式,增加冗余, 少用触发器, 多用存储过程。

    (2) 当计算非常复杂、而且记录条数非常巨大时(例如一千万条),复杂计算要先在数据库外面,以文件系统方式用C++语言计算处理完成之后,最后才入库追加到表中去。这是电信计费系统设计的经验。

    (3) 发现某个表的记录太多,例如超过一千万条,则要对该表进行水平分割。水平分割的做法是,以该表主键PK的某个值为界线,将该表的记录水平分割为两个表。若发现某个表的字段太多,例如超过八十个,则垂直分割该表,将原来的一个表分解为两个表。

    (4) 对数据库管理系统DBMS进行系统优化,即优化各种系统参数,如缓冲区个数。

    (5) 在使用面向数据的SQL语言进行程序设计时,尽量采取优化算法。总之,要提高数据库的运行效率,必须从数据库系统级优化、数据库设计级优化、程序实现级优化,这三个层次上同时下功夫。

    12. 通俗地理解三个范式

    答案:通俗地理解三个范式,对于数据库设计大有好处。在数据库设计中,为了更好地应用三个范式,就必须通俗地理解三个范式(通俗地理解是够用的理解,并不是最科学最准确的理解):

    第一范式:1NF是对属性的原子性约束,要求属性具有原子性,不可再分解; 第二范式:2NF是对记录的惟一性约束,要求记录有惟一标识,即实体的惟

    一性;

    第三范式:3NF是对字段冗余性的约束,即任何字段不能由其他字段派生出来,它要求字段没有冗余。没有冗余的数据库设计可以做到。但是,没有冗余的数据库未必是最好的数据库,有时为了提高运行效率,就必须降低范式标准,适当保留冗余数据。具体做法是:在概念数据模型设计时遵守第三范式,降低范式标准的工作放到物理数据模型设计时考虑。降低范式就是增加字段,允许冗余。

    13. 简述存储过程的优缺点

    优点:

    1. 更快的执行速度:存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度;

    2. 与事务的结合,提供更好的解决方案:当对数据库进行复杂操作时(如对多个表进行Update、Insert、Query和Delete时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用;

    3. 支持代码重用:存储过程可以重复使用,可减少数据库开发人员的工作量;4. 安全性高:可设定只有某此用户才具有对指定存储过程的使用权。

    缺点:

    1. 如果更改范围大到需要对输入存储过程的参数进行更改,或者要更改由其返回的数据,则您仍需要更新程序集中的代码以添加参数、更新 GetValue() 调用,等等,这时候估计比较繁琐了。

    2. 可移植性差由于存储过程将应用程序绑定到 SQL Server,因此使用存储过程封装业务逻辑将限制应用程序的可移植性。如果应用程序的可移植性在您的环境中非常重要,则将业务逻辑封装在不特定于 RDBMS 的中间层中可能是一个更佳的选择。

    14. 主键和唯一索引有什么区别?

    答案:

    相同点:它们都属于实体完整性约束。

    不同点:

    (1) 唯一性约束所在的列允许空值,但是主键约束所在的列不允许空值。

    (2) 可以把唯一性约束放在一个或者多个列上,这些列或列的组合必须有唯一的。但是,唯一性约束所在的列并不是表的主键列。

    (3) 唯一性约束强制在指定的列上创建一个唯一性索引。在默认情况下,创建唯一性的非聚簇索引,但是,也可以指定所创建的索引是聚簇索引。

    (4) 建立主键的目的是让外键来引用。

    (5) 一个表最多只有一个主键,但可以有很多唯一键。

    15. 简述索引存取的方法的作用和建立索引的原则

    作用:加快查询速度。

    原则:

    (1) 如果某属性或属性组经常出现在查询条件中,考虑为该属性或属性组建立索引;

    (2) 如果某个属性常作为最大值和最小值等聚集函数的参数,考虑为该属性建立索引;

    (3) 如果某属性经常出现在连接操作的连接条件中,考虑为该属性或属性组建立索引;

    16. 简述数据库的设计过程

    数据库设计分为五个阶段:

    需求分析:主要是准确收集用户信息需求和处理需求,并对收集的结果进行整理和分析,形成需求说明。

    概念结构设计:对用户需求进行综合、归纳、抽象,形成一个与与具体的DBMS无关概念模型(一般为ER模型)。

    逻辑结构设计:将概念结构设计的概念模型转化为某个特定的DBMS所支持的数据模型,建立数据库逻辑模式,并对其进行优化,同时为各种用户和应用设计外模式。

    物理结构设计:为设计好的逻辑模型选择物理结构,包括存储结构和存取方法等,建立数据库物理模式。

    实施和维护:实施就是使用DLL语言建立数据库模式,将实际数据载入数据库,建立真正的数据库。维护阶段是对运行中的数据库进行评价、调整和修改。

    17. 什么是内存泄漏?

    答案:一般我们所说的内存泄漏指的是堆内存的泄漏。堆内存是程序从堆中为其分配的,大小任意的,使用完后要显示释放内存。当应用程序用关键字new等创建对象时,就从堆中为它分配一块内存,使用完后程序调用free或者delete释放该内存,否则就说该内存就不能被使用,我们就说该内存被泄漏了。

    18. 什么是基本表?什么是视图?

    答案:基本表是本身独立存在的表,在 SQL 中一个关系就对应一个表。

    视图是从一个或几个基本表导出的表。视图本身不独立存储在数据库中,是一个虚表

    19. 试述视图的优点

    (1) 视图能够简化用户的操作

    (2) 视图使用户能以多种角度看待同一数据;

    (3) 视图为数据库提供了一定程度的逻辑独立性;

    (4) 视图能够对机密数据提供安全保护。

    20. 所有的视图是否都可以更新?为什么?

    答案:不是。

    视图是不实际存储数据的虚表,因此对视图的更新,最终要转换为对基本表的更新。

    因为有些视图的更新不能惟一有意义地转换成对相应基本表的更新,所以,并不是所有的视图都是可更新的。

    21. 哪类视图是可以更新的?哪类视图是不可更新的?各举一例说明。

    答案:基本表的行列子集视图一般是可更新的。若视图的属性来自集函数、表达式,则该视图肯定是不可以更新的。

    22. 维护数据库的完整性、一致性、你喜欢用触发器还是自写业务逻辑?为什么?

    答案:尽可能用约束(包括CHECK、主键、唯一键、外键、非空字段)实现,这种方式的效率最好;其次用触发器,这种方式可以保证无论何种业务系统访问数据库都能维持数据库的完整性、一致性;最后再考虑用自写业务逻辑实现,但这种方式效率最低、编程最复杂,当为下下之策。

    23. 在为视图创建索引前,视图本身必须满足哪些条件?

    (1) 视图以及视图中引用的所有表都必须在同一数据库中,并具有同一个所有者

    (2) 索引视图无需包含要供优化器使用的查询中引用的所有表。

    (3) 必须先为视图创建唯一群集索引,然后才可以创建其它索引。

    (4) 创建基表、视图和索引以及修改基表和视图中的数据时,必须正确设置某些 SET 选项(在本文档的后文中讨论)。另外,如果这些 SET 选项正确,查询优化器将不考虑索引视图。

    (5) 视图必须使用架构绑定创建,视图中引用的任何用户定义的函数必须使用 SCHEMABINDING 选项创建。

    (6) 另外,还要求有一定的磁盘空间来存放由索引视图定义的数据。

    24. 什么是SQL Server的确定性函数和不确定性函数?

    答案:只要使用特定的输入值集并且数据库具有相同的状态,不管何时调用,始终都能范围相同结果的函数叫确定性函数。几十访问的数据库的状态不变,每次书用特定的输入值都可能范围不同结果的函数叫非确定性函数。

    展开全文
  • 数据库面试题:数据库查询语句

    千次阅读 2021-02-02 13:36:02
    Student(S#,Sname,Sage,Ssex) 学生表Course(C#,Cname,T#) 课程表SC(S#,C#,score) 成绩表Teacher(T#,Tname) 教师表问题:1、查询“001”课程比“002”课程成绩高地所有学生的学号select a.S#from (select s#,score ...

    Student(S#,Sname,Sage,Ssex) 学生表

    Course(C#,Cname,T#) 课程表

    SC(S#,C#,score) 成绩表

    Teacher(T#,Tname) 教师表

    问题:

    1、查询“001”课程比“002”课程成绩高地所有学生的学号

    select a.S#

    from (select s#,score from SC where C#=’001′) a,

    (select s#,score from SC where C#=’002′) b

    where a.score>b.score and a.s#=b.s#;

    2、查询平均成绩大于60分的同学的学号和平均成绩

    select S#,avg(score)

    from sc

    group by S# having avg(score) >60;

    3、查询所有同学的学号、姓名、选课数、总成绩

    select Student.S#,Student.Sname,count(SC.C#),sum(score)

    from Student left Outer join SC on Student.S#=SC.S#

    group by Student.S#,Sname

    4、查询姓“李”的老师的个数

    select count(distinct(Tname))

    from Teacher

    where Tname like ‘李%’;

    5、查询没学过“叶平”老师课的同学的学号、姓名

    select Student.S#,Student.Sname

    from Student

    where S# not in (select distinct( SC.S#) from SC,Course,Teacher whe

    展开全文
  • 数据库查询所有表及所有字段的SQL语句由于一个小项目的需要,近日完成一个从数据库查询所有表及所有字段的方法,其实用两条SQL语句就可以完成。Sql Server版:列出当前DB中所有表:select name from dbo....
  • 数据库查询语句关键字总结

    千次阅读 2021-01-19 13:39:09
    看过牛腩视频后,前17集讲后台代码的编写,尤其讲到查询语句的时候,顿时感觉原来学习过的查询语句中用到的关键字烟消云散了,啥都不记得了,通过看视频,帮着回忆了一部分,在这里总结一下,查询语句中用到的关键字...
  • 一条SQL查询语句是如何执行的?前言​ 大家好,我是WZY,今天我们学习下MySQL的基础框架,看一件事千万不要直接陷入细节里,你应该先鸟瞰其全貌,这样能够帮助你从高维度理解问题。同样,对于MySQL 的学习也是这样。...
  • 从而实现将两个表的查询组合在一起,使用为此为UNINO或UNION ALL联合查询:将多个查询的结果合并到一起(纵向合并):字段数不变,多个查询的记录数合并应用场景1、将同一张表中不同的结果(需要对应多条查询语句来实现...
  • Django 查询语句汇总

    2020-12-24 11:06:28
    1.1.1 生成查询你创建完数据模型,django会自动提供给你数据库抽象的API,可以创建、获取、修改、删除对象,本篇文档讲解如何使用API。我们参考下面模型,一个weblog:#博客classBlog(models.Model):name=models....
  • 数据库SQL语句期末总复习

    千次阅读 2021-12-13 10:10:26
    DQL(数据查询语言):select查询语句 DML(数据操作语言):insert、delete、update对表中数据进行增删改 DCL(数据控制语言):grant、revoke授权与撤销授权 TCL(事务控制语言):commit、rollback提交事务与回滚事务 ...
  • sql 更新批量数据库语句

    千次阅读 2021-01-18 22:09:03
    JDBC(六)批量处理sql批量更新是分组在一起的一批更新,并以“批量”方式发送到数据库,而不是逐个发送更新。一次发送一批更新到数据库,比一个一个发送更快,等待每个更新完成。 发送一批更新(仅一次往返)涉及的网络...
  • 数据库分页查询语句也是初级程序员面试时经常被问到的考题,需要的朋友可以拿去参考研究。MysqlMysql数据库实现分页比较简单,提供了LIMIT函数。一般只需要直接写到sql语句后面就行了。LIMIT子句可以用来限制由...
  • 本文主要向大家介绍了SQLServer数据库分页查询语句,通过具体的内容向大家展现,希望对大家学习SQLServer数据库有所帮助。SQL Server分页查询是我们经常会用到的功能,下面就为你介绍分页查询的相关语句,希望对您...
  • python 链接数据库语句

    2020-12-22 04:19:04
    python操作mysql数据库实现增删改查Python 标准数据库接口为 Python DB-API,Python DB-API为开发人员提供了数据库应用编程接口。Python 数据库接口支持非常多的数据库,你可以选择适合你项目的数据库:...
  • destoon数据库表说明汇总如下,供次开发人员查询: 表名 注释destoon_404 404 日志 destoon_ad 广告 destoon_ad_place 广告位destoon_admin php x20PHP数据库抽象之PDO(四)——预处理语句与存储过程 ...
  • 我记得面试官在问到数据库时:“用过数据库吧,奥,用过就行,那用过select语句吗?就比如 select * from student where studentId = 1;这个语句数据库底层是怎么执行的,可以讲讲吗?” 这个时候不要谎,来到我们...
  • .rooom数据库的使用,在app的build.gradle中添加依赖: //room数据库 def room_version = "2.2.6" implementation "androidx.room:room-runtime:$room_version" annotationProcessor "androidx.room:room-compiler...
  • 数据库简单查询特定记录的查找1、SQL Server2、MySQ3、Oracle查找语句中if~else的实现1、2、3、 特定记录的查找 1、SQL Server 使用关键字TOP,限制返回的行数TOP 子句用于规定要返回的记录的数目。 对于拥有数千条...
  • mysql数据库)——表的查询

    千次阅读 2021-02-08 14:20:42
    1.单表查询1.1 查询语法SELECT 字段1,字段2... FROM 表名WHERE 条件 GROUP BY field HAVING 筛选 ORDER BY field LIMIT 限制条数1.2 关键字优先级fromwheregroup byhavingselectdistinctorder bylimit(1)找到表:from...
  • MySQL数据库之索引

    2021-01-19 02:40:27
    索引对良好的数据库性能来说,是一个非常重要的指标。当表中的数据量越来越大的时,其索引就越来越重要。基本法则索引应该构建在被用作《查询条件》的字段上索引类型1) B+ Tree索引BTree树的特性:多路平衡树树中每...
  • MySQL数据库:SQL语句的执行过程

    万次阅读 多人点赞 2021-02-22 03:59:20
    我们的系统在和 MySQL 数据库进行通信前,需要先和数据库建立连接,而这个功能就是由MySQL驱动底层帮我们完成的,建立完连接之后,我们只需要发送 SQL 语句就可以执行 CRUD 了。如下图所示: 一次 SQL 请求就会...
  • 祝大家2020年有“鼠”不尽的快乐,...今天我们分享一下达梦数据库的层级查询子句,层级关系在实际业务中应用非常广泛,学会了层级查询将给我们工作带来很多便利。本章的测试环境:操作系统:中标麒麟7 64位数据库版本...
  • SQLite3创建数据库的方法上次刚接触SqlLite,不知道怎么创建数据库,现在做下总结:界面和MYSQL一样,都是CMD界面,但不是在SQLite.exe中创建数据库:首先还是说一下cmd下sqlite的使用网上已经很多了、不做过多的赘述...
  • 一、 实验目的及实验环境 进一步掌握SELECT语句的使用方法,通过实验能够熟练地使用SELECT语句。...这里先介绍嵌套查询,一个SELECT-FROM-WHERE语句称为一个查询块。将一个查询块嵌入到另一个查询块的WHERE子句或者是HA
  • SQL语句——查询

    万次阅读 多人点赞 2021-01-05 18:05:30
    查询语句(SELECT)是数据库中最基本的和最重要的语句之一,其功能是从数据库中检索满足条件的数据。查询的数据源可以来自一张表,也可以来自多张表甚至来自视图,查询的结果是由0行(没有满足条件的数据)或多行...
  • 数据库操作 2.1 查询操作-查 2.1.1 SQL select 语句  SELECT语句用于从表中选取数据,结果被存储在一个结果表中(称为结果集) 语法: SELECT 列名称 FROM 表名称; 以及 SELECT * from test0709;  数据库...
  • 数据库【嵌套查询

    2021-04-06 12:44:44
    select Sname from Student where Sno in( select Sno from SC where Cno='2'); [例 3.55] 查询与“刘晨”在同一个系学习的学生。 ...[例 3.56]查询选修了课程名...[例 3.59] 查询非计算机科学系中比计算机科学...
  • 一、SQL语言查询选修了全部课程的学生的学号和姓名。两种解决途径:第一种:我们可以表示为在SC表中某个学生选修的课程数等于C表中课程总数。相应的SQL语言如下:select S#,SNAMEfrom Swhere S# in(select S#from ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 249,938
精华内容 99,975
关键字:

数据库查询二层语句