Mosh大神的SQL课-一些要点总结(适合有SQL基础者)

  1. 编写SQL语句之前,选中对应的数据库
    选中方式:①双击;②USE Database_name;
  2. 在SQL语句中,FROM子句也是可选的(即可写也可不写),SELECT的内容是什么,结果就是什么。
SELECT 'first_name'
-- 结果显示first_name
  1. 在给字段起别名的过程中,如果别名包含空格,须给该名称左右加上引号。
SELECT first_name,
       last_name,
       points,
       points*10+100 AS 'discount point'
FROM customer
  1. 日期格式的数据,要加引号。引号就是告知数据库这是一个字符串而不是数字,否则“-”会被当做减号来处理。
SELECT *
FROM customers
WHERE birth_date > '1990-01-01'
  1. 注意NOT的意义——
eg:
NOT(birth > 100 OR points < 100)
          -- 等价于 
birth <= 100 AND points >= 100
  1. BETWEEN ——是包含临界值的,即可表示≥/≤
  2. REGEXP在SQL中的使用:
SELECT *
FROM customer
WHERE first_name LIKE '%field%'
--将where子句替换成以下,完全等价
WHERE first_name REGEXP 'field'

相关的主要是一些关于正则表达式的知识,举例说明:
①’^field’——表示以field开头的字符串
②’field$’——表示以field结尾的字符串
③’field|mac’——包含了field或者mac的字符串(用|表示多个搜寻模式)
④[gei]o——表示包含go/eo/io的字符串
⑤[a-h]o——表示包含a/b/c……/h与o相连的字符串

  1. 容易出错的写法
SELECT *
FROM customer
WHERE first_name LIKE 'ELKA' OR 'Ambur'
-- OR之后,同样要加上字段和关键字LIKE
  1. 在ORDER BY 之后跟多个字段用于排序,用逗号分隔。
SELECT *
FROM customer
ORDER BY state DESC,birth_date DESC
  1. MYSQL中特别之处(其他数据库可能不支持),但为了代码的可移植性,一般不建议这么做。
    ①可以用不存在SELECT中的列作为ORDER BY的字段
    ②可以自己产生一列并命名别名并用别名进行排序

  2. LIMIT的用法:
    ①LIMIT + number ——限定返回数据的数量
    ②LIMIT offset,number——跳过多少数据量后,限制返回的数据量
    ③LIMIT子句永远放在最后

  3. JOIN:
    ①JOIN默认为:INNER JOIN;
    ②LEFT JOIN,即把写在LEFT JOIN左边的表作为主表,RIGHT JOIN 反之。LEFT/RIGHT JOIN都属于OUTER JOIN,编写时可以省略OUTER;
    ③NATURAL JOIN——不建议使用,不知道会产生什么结果;
    ④CROSS JOIN——不需要写连接条件,但是要注意CROSS JOIN的结果有没有意义。

  4. 给表设定了别名在写SQL过程中就一定要使用别名,否则MYSQL无法执行。

  5. 如何实现跨库查询数据:在不在当前库的表前面加上数据库的名称。

SELECT *
FROM order_items oi
JOIN sql_inventory.products p
ON oi.product_id= p.product_id
-- 当前所在库为order_items表所在的库,为了查询
-- sql_inventory库的数据,须在表前加上数据库名称
  1. 可以使用USING关键字替代ON条件,但是使用的基础是【欲连接的不同表的字段名称相同】
SELECT *
FROM order_items oi
JOIN products p
-- ON oi.product_id= p.product_id
    USING(product_id)
-- 两表中欲作为连接桥梁的字段名称相同,均为product_id
  1. 用SQL插入分层数据——应用LAST_INSERT_ID()
--现在orders表产生新数据,产生新数据的同时要把orders表的
--customer_id作为order_items的数据插入order_items,我们
--谓之分层数据,order表和order_item之间存在层级关系
INSERT INTO orders(customer_id,order_date,status)
VALUES(10,'1990-01-01',1);
INSERT INTO order_items(customer_id,product_id,num,price)
VALUES
	(LAST_INSERT_ID(),2,1,2.0),
	(LAST_INSERT_ID(),3,1,2.0);
  1. 复制一张表的数据到新表中
CREATE TABLE order_archived AS
SELECT * FROM orders

但是用这种方式会发现,新表没有设置主键

  1. 可以在INSERT 中加入子查询:
INSERT INTO order_archived
SELECT *
FROM orders
WHERE order_date < '1990-01-01'
-- 注意两者之间并不需要加什么关键词连接
  1. MYSQL工作台一般情况下自启动安全模式,不允许一次性修改多条数据,可通过修改设置关闭安全模式:
    操作:打开工作台-Edit-Preferences-如图所示
    在这里插入图片描述

  2. 聚合函数的特点——只计算非空值(NOT NULL);如果使用COUNT(*),则不管有没有空值,计算所有的行数。

  3. WHERE 和 HAVING 区别:WHERE 在分组之前进行筛选,HAVING 在分组之后进行筛选。注意:HAVING子句用到的列一定是SELECT 子句中存在的。

  4. WITH ROLLUP运算符:
    ①用于对聚合函数列的值做一个汇总;
    ②只能应用于聚合值的列;
    ③仅MMYSQL独有,其他数据库引擎无法运行;
    ④在使用WITH ROLLUP功能时,不能在GROUP BY子句分组的字段使用字段的别名。

SELECT 
	client_id,
	SUM(invoice_total) AS total_sales
FROM invoices
GROUP BY client_id WITH ROLLUP;

client_id相加没有意义,故为空
23. 在SELECT中运用子查询:

SELECT invoice_id,
	   invoice_total,
	   (SELECT AVG(invoice_total)  -- 此处如果不用子查询,那么结果只有一行
	   FROM invoices) AS invoice_average
FROM invoice
  1. FROM中带子查询,一定要使用AS 赋予别名。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值