精华内容
下载资源
问答
  • Selectwith语句

    千次阅读 2012-10-18 15:56:38
    锁定数据库的一个表 SELECT * FROM table WITH(HoldLock) 其他事务可以读取表,但不能更新删除 ...---- [SELECT 语句中“加锁选项”的功能说明] ---- NoLock(不加锁) 此选项被选中时,SQL Server 在读
    锁定数据库的一个表
    SELECT * FROM table WITH(HoldLock)
    其他事务可以读取表,但不能更新删除

    SELECT * FROM table WITH(TabLockX)
    其他事务不能读取表,更新和删除

    ---- [SELECT 语句中“加锁选项”的功能说明] ----

    NoLock不加锁
    此选项被选中时,SQL Server 在读取或修改数据时不加任何锁。 在这种情况下,用户有可能读取到未完成事务(Uncommited Transaction)或回滚(Roll Back)中的数据, 即所谓的“脏数据”。

    HoldLock保持锁
    此选项被选中时,SQL Server 会将此共享锁保持至整个事务结束,而不会在途中释放。

    UpdLock修改锁
    此选项被选中时,SQL Server 在读取数据时使用修改锁来代替共享锁,并将此锁保持至整个事务或命令结束。使用此选项能够保证多个进程能同时读取数据但只有该进程能修改数据。

    TabLock表锁
    此选项被选中时,SQL Server 将在整个表上置共享锁直至该命令结束。 这个选项保证其他进程只能读取而不能修改数据。

    TabLockX排它表锁
    此选项被选中时,SQL Server 将在整个表上置排它锁直至该命令或事务结束。这将防止其他进程读取或修改表中的数据。

    PagLock页锁
    此选项为默认选项, 当被选中时,SQL Server 使用共享页锁。



    展开全文
  • 解决方案SELECT rec.id, title.name FROM Records rec LEFT JOIN Titles title ON title.record_id = rec.id and title.language='de'; SELECT rec.id, title.name FROM Records rec LEFT JOIN Titles title ON ...

    bd96500e110b49cbb3cd949968f18be7.png

    I'm learning some more SQL, and ran into a "problem",

    I have two tabels like the link below

    http://www.sqlfiddle.com/#!2/403d4/1

    EDIT:

    Since I'm quite retarded now from all SQL-test i have done this weekend, i asked really wrong...

    Sorry guys...

    What i really wanted:

    If i have the requested language, i want to get all the records, and if the requested language is not in the titles-table, i want it to say "" or null...

    like if i ask for all records in 'de', i want:

    1 |  ACHTUNG

    2 | NULL

    and if i ask for all the records in 'en' i want

    1 | WARNING

    2 | Ambulance

    Really sorry for the wrong question.

    /*

    What i want to do:

    I have the ID of a record and the requested language.

    If the selected language does not exsists, i want it to take the other language.

    like if i have:

    language = 'de' and id = 1

    I want 'ACHTUNG',

    if i have:

    language = 'de' and id = 2

    i want "Ambulance" since there's no 'de'...

    */

    How do i do this?

    解决方案SELECT rec.id, title.name

    FROM Records rec

    LEFT JOIN Titles title ON title.record_id = rec.id and title.language='de';

    SELECT rec.id, title.name

    FROM Records rec

    LEFT JOIN Titles title ON title.record_id = rec.id and title.language='en';

    ID NAME

    1 ACHTUNG

    2 (null)

    ID NAME

    1 Warning

    2 Ambulance

    展开全文
  • SELECT语句的执行的逻辑查询处理步骤:(8)SELECT (9)DISTINCT(11) (1)FROM (3) JOIN (2) ON (4)WHERE (5)GROUP BY (6)WITH {CUBE | ROLLUP}(7)HAVING (10)ORDER BY 1.FROM2.ON3.JOIN4.WHERE5.GROUP BY6.WITH CUBE ...

    SELECT语句的执行的逻辑查询处理步骤:

    (8)SELECT (9)DISTINCT

    (11)

    (1)FROM

    (3)  JOIN

    (2)  ON

    (4)WHERE

    (5)GROUP BY

    (6)WITH {CUBE | ROLLUP}

    (7)HAVING

    (10)ORDER BY

    1.FROM

    2.ON

    3.JOIN

    4.WHERE

    5.GROUP BY

    6.WITH CUBE or WITH

    ROLLUP

    7.HAVING

    8.SELECT

    9.DISTINCT

    10.ORDER

    BY

    11.TOP

    MICROSOFT指出,SELECT语句的实际物理执行顺序可能会由于查询处理器的不同而与这个顺序有所出入。

    每个步骤产生一个虚拟表,该虚拟表被用作下一个步骤的输入。只有最后一步生成的表返回给调用者。

    如果没有某一子句,则跳过相应的步骤。

    1. FROM:对FROM子句中的前两个表执行笛卡尔积,生成虚拟表VT1。

    2. ON:对VT1应用ON筛选器。只有那些使为真的行才被插入VT2。

    3. OUTER(JOIN):如果指定了OUTER JOIN,保留表中未找到匹配的行将作为外部行添加到VT2,生成VT3。

    如果FROM子句包含两个以上的表,则对上一个联接生成的结果表和下一个表重复执行步骤1到步骤3,直到

    处理完所有的表为止。

    4. 对VT3应用WHERE筛选器。只有使为TRUE的行才被插入VT4。

    5. GROUP BY:按GROUP BY 子句中的列列表对VT4中的行分组,生成VT5。

    6. CUBE|ROLLUP:把超组插入VT5,生成VT6。

    7. HAVING:对VT6应用HAVING筛选器。只有使为TRUE的组才会被插入VT7。

    8. SELECT:处理SELECT列表,产生VT8。

    9. DISTINCT:将重复的行从VT8中移除,产生VT9。

    10. ORDER BY:将VT9中的行按ORDER BY子句中的列列表排序,生成一个有表(VC10)。

    11. TOP:从VC10的开始处选择指定数量或比例的行,生成表VT11,并返回给调用者。

    示例一:

    SELECT ID,COUNT(ID) AS TOTAL

    FROM

    STUDENT

    GROUP BY ID

    HAVING TOTAL>2

    觉得这个SQL语句眼熟吗?对,非常基础的分组查询。但它不能执行成功,因为HAVING的执行顺序在SELECT之上。

    实际执行顺序如下:

    1.FROM STUDENT

    2.GROUP BY ID

    3.HAVING TOTAL>2

    4.SELECT

    ID,COUNT(ID) AS TOTAL

    很明显,TOTAL是在最后一句SELECT ID,COUNT(ID) AS

    TOTAL执行过后生成的新别名。因此,在HAVING TOTAL>2执行时是不能识别TOTAL的。

    示例二

    SELECT ID,COUNT(ID) AS TOTAL

    FROM

    STUDENT

    GROUP BY ID

    ORDER BY TOTAL

    这个的实际执行顺序是:

    1.FROM STUDENT

    2.GROUP BY ID

    3.SELECT ID,COUNT(ID) AS TOTAL

    4.ORDER

    BY TOTAL

    这一次没有任何问题,能够成功执行。如果把ORDER BY TOTAL换成ORDER BY COUNT(ID)呢?

    SELECT ID,COUNT(ID) AS TOTAL

    FROM

    STUDENT

    GROUP BY ID

    ORDER BY COUNT(ID)

    实际执行顺序:

    1.FROM STUDENT

    2.GROUP BY ID

    3.SELECT ID,COUNT(ID) AS TOTAL

    4.ORDER

    BY COUNT(ID)

    没错,它是能够成功执行的,看SQL执行计划,它与上面ORDER BY TOTAL是一样的。ORDER BY

    是在SELECT后执行,因此可以用别名TOTAL。

    示例三

    SELECT FIRSTNAME+' '+LASTNAME AS NAME,

    COUNT(*) AS COUNT

    FROM STUDENT

    GROUP BY NAME

    实际执行顺序:

    FROM STUDENT

    GROUP BY

    NAME

    SELECT FIRSTNAME+' '+LASTNAME AS NAME,COUNT(*) AS COUNT

    很明显,执行GROUP BY NAME时别名NAME还没有创建,因此它是不能执行成功的。

    展开全文
  • 关于第一个top x with ties的问题,涉及到select语句执行顺序的问题,如果order by是后于select语句执行,那结果还成立吗?个人认为不成立,我一直认为order by是select语句中最后执行的。在网上查询的结果不是很好...
    创建一个student表:
    create table student(name nvarchar(10) primary key,
                         score int);
    go
    insert student values('aa',10),
                         ('bb',20),
                         ('cc',30),
                         ('dd',40),
                         ('ee',50),
                         ('ff',60),
                         ('gg',70),
                         ('hh',80),
                         ('ii',90),
                         ('jj',100),
                         ('kk',100),
                         ('ll',90),
                         ('mm',95);
    取成绩第一名,使用语句
    select top 1 name,score from student order by score desc;

    只有一条,可有两个都是100分的呀。

    select top 2 name,score from student order by score desc;

    image

    可以加上with ties

    select top 1 with ties name,score from student order by score desc;

    image

    继续看with ties,我取前两名呢?

    image

    擦,和取第一名是一样的呀!这不是我要的结果呀,两个100的应该是并列第一名,第二名应该是再往下排呀!

    我们继续用with ties,

    select top 3 with ties name,score from student order by score desc;

    image

    select top 4 with ties name,score from student order by score desc;

    image

    经过上面的几个select top x with ties可以看出,他只是根据”top x”中的第x个值去判断是否有重复的,如果第X个值没有重复的,结果和top x无with ties是一样的;当然如果第x个值有重复的,但已经在前一个值显示了,那他的结果和top  x无with ties也是一样的,比如上文中的取前两名,select top 2 with ties name , score from student order by score desc.

    top 3 和top 3 with ties结果是一样的。

    select top 3 name,score from student order by score desc;

    image

    那如果我想让排名的结果是:两个100分的都是第一名,第二名95分,第三名也是两个都是90分

    那就要用到窗口函数(也叫开窗函数)

    下面这个排名按分数由高向低的排序

    select name,score from student order by score desc;

    image

    窗口函数也可以的

    select row_number() over (order by score desc) as 排名,
              name,
             score
    from student;

    image

    再看看下面这个语句呢

    select dense_rank() over (order by score desc) as 排名,
              name,
              score
    from student;

    image

    13个人,排名只有11,两个第一,两个第三,这是否就是你想要的呢?

    还有个语句,虽然第一是两个人,但是否要把第二名给占掉呢,毕竟是两个人啊

    select rank() over (order by score desc) as 排名,
              name,
              score
    from student;

    image

    第二名和第五名没了,因为第一名是两个,把第二名的名额给占了;第四名又是两个,又把第五名的名额给占了。

     

    关于第一个top x with ties的问题,涉及到select语句执行顺序的问题,如果order by是后于select语句执行,那结果还成立吗?个人认为不成立,我一直认为order by是select语句中最后执行的。在网上查询的结果不是很好,有的是select在前执行,有的是order by在前执行。

    下面是微软网站上的说明,应该还是select在order by之前,但是top在order by之后,这样就可以理解了。

    http://msdn.microsoft.com/zh-cn/library/ms189499.aspx 

    SELECT 语句的逻辑处理顺序

    以下步骤显示 SELECT 语句的逻辑处理顺序(即绑定顺序)。 此顺序确定在一个步骤中定义的对象何时可用于后续步骤中的子句。 例如,如果查询处理器可以绑定到(访问)在 FROM 子句中定义的表或视图,则这些对象及其列可用于所有后续步骤。 相反,因为 SELECT 子句处于步骤 8,所以,在该子句中定义的任何列别名或派生列都无法被之前的子句引用。 不过,它们可由 ORDER BY 子句之类的后续子句引用。 请注意,该语句的实际物理执行由查询处理器确定,因此顺序可能与此列表不同。

    1. ON

    2. JOIN

    3. WHERE

    4. GROUP BY

    5. WITH CUBE 或 WITH ROLLUP

    6. HAVING

    7. SELECT

    8. DISTINCT

    9. ORDER BY

    10. TOP

     

     

    另附一图,在网上找的,供参考,来源:http://www.jb51.net/article/32066.htm

    image

    where子句为什么不能包含聚合函数,因为求解聚合函数是在where子句之后执行的。

    转载于:https://www.cnblogs.com/cnmarkao/p/3754599.html

    展开全文
  • SELECT 语句的执行顺序大家比较少关注,下面将为您详细介绍SQL语句中SELECT语句的执行顺序,供您参考,希望对您能够有所帮助。 SELECT语句的执行的逻辑查询处理步骤: (8)SELECT (9)DISTINCT (11) (1)FROM ...
  • 下面是SELECT语句的逻辑执行顺序: FROM ON JOIN WHERE GROUP BY WITH CUBE or WITH ROLLUP HAVING SELECT DISTINCT ORDER BY TOP  MICROSOFT指出,SELECT语句的实际物理执行顺序可能会由于查询...
  • <p>So my "type1" select statement will select an issue category, and then based on that issue I want a dropdown of employees that deal with that issue in another drop down. Also how do I make all the ...
  • Oracle中的select语句可以用start with...connect by prior子句实现递归查询,connect by 是结构化查询中用到的,其基本语法是: select ... from where start with connect by ; :过滤条件,用于对...
  • select 语句中的 start with...connect by prior 子句实现递归查询 今天发现在 oracle 中的 select 语句可以用 start with...connect by prior 子句实现递归查询,connect by 是结构化查询中用到的,其基本语法...
  • SELECT语句的执行顺序大家比较少关注,下面将为您详细介绍SQL语句中SELECT语句的执行顺序,供您参考,希望对您能够有所帮助。 SELECT语句的执行的逻辑查询处理步骤: (8)SELECT (9)DISTINCT (11) (1)FROM (3) ...
  • 1.SELECT语句语法 [WITH expr_list|(subquery)] SELECT [DISTINCT] expr_list [FROM [db.]table | (subquery) | table_function] [FINAL] [SAMPLE sample_coeff] [ARRAY JOIN ...] [GLOBAL] [ANY|ALL|ASOF] [INNER|...
  • SELECT语句的逻辑执行顺序: FROMONJOINWHEREGROUP BYWITH CUBE or WITH ROLLUPHAVINGSELECTDISTINCTORDER BYTOP MICROSOFT指出,SELECT语句的实际物理执行顺序可能会由于查询处理器的不同而与这个顺序有所...
  • 单表查询:查询指定记录 select ....where带IN的关键字查询 not in带betweenand的范围查询select column1,column2 from table1 where column between 3 and 14;带like的查询 %匹配任意长度的字符查询以b开头,并以y...
  • 了解数据库 SELECT 语句的执行顺序对我们编写正确、高效的查询语句有极大的帮助。各数据库类型并不完全一致,以MySql数据库为例,其执行顺序是:FROM ON JOIN WHERE GROUP BY WITH ROLLUP HAVING SELECT DISTINCT ...
  • SQL SELECT语句执行顺序

    2014-05-22 15:06:06
    下面是SELECT语句的逻辑执行顺序: FROM ON JOIN WHERE GROUP BY WITH CUBE or WITH ROLLUP HAVING SELECT DISTINCT ORDER BY TOP
  • SELECT语句基本语法

    千次阅读 2015-04-04 21:45:49
    1.SELECT语句基本语法 SELECT [ALL|DISTINCT] [TOP 表达式 [PERCENT][WITH TIES]] &lt;列名表&gt; [INTO 新表名] [FROM {&lt;表名列表&gt;}[,...n]] [WHERE &lt;条件&gt;] ...
  • select语句执行顺序

    2020-07-21 16:30:52
    定义顺序 (1) SELECT (2)DISTINCT<select_list> (3) FROM <left_table> (4) <join_type> JOIN <right_table> (5) ON <join_condition>...(8) WITH {CUBE|ROLLUP} (9)
  • from http://www.javaeye.com/topic/184074 今天发现在oracle中的select语句可以用START WITH...CONNECT BY PRIOR子句实现递归查询,connect by 是结构化查询中用到的,其基本语法是: select ... from tablename ...
  • <p>When I'm using SQL select statements with prepared statements code works fine and display content when I'm run that in my computer localhost using WAMP server. <p>But when I'm upload this code to ...
  • SELECT语句的执行顺序大家比较少关注,下面将为您详细介绍SQL语句中SELECT...SELECT语句的执行的逻辑查询处理步骤:(8)SELECT(9)DISTINCT(11)(1)FROM(3) JOIN(2) ON(4)WHERE(5)GROUPBY(6)WITH{CUBE|ROLLUP}(7)HAVI...
  • SELECT 语句的执行顺序

    2014-10-10 16:37:51
    SELECT  语句的执行顺序   1. from 语句   2. where 语句 ( 结合条件 )  3. start with 语句   4. connect by 语句   5. where 语句   ...
  • SELECT语句的执行顺序大家比较少关注,下面将为您详细介绍SQL语句中SELECT语句的执行顺序, SELECT语句的执行的逻辑查询处理步骤: (8)SELECT (9)DISTINCT (11) (1)FROM (3) JOIN (2) ON (4)WHERE (5...
  • SELECT 语句的处理顺序

    2012-01-11 16:30:00
    SELECT 语句的处理顺序 FROM ON JOIN WHERE GROUP BY WITH CUBE 或 WITH ROLLUP HAVING SELECT DISTINCT ORDER BY TOP 转载于:...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,797
精华内容 1,518
关键字:

select语句with