实验5 SQL分组、排序及多表连接语句
- 格式:docx
- 大小:184.01 KB
- 文档页数:9
数据库多表联查分组查询语句数据库多表联查分组查询是数据库中常用的操作之一,通过使用多个表进行联结查询,并对结果进行分组,可以得到符合特定条件的数据统计结果。
下面列举一些常见的数据库多表联查分组查询语句及其应用场景。
1. 查询每个部门的员工数量```sqlSELECT department_name, COUNT(employee_id) AS employee_countFROM employeesGROUP BY department_name;```应用场景:通过统计每个部门的员工数量,可以了解到各个部门的规模大小。
2. 查询每个部门的平均工资```sqlSELECT department_name, AVG(salary) AS average_salaryFROM employeesGROUP BY department_name;```应用场景:通过统计每个部门的平均工资,可以比较各个部门的薪资水平。
3. 查询每个部门的最高工资```sqlSELECT department_name, MAX(salary) AS max_salaryFROM employeesGROUP BY department_name;```应用场景:通过统计每个部门的最高工资,可以了解到各个部门中最高的薪资水平。
4. 查询每个部门的最低工资```sqlSELECT department_name, MIN(salary) AS min_salaryFROM employeesGROUP BY department_name;```应用场景:通过统计每个部门的最低工资,可以了解到各个部门中最低的薪资水平。
5. 查询每个部门的员工平均年龄```sqlSELECT department_name, AVG(YEAR(NOW()) - YEAR(birth_date)) AS average_ageFROM employeesGROUP BY department_name;```应用场景:通过统计每个部门的员工平均年龄,可以比较各个部门的员工年龄结构。
实验五SQL分组、排序及多表连接语句一、实验目的1.熟练掌握SQL分组语句;2.熟练掌握SQL排序语句;3.熟练掌握多表连接语句;二、实验内容给定一个练习数据库和相应的练习题,要求上机完成,并验证结果任务:完成以下SQL查询语句⏹查询顾客表(Customer)中没有设定区域的顾客编号和公司名⏹统计职工表(Employees)中头衔的数量⏹查找订单表(Orders)中顾客编号为’VICTE’和’WELLI’的的订单号和运费,并按照运费的降序排列⏹查找产品表(Products)中的平均库存总价(库存总价=单价×库存数)⏹查找提供产品的各个供应商编号及其供应的产品数量⏹查找提供产品的各个供应商名称及其供应的产品数量⏹在订单详细信息表(OrderDetails)中查找每个订单号对应的产品种类超过4种的订单号和产品种类数,并按照产品种类数升序排列⏹查询客户的公司名和它所下订单的订单编号⏹找出所有的职员姓和名以及他的直接上级的姓和名使用外部连接,查找所有的职员的基本信息以及其直接上级的姓、名四. 实验结果与分析(上交实验报告)1、查询顾客表(Customer)中没有设定区域的顾客编号和公司名select CustomerID,CompanyNamefrom Customerswhere Region is NULL⏹统计职工表(Employees)中头衔的数量select count(distinct Title)from Employees⏹查找订单表(Orders)中顾客编号为’VICTE’和’WELLI’的的订单号和运费,并按照运费的降序排列select OrderID,Freightfrom Orderswhere CustomerID='VICTE' or CustomerID='WELLI'order by Freight DESC⏹查找产品表(Products)中的平均库存总价(库存总价=单价×库存数) select A VG(UnitPrice*UnitsInStock)from Products⏹查找提供产品的各个供应商编号及其供应的产品数量select SupplierID,SUM(UnitsInStock)from Productsgroup by SupplierID⏹查找提供产品的各个供应商名称及其供应的产品数量select CompanyName,SUM(UnitsInStock)from Products,Supplierswhere Products.SupplierID=Suppliers.SupplierIDgroup by CompanyName⏹在订单详细信息表(OrderDetails)中查找每个订单号对应的产品种类超过4种的订单号和产品种类数,并按照产品种类数升序排列select OrderID,count(distinct ProductID)from OrderDetailsgroup by OrderIDhaving count(distinct ProductID)>4order by count(distinct ProductID)⏹查询客户的公司名和它所下订单的订单编号select CompanyName,OrderIDfrom Orders,Customerswhere Orders.CustomerID=Customers.CustomerID⏹找出所有的职员姓和名以及他的直接上级的姓和名select stName,first.FirstName,stNameReportsToLastName,second.FirstName ReportsToLastNamefrom Employees first,Employees secondwhere first.ReportsTo=second.EmployeeID使用外部连接,查找所有的职员的基本信息以及其直接上级的姓、名select first.*,stName,second.FirstName ReportsFirstNamefrom Employees first LEFT OUTER JOIN Employees second ON (first.ReportsTo=second.EmployeeID)五.讨论、心得(可写遇到的问题及解决方法,或者对技术的理解等)本次实验的最后几题有些难,在反复看书和询问同学后才完成。
1.4(SQL学习笔记)分组、⼦查询、联结、组合查询⼀、分组 1.1初识分组 分组是按照某⼀列,将该列中相同多个相同的数据作为⼀组,整体分成若⼲组。
例如有如下表: 例如将vend_id作为依据分组,则会分成三组。
所有vend_id = DLL01为⼀组,所有vend_id = BRS01为⼀组。
所有vend_id = FNG01为⼀组。
现在我们有这样⼀个需求,计算每⼀个每⼀个供应商有多少商品。
这时我们可以采⽤这样的思路,先按供应商进⾏分组,然后采⽤聚集函数计算。
分组采⽤GROUP BY colName 进⾏分组 按照vend_id分组后再采⽤聚集函数计算。
注:SELECT语句后⾯出现的字段必须是在GROUP BY语句后⾯出现的字段。
聚集函数除外。
因为按照vend_id分成三组后,除了vend_id作为分组的关键字可以正常显⽰, 每⼀个分组中其余属性的属性值并不相同,因此不能作为SELECT后⾯的列。
GROUP BY治具可以任意数⽬的列,使其可以进⾏分组的嵌套。
GROUP BY语句必须出现在WHERE之后,ORDER BY之前。
1.2分组过滤 过滤分组类似前⾯的WHERE,不过WHERE过滤的⾏,⽽这⾥过滤的是分组。
过滤分组采⽤HAVING 过滤条件。
这⾥过滤的是分组,是⼀组数据。
例如现在我们要过滤掉提供商品⼩于3的供应商。
先按供应商进⾏分组,然后计算供应商商品数⽬。
通过HAVING判断数量进⾏过滤。
我们来分析下语句的执⾏顺序, ⾸先FROM找到表,然后通过GROUP BY进⾏分组, 然后通过HAVING判断每⼀个分组的⾏数是否⼤于3,⼤于等于3的分组保留下来,其他的忽略。
最后通过SELECT输出每个组的关键字(vend_id)和每个组的⾏数。
注:HAVING 筛选条件,满⾜筛选条件的会被保留下来。
本例执⾏顺序FROM ->GROUP BY->HAVING->SELECT; 如果在加上WHERE会怎么样呢? WHERE是在分组前执⾏,HAVING是在分组后执⾏, 例如: 先通过FROM找到表,然后执⾏WHERE保留所有prod_price⼤于4的商品。
SQL聚合、分组和排序⽬录⼀、聚合查询1、COUNT 函数2、SUM 函数3、AVG 函数4、MAX 函数和 MIN 函数⼆、分组查询三、对聚合结果进⾏过滤1、HAVING ⼦句的构成要素四、对查询结果进⾏排序1、指定多个排序键2、使⽤聚合函数排序⼀、聚合查询在访问数据库时,经常要对表中的某列数据进⾏统计汇总,如求和、最⼤值、最⼩值、平均值等,这时就需要使⽤聚合函数,所谓聚合函数,就是⽤于汇总的函数,聚合就是将多⾏汇总为⼀⾏,常见的聚合函数如下:1、COUNT 函数count函数⽤于统计表中记录⾏数。
例如,计算全部数据的⾏数:SELECT COUNT(*) FROM users;注意: COUNT(*)会得到包含空值NULL的数据⾏数,若想排除包含NULL的数据⾏,可以使⽤count(字段名),会得到NULL之外的数据⾏数。
SELECT COUNT(user_name) FROM users;2、SUM 函数⽤于计算任意列中数据的和。
例如,计算所有⽤户的年龄之和:SELECT sum(age) FROM users;3、AVG 函数⽤于计算任意列中数据的平均值。
例如,计算所有⽤户的年龄平均值:SELECT AVG(age) FROM users;4、MAX 函数和 MIN 函数MAX函数⽤于计算任意列中数据的最⼤值,MIN函数⽤于计算任意列中数据的最⼩值。
例如,计算所有⽤户中的年龄的最⼤值和最⼩值:SELECT MAX(age),MIN(age) FROM users;注意: MAX函数和MIN函数⼏乎适⽤于所有数据类型的列,SUM函数和AVG函数只适⽤于数值类型的列。
⼆、分组查询聚合函数是对表中所有数据进⾏统计汇总,还可以使⽤GROUP BY⼦句先把数据分成若⼲组,再进⾏统计汇总。
语法格式:SELECT <字段名>,... FROM <表名> GROUP BY <字段名>,...;例如,按照⽤户所在城市进⾏分组统计每个城市⽤户的和:SELECT city,count(*) FROM users GROUP BY city;+-------+----------+| city | count(*) |+-------+----------+| 北京 | 60 || 上海 | 45 || NULL | 80 || 济南 | 12 |+-------+----------+通过结果可以看出,字段为NULL的也会被列为⼀个分组。
sql分组排序语法
在SQL中,你可以使用GROUP BY和ORDER BY子句来进行分组和排序。
1.GROUP BY:这个子句用于根据一个或多个列对结果集进行分组。
通常与聚合函数
(如SUM(), COUNT(), AVG()等)一起使用。
示例:
sql
SELECT column1, column2, SUM(column3)
FROM your_table
GROUP BY column1, column2;
2.ORDER BY:这个子句用于对结果集进行排序。
你可以根据一个或多个列进行排序,
并可以选择升序(默认)或降序。
示例:
sql
SELECT column1, column2, SUM(column3)
FROM your_table
GROUP BY column1, column2
ORDER BY column1 ASC, column2 DESC;
当你想先分组,然后在每个分组内排序时,你可以这样组合使用:
sql
SELECT column1, column2, SUM(column3) as total
FROM your_table
GROUP BY column1, column2
ORDER BY total DESC;
这里,我们首先按column1和column2进行分组,然后在每个分组内按total(即SUM(column3)的结果)降序排序。
SQL语言多表查询、分组统计、子查询、数据表的更新操作、事务处理SQL语言多表查询、分组统计、子查询、数据表的更新操作、事务处理3.1、多表查询3.1.1、基本语法但是在多表查询之前首先必须处理一个问题:例如:现在求出雇员表中的总记录数(14条记录)SELECT COUNT(*) FROM emp ;例如:现在求出部门表的总记录数(4条记录)SELECT COUNT(*) FROM dept ;所谓的多表查询就是直接在FROM语句之后加入若干张表,下面将emp和dept表进行多表查询SELECT * FROM emp,dept ;以上确实完成了两张表的联合查询,但是查询出来的结果是56条记录。
部门表的记录总数* 雇员表的记录总数= 56条记录。
那么这样的结果在数据库中就称为笛卡尔积。
对于这样的结果明显不是最终查询者需要返回的结果,应该想办法去掉笛卡尔积。
所以如果要使用多表查询,则必须按照以下的语句形式进行编写:SELECT 字段FROM 表1,表2WHERE 将两张表的关联字段进行比较,去掉笛卡尔积以emp和dept表为例1、雇员表结构:No. 字段名称字段类型字段作用1 EMPNO NUMBER(4) 表示的是雇员编号,长度为四位的整数2 ENAME VARCHAR2(10) 雇员的姓名,使用字符串表示,字符串的长度最大为103 JOB VARCHAR2(9) 工作,字符串表示,最大长度为94 MGR NUMBER(4) 雇员的直接上级领导编号5 HIREDATE DATE 雇佣日期6 SAL NUMBER(7,2) 工资,工资长度一共是7位,其中整数占5位,小数占2位7 COMM NUMBER(7,2) 奖金(佣金)8 DEPTNO NUMBER(2) 部门编号2、部门表结构:No. 字段名称字段类型字段作用1 DEPTNO NUMBER(2) 雇员编号2 DNAME VARCHAR2(14) 部门名称3 LOC VARCHAR2(13) 部门位置两张表中都存在deptno字段,一般在数据库建表的时候都会把关联字段的名称统一。
SQL数据库查询语句/连接查询/多表连接查询一、简单查询简单的Transact-SQL查询只包括选择列表、FROM子句和Where子句。
它们分别说明所查询列、查询的表或视图、以及搜索条件等。
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。
Select nickname,emailFROM testtableWhere name='张三'(一) 选择列表选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变量和全局变量)等构成。
1、选择所有列例如,下面语句显示testtable表中所有列的数据:Select *FROM testtable2、选择部分列并指定它们的显示次序查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。
例如:Select nickname,emailFROM testtable3、更改列标题在选择列表中,可重新指定列标题。
定义格式为:列标题=列名列名列标题如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列标题:Select 昵称=nickname,电子邮件=emailFROM testtable4、删除重复行Select语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认为ALL。
使用DISTINCT选项时,对于所有重复的数据行在Select返回的结果集合中只保留一行。
5、限制返回的行数使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT 时,说明n是表示一百分数,指定返回的行数等于总行数的百分之几。
例如:Select TOP 2 *FROM testtable Select TOP 20 PERCENT * FROM testtable(二) FROM子句FROM子句指定Select语句查询及与查询相关的表或视图。
多表连接sql语句多表连接是SQL中一个常见的操作,用于从多个表中检索数据。
以下是几种常见的多表连接方法:内连接(INNER JOIN)返回两个表中都有的记录。
SqlSELECT column_name(s)FROM table1INNER JOIN table2ON table1.column_name = table2.column_name;左连接(LEFT JOIN 或LEFT OUTER JOIN)返回左表中的所有记录和右表中匹配的记录。
如果右表中没有匹配的记录,则结果为NULL。
SqlSELECT column_name(s)FROM table1LEFT JOIN table2ON table1.column_name = table2.column_name;右连接(RIGHT JOIN 或RIGHT OUTER JOIN)返回右表中的所有记录和左表中匹配的记录。
如果左表中没有匹配的记录,则结果为NULL。
SqlSELECT column_name(s)FROM table1RIGHT JOIN table2ON table1.column_name = table2.column_name;全连接(FULL JOIN 或FULL OUTER JOIN)返回左表和右表中的所有记录。
如果某侧没有匹配的记录,则结果为NULL。
SqlSELECT column_name(s)FROM table1FULL JOIN table2ON table1.column_name = table2.column_name;交叉连接(CROSS JOIN)返回左表和右表中所有的组合。
SqlSELECT column_name(s)FROM table1CROSS JOIN table2;自连接(Self-Join)一个表自我连接。
通常用于处理层次结构或父子关系的数据。
7.多表连接:你可以在一个查询中连接多个表,只需在JOIN语句后继续列出其他表即可。
sql语句分组排序计算总数连接等sql语句书写1.什么是表连接?答:⽐如两张表,要获取的信息来⾃两张表,就需要通过外键的形式进⾏两张表的连接。
最后产后组合信息。
表连接是通过join连接的。
表连接说⽩了就是产⽣⼀个⼤表。
表连接也都是⽤于查询上的,⽤户查询获得多种信息。
2.什么情况下⽤到分组?答:涉及到每个“xxx字段”时,就是典型分组,要⽤group by xxx字段。
分组时,基本都要显⽰分组的字段,这样才能区分是哪个被分组的字段有什么数据。
⽐如从student表中查询每个院系有多少⼈mysql> SELECT department, COUNT(id) FROM student GROUP BY department;select 显⽰的字段要有department,按department GROUP BY ,所以group by后⾯也有department分组与表连接没有任何关系,表连接说⽩了就是产⽣⼀个⼤表。
3.mysql中常⽤的数学函数?答:count(xx字段),计算总数量。
⽐如计算院系有多少⼈。
max(xx字段),计算最⼤值,⽐如计算每个科⽬的最⾼分8.从student表中查询每个院系有多少⼈mysql> SELECT department, COUNT(id) FROM student GROUP BY department;+------------+-----------+| department | COUNT(id) |+------------+-----------+| 计算机系 | 2 || 英语系 | 2 || 中⽂系 | 2 |+------------+-----------+9.从score表中查询每个科⽬的最⾼分mysql> SELECT c_name,MAX(grade) FROM score GROUP BY c_name;+--------+------------+| c_name | MAX(grade) |+--------+------------+| 计算机 | 98 || 英语 | 94 || 中⽂ | 95 |+--------+------------+10.查询李四的考试科⽬(c_name)和考试成绩(grade)mysql> SELECT c_name, grade-> FROM score WHERE stu_id=-> (SELECT id FROM student-> WHERE name= '李四' );+--------+-------+| c_name | grade |+--------+-------+| 计算机 | 70 || 英语 | 92 |+--------+-------+11.⽤连接的⽅式查询所有学⽣的信息和考试信息mysql> SELECT student.id,name,sex,birth,department,address,c_name,grade -> FROM student,score-> WHERE student.id=score.stu_id;+-----+--------+------+-------+------------+--------------+--------+-------+| id | name | sex | birth | department | address | c_name | grade |+-----+--------+------+-------+------------+--------------+--------+-------+| 901 | 张⽼⼤ | 男 | 1985 | 计算机系 | 北京市海淀区 | 计算机 | 98 || 901 | 张⽼⼤ | 男 | 1985 | 计算机系 | 北京市海淀区 | 英语 | 80 || 902 | 张⽼⼆ | 男 | 1986 | 中⽂系 | 北京市昌平区 | 计算机 | 65 || 902 | 张⽼⼆ | 男 | 1986 | 中⽂系 | 北京市昌平区 | 中⽂ | 88 || 903 | 张三 | ⼥ | 1990 | 中⽂系 | 湖南省永州市 | 中⽂ | 95 || 904 | 李四 | 男 | 1990 | 英语系 | 辽宁省⾩新市 | 计算机 | 70 || 904 | 李四 | 男 | 1990 | 英语系 | 辽宁省⾩新市 | 英语 | 92 || 905 | 王五 | ⼥ | 1991 | 英语系 | 福建省厦门市 | 英语 | 94 || 906 | 王六 | 男 | 1988 | 计算机系 | 湖南省衡阳市 | 计算机 | 90 || 906 | 王六 | 男 | 1988 | 计算机系 | 湖南省衡阳市 | 英语 | 85 |+-----+--------+------+-------+------------+--------------+--------+-------+12.计算每个学⽣的总成绩mysql> SELECT student.id,name,SUM(grade) FROM student,score-> WHERE student.id=score.stu_id-> GROUP BY id;+-----+--------+------------+| id | name | SUM(grade) |+-----+--------+------------+| 901 | 张⽼⼤ | 178 || 902 | 张⽼⼆ | 153 || 903 | 张三 | 95 || 904 | 李四 | 162 || 905 | 王五 | 94 || 906 | 王六 | 175 |+-----+--------+------------+13.计算每个考试科⽬的平均成绩mysql> SELECT c_name,AVG(grade) FROM score GROUP BY c_name; +--------+------------+| c_name | AVG(grade) |+--------+------------+| 计算机 | 80.7500 || 英语 | 87.7500 || 中⽂ | 91.5000 |+--------+------------+14.查询计算机成绩低于95的学⽣信息mysql> SELECT * FROM student-> WHERE id IN-> (SELECT stu_id FROM score-> WHERE c_name="计算机" and grade<95);+-----+--------+------+-------+------------+--------------+| id | name | sex | birth | department | address |+-----+--------+------+-------+------------+--------------+| 902 | 张⽼⼆ | 男 | 1986 | 中⽂系 | 北京市昌平区 || 904 | 李四 | 男 | 1990 | 英语系 | 辽宁省⾩新市 || 906 | 王六 | 男 | 1988 | 计算机系 | 湖南省衡阳市 |15.查询同时参加计算机和英语考试的学⽣的信息mysql> SELECT * FROM student-> WHERE id =ANY-> ( SELECT stu_id FROM score-> WHERE stu_id IN (-> SELECT stu_id FROM-> score WHERE c_name= '计算机')-> AND c_name= '英语' );+-----+--------+------+-------+------------+--------------+| id | name | sex | birth | department | address |+-----+--------+------+-------+------------+--------------+| 901 | 张⽼⼤ | 男 | 1985 | 计算机系 | 北京市海淀区 || 904 | 李四 | 男 | 1990 | 英语系 | 辽宁省⾩新市 || 906 | 王六 | 男 | 1988 | 计算机系 | 湖南省衡阳市 |+-----+--------+------+-------+------------+--------------+mysql> SELECT a.* FROM student a ,score b ,score c-> WHERE a.id=b.stu_id-> AND b.c_name='计算机'-> AND a.id=c.stu_id-> AND c.c_name='英语';+-----+--------+------+-------+------------+--------------+| id | name | sex | birth | department | address |+-----+--------+------+-------+------------+--------------+| 901 | 张⽼⼤ | 男 | 1985 | 计算机系 | 北京市海淀区 || 904 | 李四 | 男 | 1990 | 英语系 | 辽宁省⾩新市 || 906 | 王六 | 男 | 1988 | 计算机系 | 湖南省衡阳市 |+-----+--------+------+-------+------------+--------------+16.将计算机考试成绩按从⾼到低进⾏排序mysql> SELECT stu_id, grade-> FROM score WHERE c_name= '计算机'-> ORDER BY grade DESC;+--------+-------+| stu_id | grade |+--------+-------+| 901 | 98 || 906 | 90 || 904 | 70 || 902 | 65 |+--------+-------+17.从student表和score表中查询出学⽣的学号,然后合并查询结果mysql> SELECT id FROM student-> UNION-> SELECT stu_id FROM score;+-----+| id |+-----+| 901 || 902 || 903 || 904 || 905 || 906 |+-----+18.查询姓张或者姓王的同学的姓名、院系和考试科⽬及成绩mysql> SELECT student.id, name,sex,birth,department, address, c_name,grade -> FROM student, score-> WHERE-> (name LIKE '张%' OR name LIKE '王%')-> AND-> student.id=score.stu_id ;+-----+--------+------+-------+------------+--------------+--------+-------+| id | name | sex | birth | department | address | c_name | grade |+-----+--------+------+-------+------------+--------------+--------+-------+| 901 | 张⽼⼤ | 男 | 1985 | 计算机系 | 北京市海淀区 | 计算机 | 98 || 901 | 张⽼⼤ | 男 | 1985 | 计算机系 | 北京市海淀区 | 英语 | 80 || 902 | 张⽼⼆ | 男 | 1986 | 中⽂系 | 北京市昌平区 | 计算机 | 65 || 902 | 张⽼⼆ | 男 | 1986 | 中⽂系 | 北京市昌平区 | 中⽂ | 88 || 903 | 张三 | ⼥ | 1990 | 中⽂系 | 湖南省永州市 | 中⽂ | 95 || 905 | 王五 | ⼥ | 1991 | 英语系 | 福建省厦门市 | 英语 | 94 || 906 | 王六 | 男 | 1988 | 计算机系 | 湖南省衡阳市 | 计算机 | 90 || 906 | 王六 | 男 | 1988 | 计算机系 | 湖南省衡阳市 | 英语 | 85 |+-----+--------+------+-------+------------+--------------+--------+-------+19.查询都是湖南的学⽣的姓名、年龄、院系和考试科⽬及成绩mysql> SELECT student.id, name,sex,birth,department, address, c_name,grade -> FROM student, score-> WHERE address LIKE '湖南%' AND-> student.id=score.stu_id;+-----+------+------+-------+------------+--------------+--------+-------+| id | name | sex | birth | department | address | c_name | grade |+-----+------+------+-------+------------+--------------+--------+-------+| 903 | 张三 | ⼥ | 1990 | 中⽂系 | 湖南省永州市 | 中⽂ | 95 || 906 | 王六 | 男 | 1988 | 计算机系 | 湖南省衡阳市 | 计算机 | 90 || 906 | 王六 | 男 | 1988 | 计算机系 | 湖南省衡阳市 | 英语 | 85 |+-----+------+------+-------+------------+--------------+--------+-------+。
排序sql语句排序SQL语句是数据库操作中不可或缺的一部分。
SQL语言有强大的排序功能,可以让我们按照特定的字段进行排序,使查询结果更加透明明了、易于理解。
本文将按照不同类型的排序方式介绍SQL语句的排序操作,让您更好地掌握这个技能。
一、升序与降序排序SQL语句中的ORDER BY关键字是用来按照指定列对结果集进行排序的。
默认情况下,排序是升序的,即ASC(从小到大)。
如果我们要实现降序排序,只需在列名后加上DESC(从大到小)关键字即可。
例如,我们要按照学生姓名对学生表进行降序排序:SELECT * FROM student ORDER BY name DESC;二、多列排序在实际应用中,我们有时需要按照多个字段进行排序,SQL语句也能够胜任这样的任务。
我们只需要在ORDER BY关键字后跟上多个字段名即可。
例如,我们要按照学生的年龄和成绩对学生表进行排序:SELECT * FROM student ORDER BY age DESC, score ASC;这样,先按照年龄从大到小排序,再在年龄相同的情况下按照成绩从小到大排序。
三、字符串排序对于字符串类型的数据,我们需要注意一些细节。
字符串采用字典序排序,也就是按照ASCII码值进行排序。
在进行字符串排序时,一个常见的问题是大小写的区分。
为了忽略大小写进行排序,我们可以使用LOWER()函数将所有字符串转换成小写形式,再进行排序。
例如,我们要按照学生的姓名对学生表进行升序排序,但不考虑大小写:SELECT * FROM student ORDER BY LOWER(name) ASC;四、日期排序日期排序也是SQL语句中的一种常见操作。
日期也可以按照升序和降序排序,我们只需将日期类型的列名放在ORDER BY关键字之后即可。
例如:SELECT * FROM orders ORDER BY order_date DESC;当然,我们也可以插入其他条件来进行多列排序。
SQL分组、排序及多表连接语句
一、实验目的
1.熟练掌握SQL分组语句;
2.熟练掌握SQL排序语句;
3.熟练掌握多表连接语句;
二、实验内容
给定一个练习数据库和相应的练习题,要求上机完成,并验证结果
实验基础知识提要
从数据库中检索行,并允许从一个或多个表中选择一个或多个行或列。
虽然SELECT 语句的完整语法较复杂,但是其主要的子句可归纳如下:
SELECT select_list
FROM table_source
[ WHERE search_condition ]
[ GROUP BY group_by_expression ]
[ HA VING search_condition ]
[ ORDER BY order_expression [ ASC | DESC ] ]
From子句中的连接类型
指定从其中检索行的表,当存在多个表时用“,”分隔。
表之间可以使用连接,连接的类型如下:
INNER
指定返回所有相匹配的行对。
废弃两个表中不匹配的行。
如果未指定联接类型,则这是默认设置。
LEFT [OUTER]
指定除所有由内联接返回的行外,所有来自左表的不符合指定条件的行也包含在结果集内。
来自左表的输出列设置为NULL。
RIGHT [OUTER]
指定除所有由内联接返回的行外,所有来自右表的不符合指定条件的行也包含在结果集内。
来自右表的输出列设置为NULL。
FULL [OUTER]
如果来自左表或右表的某行与选择准则不匹配,则指定在结果集内包含该行,并且将与另一个表对应的输出列设置为NULL。
除此之外,结果集中还包含通常由内联接返回的所有行。
Group By子句
指定用来放置输出行的组,并且如果SELECT 子句<select list> 中包含聚合函数,则计算每组的汇总值。
指定GROUP BY 时,选择列表中任一非聚合表达式内的所有列都应包含在GROUP BY 列表中,或者GROUP BY 表达式必须与选择列表表达式完全匹配。
Having子句
指定组或聚合的搜索条件。
HA VING 通常与GROUP BY 子句一起使用。
如果不使用GROUP BY 子句,HA VING 的行为与WHERE 子句一样。
Order By子句
指定结果集的排序。
除非同时指定了TOP,否则ORDER BY 子句在视图、内嵌函数、派生表和子查询中无效。
ASC
指定按递增顺序,从最低值到最高值对指定列中的值进行排序。
DESC
指定按递减顺序,从最高值到最低值对指定列中的值进行排序。
空值被视为最低的可能值。
三、实验步骤
构建以下的数据表作为实验数据内容
3.3 Products(产品)
运行SQL SERVER服务管理器,确认数据库服务器开始运行。
运行企业管理器,以图示方式点击“附加数据库”,恢复db目录下的数据库文件
打开查询分析器,选择刚才恢复的数据库exampleDB,输入SQL指令,获得运行结果。
任务:完成以下SQL查询语句
⏹查询顾客表(Customer)中没有设定区域的顾客编号和公司名
⏹统计职工表(Employees)中头衔的数量
⏹查找订单表(Orders)中顾客编号为’VICTE’和’WELLI’的的订单号和运费,并按照运
费的降序排列
⏹查找产品表(Products)中的平均库存总价(库存总价=单价×库存数)
⏹查找提供产品的各个供应商编号及其供应的产品数量
⏹查找提供产品的各个供应商名称及其供应的产品数量
⏹在订单详细信息表(OrderDetails)中查找每个订单号对应的产品种类超过4种的订
单号和产品种类数,并按照产品种类数升序排列
⏹查询客户的公司名和它所下订单的订单编号
⏹找出所有的职员姓和名以及他的直接上级的姓和名
使用外部连接,查找所有的职员的基本信息以及其直接上级的姓、名
分析思考问题:
1. 分析Where筛选和Having筛选的区别;
Having 和where 都是用来筛选的,having是筛选组,where是记录
2.给出多表查询中的左外连接,右外连接和全连接示例SQL语句,并分析其使用场景;
左:select a.*,b.* from a left join b on a.id=b.parent_id
结果 1 a null null null 2 b 1 d 2 3 c 2 e 3
右:select a.*,b.* from a right join b on a.id=b.parent_id
2 b 1 d 2
3 c 2 e 3 null null 3 f 4
全:select a.*,b.* from a full join b on a.id=b.parent_id
1 a null null null
2 b 1 d 2
3 c 2 e 3 null null 3 f 4
3. 给出不少于5个聚合函数,并写出示例SQL语句,说明含义。
其中至少有两个SQL
语句要包含Having子句
Avg: select avg(grade)
From student
Count: select type
From title
Group by type
Having count(type)>3
Max: select max(h)
From title
Min: select min(h)
From title
Sum: select b,sum(b)
From t , h
group by a
having sum(a)<50
五.讨论、心得
(可写遇到的问题及解决方法,或者对技术的理解等)对于sql语句,更加熟悉了。