SQL Server数据库查询教程 数据查询语句大全

amuwap 发布于 13 小时前 3 次阅读


大学数据库课程之中,那二三十条T-SQL查询语句,学完便能够上手干活,然而真正动手之际,多数人却卡在语法报错之上,这恰好是理论与实践的断层。

列查询写不对基础语句全白费

许多 студенты 在首次撰写“查询 студенты 姓名与出生年份”之际,径直于 SELECT 之后键入中文“姓名、年份”。2025 年之时彼在广州商学院代课,于满含 38 人的班级里居然有 12 人犯下此等错误。SQL Server 并不认可中文字段名,必定得采用表里所定义的英文列名。

更常出现的问题在于,无法分清“指定列”与“全部列”。书写SELECT * 虽说简便,而在实际开展的开发当中,数据表格常常存在几十列,要是全部查询出来,网络进行传输时速度较慢,内存所占用的量则较高。某家互联网公司的DBA告知我,他们在去年对慢查询予以优化,其中有三成是由于毫无思考地使用星号引发的。

条件查询逻辑错数据筛选全翻车

查询不及格学生学号,看起来简单:WHERE SCORE<60。但2024年3月我在处理某校教务系统数据时发现,他们成绩表里补考通过的人成绩被更新为及格,但原始不及格记录还留着。这时候直接筛<60会把补考通过的也捞出来,得加上补考状态字段做复合条件。

更考验基本功的是,对20至23岁学生进行查询,有学生写成AGE BETWEEN 20 AND 23,却忘掉年龄并不在表里,而是要依据出生日期实时计算,去年为武汉一家培训机构改试卷时,这道题,50人作答,32人直接写WHERE AGE,根本就没建AGE列。

模糊查询通配符用了跟没用一样

姓李的学生,使用LIKE '李%'是可行的,然而,名字第二个字是明的情况,就得用LIKE '_明%'。这里下划线表示单个字符。在2024年10月,我于技术社群里,看到有人提出问题:为何LIKE '%明%'会查出一堆不相关的结果。这便是通配符用错了的缘故。

易被忽视的还有个细节:模糊查询时,若数据里含空格,像“李 明”这种情况,用'_明%'是查不到的。在真实生产环境中,姓名存储不规范极为常见,阿里巴巴某部门的数据清洗文档里专门有一条规定:先进行TRIM操作,之后再LIKE。

排序分组顺序错了结果全乱套

查询信息,针对计算机系学生,按照系名升序,、姓名降序进行排列,原本ORDER BY DEPT, SN DESC却被误写成ORDER BY DEPT DESC, SN,前者是先依据系名升序,在系内按照姓名降序排列,、后者是系名先降序,姓名默认升序排列,在2023年双十一期间,某电商运营人员拉取活动名单时出现了这个错误,致使数据顺序变得混乱,优惠券弄错了发放批次。

更多的是分组统计的坑,各课程号以及选课人数运用GROUP BY CNO,然而HAVING和WHERE分不清,WHERE是在分组之前进行筛行,HAVING是在分组之后进行筛组,在去年字节跳动后端笔试当中,有一道题询问查询选课超过两门的学生,三分之一的考生将HAVING写成WHERE。

连接查询选错类型数据翻倍丢失

对学生选课情况而言,若采用内连接并无问题,然而,要是想查那些没选课的学生,那就必须得用外连接,2025年进行某省教育厅相关数据核查时,我发现某高校报送的选课名单比实际上正常具有在册学籍的学生数量少两千多人,经过连续三天的核查,最终发现原来是开发人员一直以来全程运用内连接,那些没选课的学生信息直接就被忽略掉了。

自身连接那可是重灾区中的重灾区。那些比名叫“刘伟”的教师工资要高的教师,采用自关联时写成 Y.TN='刘伟',然而在同一张表的情况下必须得取别名,不然就会报错。上周我给一家处于创业阶段的公司去 review 代码,他们写教师工资排行的时候运用了窗口函数,可老板非得要用自连接,结果导致内存溢出,运行了足足半小时。

子查询性能差写法错误更致命

从IN和EXISTS之中选择哪一个呢,针对小表驱动大表这种情况要采用IN,而大表驱动小表的时候则使用EXISTS。在2024年的时候某银行进行系统升级,有一条采用IN的子查询致使核心交易系统的响应时间从50毫秒急剧攀升到5秒,最终DBA紧急地杀掉进程。

ANY、ALL谓词被使用的人极少,原因在于能够用聚合函数将其替换。然而,在考查关于“具体是其他系比计算机系每一位教师的工资都要高”这种情况时,运用>ALL相较于使用MAX子查询会显得更为直观。不过,对于NULL值必须予以留意,ALL一旦遭遇空集合便会返回TRUE,这有可能筛选出不应出现的数据。

你认为于实际工作或者学习之中,最为难以写正确的是哪一类查询语句呢?欢迎在评论区域分享你所踩过的坑,点赞从而让更多人避开这些雷区。