- 编写SQL语句之前,选中对应的数据库
选中方式:①双击;②USE Database_name; - 在SQL语句中,FROM子句也是可选的(即可写也可不写),SELECT的内容是什么,结果就是什么。
SELECT 'first_name'
-- 结果显示first_name
- 在给字段起别名的过程中,如果别名包含空格,须给该名称左右加上引号。
SELECT first_name,
last_name,
points,
points*10+100 AS 'discount point'
FROM customer
- 日期格式的数据,要加引号。引号就是告知数据库这是一个字符串而不是数字,否则“-”会被当做减号来处理。
SELECT *
FROM customers
WHERE birth_date > '1990-01-01'
- 注意NOT的意义——
eg:
NOT(birth > 100 OR points < 100)
-- 等价于
birth <= 100 AND points >= 100
- BETWEEN ——是包含临界值的,即可表示≥/≤
- 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相连的字符串
- 容易出错的写法
SELECT *
FROM customer
WHERE first_name LIKE 'ELKA' OR 'Ambur'
-- OR之后,同样要加上字段和关键字LIKE
- 在ORDER BY 之后跟多个字段用于排序,用逗号分隔。
SELECT *
FROM customer
ORDER BY state DESC,birth_date DESC
-
MYSQL中特别之处(其他数据库可能不支持),但为了代码的可移植性,一般不建议这么做。
①可以用不存在SELECT中的列作为ORDER BY的字段
②可以自己产生一列并命名别名并用别名进行排序 -
LIMIT的用法:
①LIMIT + number ——限定返回数据的数量
②LIMIT offset,number——跳过多少数据量后,限制返回的数据量
③LIMIT子句永远放在最后 -
JOIN:
①JOIN默认为:INNER JOIN;
②LEFT JOIN,即把写在LEFT JOIN左边的表作为主表,RIGHT JOIN 反之。LEFT/RIGHT JOIN都属于OUTER JOIN,编写时可以省略OUTER;
③NATURAL JOIN——不建议使用,不知道会产生什么结果;
④CROSS JOIN——不需要写连接条件,但是要注意CROSS JOIN的结果有没有意义。 -
给表设定了别名在写SQL过程中就一定要使用别名,否则MYSQL无法执行。
-
如何实现跨库查询数据:在不在当前库的表前面加上数据库的名称。
SELECT *
FROM order_items oi
JOIN sql_inventory.products p
ON oi.product_id= p.product_id
-- 当前所在库为order_items表所在的库,为了查询
-- sql_inventory库的数据,须在表前加上数据库名称
- 可以使用USING关键字替代ON条件,但是使用的基础是【欲连接的不同表的字段名称相同】
SELECT *
FROM order_items oi
JOIN products p
-- ON oi.product_id= p.product_id
USING(product_id)
-- 两表中欲作为连接桥梁的字段名称相同,均为product_id
- 用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);
- 复制一张表的数据到新表中
CREATE TABLE order_archived AS
SELECT * FROM orders
但是用这种方式会发现,新表没有设置主键
- 可以在INSERT 中加入子查询:
INSERT INTO order_archived
SELECT *
FROM orders
WHERE order_date < '1990-01-01'
-- 注意两者之间并不需要加什么关键词连接
-
MYSQL工作台一般情况下自启动安全模式,不允许一次性修改多条数据,可通过修改设置关闭安全模式:
操作:打开工作台-Edit-Preferences-如图所示
-
聚合函数的特点——只计算非空值(NOT NULL);如果使用COUNT(*),则不管有没有空值,计算所有的行数。
-
WHERE 和 HAVING 区别:WHERE 在分组之前进行筛选,HAVING 在分组之后进行筛选。注意:HAVING子句用到的列一定是SELECT 子句中存在的。
-
WITH ROLLUP运算符:
①用于对聚合函数列的值做一个汇总;
②只能应用于聚合值的列;
③仅MMYSQL独有,其他数据库引擎无法运行;
④在使用WITH ROLLUP功能时,不能在GROUP BY子句分组的字段使用字段的别名。
SELECT
client_id,
SUM(invoice_total) AS total_sales
FROM invoices
GROUP BY client_id WITH ROLLUP;
23. 在SELECT中运用子查询:
SELECT invoice_id,
invoice_total,
(SELECT AVG(invoice_total) -- 此处如果不用子查询,那么结果只有一行
FROM invoices) AS invoice_average
FROM invoice
- FROM中带子查询,一定要使用AS 赋予别名。