要了解后端,从Mysql开始学起,仅作备份。
参考mosh三小时入门
参考https://zhuanlan.zhihu.com/p/?native.theme=1
MYSQL
mysql workbench中运行快捷键用:Ctrl+Enter
面板里面的话用 "\G"结尾
SELECT * FROM customers \G
讯享网
类似pycharm,可以对指定的语句点击闪电符号运行
1、关系型数据库和数据模型
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Aj6gWSrd-1693299791308)(images/GRetfYEuXn6KYjEWwIwab_uXNjvvqxl4H_06rcJMr6k.png)]](https://img-blog.csdnimg.cn/9694d293e8fc4979966ef41ea34d3b94.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vgytB0Ku-1693299791310)(images/liq8ajgDhmDJpM6H0tkdP-wwuunu7D8VMW-y9tVvBlg.png)]](https://img-blog.csdnimg.cn/2af1631742fb4af8b0438156695f2690.png)
2、SQL语法与分类



Mosh基础——增删查改
1、SELRT FROM
讯享网 SELECT name, unit_price, unit_price*1.1 AS 'new price' FROM products
2、WHERE用于过滤
使用"WHERE IN"条件来简化多个OR条件的使用,"WHERE IN"用于在查询中指定一个字段与一个值集合进行比较,并返回匹配任何集合中值的行。它可以与子查询结合使用,也可以直接和值列表一起使用。
SELECT * FROM table_name WHERE column_name IN (value1, value2, value3);
在上述示例中,“WHERE IN"条件表达式用于在名为"table_name"的表中筛选出"column_name"字段的值与"value1”、"value2"和"value3"中的任何一个相等的数据行。这将返回所有匹配的行。
3、REGEXP是正则表达式匹配运算符,
用于执行模式匹配。它用于在字段中查找满足特定模式的值。
通过使用REGEXP运算符,可以将正则表达式模式与字符串进行比较,从而判断字符串是否满足所需的模式。常见的正则表达式模式包括字符类、重复、分组等。
下面是一个示例:
讯享网SELECT * FROM table_name WHERE column_name REGEXP 'pattern'; WHERE last_name REGEXP 'ey$|on$' --寻找以ey or on结尾的字段 WHERE last_name REGEXP '^my|se' --寻找以my开头 or 包含se的字段 WHERE last_name REGEXP 'br|bu' -- WHERE last_name REGEXP 'b[ru]' --寻找以B开头,跟随r/u的字段 ORDER BY first_name DESC --名字降序排
这将返回在指定的表(table_name)中,满足指定模式(pattern)的行。
需要注意的是,REGEXP运算符是区分大小写的。如果要进行不区分大小写的模式匹配,可以使用REGEXP的变体函数REGEXP_LIKE()。
4、寻找计算并展示
SELECT *, quantity*unit_price AS 'amount' FROM order_items WHERE order_id = 2 ORDER BY amount DESC

5、限制返回数量
挑选points最高的前三位
SELECT * FROM customers ORDER BY points DESC LIMIT 3
6、JOIN
order表和customers表两个有共同列customer_id,现在将customer加入到order里面

SELECT * -- SELECT FROM orders JOIN customers ON orders.customer_id = customers.customer_id
PS:在不同表里面找相同列的时候,需要在sql语句中加上对应的表名,用以指定
SELECT order_id,oi.product_id,quantity,oi.unit_price FROM order_items oi JOIN products p ON oi.product_id = p.product_id

7、其它数据库中的表插入
SELECT * FROM order_items oi JOIN sql_inventory.products p ON oi.product_id= p.product_id OR USE sql_inventory; SELECT * FROM sql_store.order_items oi JOIN products p ON oi.product_id = p.product_id
8、自己的表和自己JOIN
USE sql_hr; SELECT e.employee_id, e.first_name, m.first_name AS manager FROM employees e JOIN employees m ON e.reports_to = m.employee_id
9、两个表JOIN
USE sql_store; SELECT o.order_id, o.order_date, c.first_name, c.last_name, os.name AS status FROM orders o JOIN customers c ON o.customer_id = c.customer_id JOIN order_statuses os ON o.status = os.order_status_id OR USE sql_invoicing; SELECT -- p.payment_method, p.date, p.invoice_id, p.amount, c.name, pm.name AS paymethods FROM payments p JOIN clients c ON p.client_id = c.client_id JOIN payment_methods pm ON p.payment_method = pm.payment_method_id
10、主键和复合表结构
USE sql_store; SELECT* FROM order_items oi JOIN order_item_notes oin ON oi.order_id = oin.order_Id AND oi.product_id = oin.product_id
11、mysql内部连接———隐式连接
USE sql_store; SELECT c.customer_id, c.first_name, o.order_id FROM orders o -- LEFT JOIN orders o RIGHT JOIN customers c ON c.customer_id = o.customer_id ORDER BY c.customer_id SAME AS USE sql_store; SELECT c.customer_id, c.first_name, o.order_id FROM customers c -- LEFT JOIN orders o RIGHT JOIN orders o ON c.customer_id = o.customer_id ORDER BY c.customer_id
USE sql_store; SELECT c.customer_id, c.first_name, o.order_id, sh.name AS shipper FROM customers c LEFT JOIN orders o -- RIGHT JOIN customers c ON c.customer_id = o.customer_id LEFT JOIN shippers sh ON o.shipper_id = sh.shipper_id ORDER BY c.customer_id
PS:左连接和右连接,并不是简单意义上的在SELECT和JOIN上面换个位置,就可以得到同样的效果。如上SQL,左连接和右链接得到的表结果根本不一样
12、外部连接
USE sql_hr; SELECT o.order_id, c.first_name, sh.name AS shipper FROM orders o JOIN customers c USING(customer_id) LEFT JOIN shippers sh USING(shipper_id)
13、USING关键字


14、多表连接和USING/ON使用
USE sql_invoicing; SELECT p.date, c.name AS client, p.amount, pm.name AS payment_method FROM payments p JOIN clients c USING(client_id) JOIN payment_methods pm ON p.payment_method = pm.payment_method_id
15、Cross JOIN笛卡尔积组合
通过CROSS JOIN将shippers表和products表进行笛卡尔积组合,返回所有可能的组合结果。最后,使用ORDER BY对SHIPPER进行升序排序。
CROSS JOIN会生成两个表的每个行之间的组合,可能导致结果集非常庞大。请谨慎使用CROSS JOIN。

![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GDQX8YmK-1693299791324)(images/GNYuG70LWw_kxd2cmYaWZ6-0fY38BIk6zm_MULhYWoE.png)]](https://img-blog.csdnimg.cn/50927697a72841b6a9a018f2950d1958.png)
等同于

16、UNION
UNION操作用于将两个或多个SELECT语句的结果合并成一个结果集。其主要意义如下:
- 合并查询结果:通过UNION可以将多个查询结果合并为一个结果集,方便对数据进行综合处理和分析。
- 删除重复记录:当多个查询结果可能存在重复记录时,使用UNION可以自动删除重复的记录,确保结果集中的每条记录都是唯一的。
- 类似合并表:通过UNION操作可以模拟将不同表的数据合并到一个表中的效果,方便进行数据比较、交集、并集等操作。
- 简化查询逻辑:使用UNION可以将复杂的查询逻辑拆分为多个简单的查询,并通过合并它们的结果来获取最终的数据。
需要注意的是,使用UNION操作时,要求参与合并的查询结果列数和数据类型必须相同或兼容。同时,UNION默认会去除重复记录,如果需要保留重复记录,可以使用UNION ALL操作。
SELECT order_id, order_date, 'Active' AS status FROM orders WHERE order_date >= '2019-01-01' UNION SELECT order_id, order_date, 'Actived' AS status FROM orders WHERE order_date <= '2019-01-01'
SELECT customer_id, first_name, points, 'Bronze' AS type FROM customers WHERE points < '2000' UNION SELECT customer_id, first_name, points, 'Silver' AS type FROM customers WHERE points BETWEEN 2000 AND 3000 UNION SELECT customer_id, first_name, points, 'Gold' AS type FROM customers WHERE '3000' <= points ORDER BY first_name
17、INSERT INTO
INSERT INTO是MySQL中用于向表中插入新数据的关键字。它的意义如下:
- 插入数据:使用INSERT INTO可以将新的行插入到指定的表中。
- 指定列名:可以通过指定列名的方式,只向表中插入指定列的值,而不是全部列。这在某些情况下可以提高插入效率,也可以避免出现列顺序不一致的问题。
- 指定值:通过VALUES关键字,可以指定要插入的具体值。可以是常量值、变量值、表达式等。
- 插入多行数据:可以一次性插入多行数据,每行数据通过逗号分隔。
INSERT INTO table_name (column1, column2, ...) VALUES (value1, value2, ...);
其中,table_name是要插入数据的表名。column1, column2等是要插入的列名,可以省略。value1, value2等是要插入的值。
注意:插入的值的顺序必须和列的顺序相匹配,或者通过列名指定对应的值。同时,插入的值的数据类型必须与目标列的数据类型相匹配,否则可能会导致错误。
一表插入多行
INSERT INTO products (name,quantity_in_stock,unit_price) VALUES ('DF111',10,1.98), ('WFE222',11,1.98), ('EFE333',12,1.98)
数据插入多表
第一个语句用于向名为"orders"的表中插入一条新记录。该记录包含三个列:customer_id、order_date和status。值分别为1、'2019-01-02’和1。通过使用last_insert_id()函数来获取刚刚插入的订单记录的自增ID值,以便在后续插入订单项时使用。
第二个语句用于向名为"order_items"的表中插入两条新记录。每条记录包含四个列:order_id(使用last_insert_id()函数获取)、product_id、quantity和price。这两条记录分别表示与刚刚创建的订单关联的两个订单项。
这两个语句的执行顺序很重要,在向"order_items"表中插入订单项之前,必须先插入订单并获取其ID值。然后将此ID值用于在"order_items"表中与订单项关联。
INSERT INTO orders (customer_id,order_date,status) VALUES (1, '2019-01-02',1); INSERT INTO order_items VALUES (last_insert_id(),1,1,2.1), (last_insert_id(), 2,1,3.1)
18、COPY
INSERT INTO orders_archived SELECT * FROM orders WHERE order_date < '2019-01-01'
19、CREAT+JOIN+WHERE+USING
CREATE TABLE invoice_archived1 AS SELECT i.invoice_id, i.number, c.name AS client, i.invoice_total, i.payment_total, i.invoice_date, i.payment_date, i.due_date FROM invoices i JOIN clients c USING (client_id) WHERE payment_date IS NOT NULL
20、UPDATE表内容
UPDATE invoices SET payment_total = 10, payment_date='2019-03-01' WHERE invoice_id = 1 --表内数据互用 UPDATE invoices SET payment_total = 10 * invoice_total, payment_date=due_date WHERE invoice_id = 1

UPDATE invoices SET payment_total = 10 * invoice_total, payment_date=due_date WHERE client_id = -- 子查询,基于这个条件完成上述操作 (SELECT client_id FROM clients WHERE name = 'Yadel')
21、联合子查询
UPDATE invoices SET payment_total = 10 * invoice_total, payment_date=due_date WHERE client_id IN (SELECT client_id FROM clients -- WHERE name = 'Yadel') WHERE state IN('CN','NY'))
22、DELETE
DELETE FROM invoices WHERE client_id = ( SELECT client_id FROM clients WHERE name = 'Myworks' )
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/32146.html