SQL

2024-05-25-SQL错题本

2024-05-25-SQL错题本.md

Posted by lily on June 3, 2024

image.png image.png RIGHT JOIN 关键字会返回右表 (t2) 所有的行(本题***4行),即使在左表 (t1) 中没有匹配的行。 参考文章:https://blog.csdn.net/Li_Jian_Hui_/article/details/105801454

image.png 官方解析:Mysql(版本8.0.25)不支持full join,执行报错【1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘full join 】 知识点:数据库、SQL Oracle数据库支持full join,mysql是不支持full join的,但仍然可以同过左外连接+ union+右外连接实现

image.png check约束是用来限制表中数据的取值范围或条件的约束。当定义了check约束后,数据库会在插入或更新数据时检查指定的条件是否满足,如果不满足则会拒绝操作。这样可以保证数据的完整性和准确性。

cMySQL中的DEFAULT子句和CHECK约束有以下区别:

  1. 功能不同:
    • DEFAULT子句用于在插入数据时设置默认值。
    • CHECK约束用于验证数据是否满足指定的条件。
  2. 作用范围不同:
    • DEFAULT子句只作用于单个字段。
    • CHECK约束可以作用于单个字段或整个表。
  3. 约束类型不同:
    • DEFAULT子句是一种数据类型约束。
    • CHECK约束是一种域完整性约束。
  4. 制约力度不同:
    • DEFAULT子句只会在插入新数据时生效。
    • CHECK约束会在插入和更新数据时生效。

总之,DEFAULT子句和CHECK约束虽然都是用于限制数据,但作用范围、限制类型和制约力度存在明显差异。建表时需要根据具体需求选择合适的约束方式。


Create default,Create rule,Create trigger,Create procedure,Create view等语句同一个批处理中只能提交一个

  1. 创建默认值:
    CREATE DEFAULT df_price
    AS 50.00
    

这将创建一个名为 df_price 的默认值,当没有指定价格时,将使用 50.00 作为默认值。

  1. 创建规则:
CREATE RULE insert_customer 
   AS ON INSERT TO customers
   DO INSTEAD
   INSERT INTO customers_log
   SELECT * FROM customers

这个规则在向 customers 表插入数据时,会将数据同时插入到 customers_log 表中。

  1. 创建触发器:
CREATE TRIGGER check_inventory
   BEFORE INSERT ON product
   FOR EACH ROW
   WHEN (NEW.quantity > 100)
   BEGIN
      RAISERROR ('库存超过100个,无法插入',16,1)
      ROLLBACK TRANSACTION
   END

这个触发器在向 product 表插入数据时,会检查 quantity 字段是否大于 100,如果大于,则抛出一个错误并回滚事务。

  1. 创建存储过程:
CREATE PROCEDURE GetCustomerOrders @CustomerID INT
AS
BEGIN
   SELECT * 
   FROM Orders
   WHERE CustomerID = @CustomerID
END

这个存储过程接受一个 CustomerID 参数,并返回指定客户的所有订单。

  1. 创建视图:
CREATE VIEW CustomerView
AS
SELECT CustomerName, Address, City, Country
FROM Customers

这个视图定义了一个基于 Customers 表的子集,只包含 CustomerName、Address、City 和 Country 字段。


GO是批处理的标志,它表示批处理命令的结束。在批处理文件中,当遇到GO时,系统会执行之前的所有批处理命令,并且会将屏幕上显示的结果保存到输出文件中。GO的作用类似于结束语句,表示批处理命令的完成。

  • GO是批处理的标志,表示SQL Server将这些T-SQL语句编译为一个执行单元,提高执行效率;GO语句必须自成一行,
  • 某些特殊的SQL指令不能和别的SQL指令共存在一个批处理中。如Create Table命令、Create View命令等,这些指令只能独自存在于一个单独的存储过程中。

GO 不是 SQL 语句或 MySQL 语法的一部分。

GO 是在操作系统命令提示符或批处理脚本中使用的关键词,主要用于标记一个批处理命令块的结束。它是一种在操作系统层面的命令,而不是 SQL 语句的一部分。

在 MySQL 等数据库管理系统中,通常使用 quitexit或者分号 ; 来标记 SQL 语句的结束,而不是 GO。SQL 语句的语法和执行流程与操作系统的批处理命令是完全不同的。

所以,GO 这个关键词并不是 SQL 或 MySQL 特有的,而是操作系统批处理脚本中的一个常见命令。在 MySQL 中是找不到类似的语法的。

image.png 官方解析: 先分组,再过滤,用group by … having … (having是过滤分组语句) order by是用来排序的

在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与聚合函数一起使用。 HAVING 子句可以让我们筛选分组后的各组数据。 SQL HAVING语法如下: SELECTcolumn_name, aggregate_function(column_name) FROMtable_name WHEREcolumn_nameoperator valueGROUPBYcolumn_name HAVINGaggregate_function(column_name)operatorvalue;

count()属于聚合函数,where后面不能接聚合函数 除了 count() 之外,其他常见的聚合函数包括:

  1. sum() - 计算指定列的总和
  2. avg() - 计算指定列的平均值
  3. max() - 返回指定列的最大值
  4. min() - 返回指定列的最小值
  5. group_concat() - 将指定列的值连接起来形成一个字符串 ```sql 好的,我来给您一些 group_concat() 的实际使用示例:

  6. 获取某个部门所有员工的名字:
SELECT department_name, 
       GROUP_CONCAT(employee_name) AS employee_list
FROM employees
GROUP BY department_name;

这样可以将同一个部门的所有员工名字以逗号分隔的形式显示在一个单元格中。

  1. 获取某个产品的所有颜色选项:
SELECT product_name,
       GROUP_CONCAT(color) AS available_colors
FROM product_options
GROUP BY product_name;

这样可以将同一个产品的所有颜色选项以逗号分隔的形式显示在一个单元格中。

  1. 统计每个城市的热门标签:
SELECT city, 
       GROUP_CONCAT(tag, ', ') AS top_tags
FROM location_tags
GROUP BY city;

这样可以将每个城市的热门标签以逗号和空格分隔的形式显示在一个单元格中。

group_concat() 的一个常见用法是将分散的数据聚合到一个单元格中, 方便展示和分析。当然,具体的使用场景会因数据结构和需求而有所不同。

这些聚合函数通常与 GROUP BY 语句一起使用,用于对数据进行分组统计。它们可以帮助我们快速获得汇总信息,而不需要逐行遍历数据。
聚合函数允许使用的常见字段属性包括:

1.  数值型字段: 
   - sum()
   - avg()
   - max()
   - min()
2.  字符型字段: 
   - count()
   - group_concat()

有一些特殊情况:

- count(*) 可以统计整个行数,不需要指定具体的字段。
- 对于 null 值: 
   - count() 不会统计 null 值
   - sum() 和 avg() 会忽略 null 值
   - max() 和 min() 可以处理 null 值
> 需要注意的是,不同的数据库系统可能会有一些细微的差异。在实际使用时,建议查看相应数据库的文档,了解具体的使用限制和注意事项。

 1.order by 从英文里理解就是行的排序方式,默认的为升序。 order by 后面必须列出排序的字段名,可以是多个字段名。
2.group by 从英文里理解就是分组。必须有“聚合函数”来配合才能使用,使用时至少需要一个分组标志字段。

![image.png](https://cdn.nlark.com/yuque/0/2024/png/1238904/1715924026746-b74c75ff-a674-4b21-a34f-8b5f89ba959d.png#averageHue=%23f9f5f3&clientId=u2477dc33-4081-4&from=paste&height=332&id=u91723846&originHeight=498&originWidth=704&originalType=binary&ratio=1.5&rotation=0&showTitle=false&size=47393&status=done&style=none&taskId=u5190f410-624d-4254-b1ab-a4a6a55c2d3&title=&width=469.3333333333333)
在SQL Server中,存储过程是一种预先编译的SQL代码集合,它们被存储在数据库中并可以被多次调用。存储过程可以包含SQL查询、控制流语句、变量声明和其他编程元素,使得数据库操作更加灵活和高效。存储过程可以用于执行常见的数据库任务,如数据插入、更新、删除,以及复杂的数据处理和业务逻辑。通过使用存储过程,可以减少重复的代码编写,提高数据库操作的性能和安全性。

![image.png](https://cdn.nlark.com/yuque/0/2024/png/1238904/1716286157168-a24faff8-f635-4303-a323-f0cc9bdc5bf3.png#averageHue=%23f9f5f4&clientId=u2df73252-56ce-4&from=paste&height=363&id=u772d0331&originHeight=545&originWidth=1115&originalType=binary&ratio=1.5&rotation=0&showTitle=false&size=48790&status=done&style=none&taskId=u0c7deb05-1c46-40e8-99f0-7809e9afffe&title=&width=743.3333333333334)
 对表的结构修改属于。DDL语句。常用公式。 
 添加列: ALTER TABLE   表名   add 字段名 
 修改列:  ALTER TABLE   表名   modify 字段名
删除列:  ALTER TABLE   表名   drop 字段名
1、modify:只是alter功能下的一个功能模块,只能修改字段的属性。
2、alter:包括“ADD ”、“DROP ”、“CHANGE ”、“MODIFY ”四个功能模块,除了修改字段属性外,还可以做增加删除操作

 SQL Server Charindex()函数  
![image.png](https://cdn.nlark.com/yuque/0/2024/png/1238904/1716286298247-749e7136-8275-420f-8d9f-6bb790dc8197.png#averageHue=%23d3b986&clientId=u2df73252-56ce-4&from=paste&height=399&id=uab4d32f6&originHeight=599&originWidth=829&originalType=binary&ratio=1.5&rotation=0&showTitle=false&size=100966&status=done&style=none&taskId=uf59f4cb4-66db-4fca-912b-ce50fb1aabf&title=&width=552.6666666666666)
SQL Server CHARINDEX()函数从指定位置开始搜索字符串内的子字符串。 它返回搜索到的字符串中找到的子字符串的位置,如果未找到子字符串,则返回零。 需要注意的是:它返回的起始位置是从1开始的,而不是从0开始的。
以下内容仅是站长或网友个人学习笔记、总结和研究收藏。不保证正确性,因使用而带来的风险与本站无关! 					 				
 			
 			 			
 				 				
 					 					 					 					 				
 				 				

- [ ]  					 					

在本教程中,将学习如何使用SQL Server CHARINDEX()函数来搜索字符串中的子字符串。
##### SQL Server CHARINDEX()函数简介
SQL Server CHARINDEX()函数从指定位置开始搜索字符串内的子字符串。 它返回搜索到的字符串中找到的子字符串的位置,如果未找到子字符串,则返回零。 需要注意的是:它返回的起始位置是从1开始的,而不是从0开始的。
以下是CHARINDEX()函数的语法:

CHARINDEX(substring, string [, start_location])

SQL


- [ ] 在上面语法中,
      - substring - 是要搜索的子字符串。它的长度限制为8,000个字符。
      - string - 可以是文字字符串,表达式或列。这是一个要搜索的字符串。
      - start_location是搜索开始的位置。 start_location是整数,大整数或计算结果为这些数据类型的值的表达式。
      - start_location参数是可选的。 如果未指定,零或负值,则搜索从字符串的开头开始。

请注意,CHARINDEX()函数可以根据指定的排序规则执行区分大小写和不区分大小写的搜索。
#### SQL Server CHARINDEX()函数示例
下面来看一些使用CHARINDEX()函数的例子。
**1. 使用CHARINDEX()执行单个搜索**
以下示例使用CHARINDEX()函数在字符中"SQL Server CHARINDEX"中执行字符串"SQL的简单搜索。

SELECT CHARINDEX(‘SQL’, ‘SQL Server CHARINDEX’) position;

SQL


- [ ] 执行上面查询语句,得到以下结果:

position ———– 1

(1 row affected) ``` //更多请阅读:https://www.yiibai.com/sqlserver/sql-server-charindex-function.html

image.png SQL 货币类型 货币的字段类型一般有int,float,money/smallmoney,decimal/numberic。 根据存储数据的精度不同选择: int只能存储整数的钱。 money/smallmoney 数据类型精确到它们所代表的货币单位的万分之一 。 decimal/numberic 可以自定义小数位和能存储的数据精度, 所以一般使用这种类型的人会多一些 image.png 官方解析:inner join时只会对非NULL的记录做join,并且2边都有的才会匹配上,所以结果只有’张三’,是1行,选D。 知识点:数据库、SQL