目录
Outer JOINS BETWEEN MULTIPLE TABLES
CHAPTER6 WRITTING COMPLEX QUERIES
SUBQUERIES IN THE SELECT CLAUSE/SELECT语句中的子查询
SUBQUERIES in the FROM Clause FROM子句中的子查询
FORMTTING DATES AND TIME格式化日期和时间
THE INFULL AND COALESCE FUNCTIONS
Altering or dropping view更改或删除视图
CHAPTER 9 STORED PROCEDURES存储过程
CREATING A STORED PROCEDURE创建存储过程
CREATING PROCEDURES USING MYSQLWORKBENCH
USING TRIGGERS FOR AUDITING使用触发器进行审计
VIEWING AND DROPPONG EVENTS查看删除和更改事件
TRANSACTION ISOLATION LEVELS事务隔离级别
READ UNCOMMITED ISOLATION LEVEL读未提交隔离级别
READ COMMITED ISOLATION LEVEL读已提交隔离级别
REAPATABLE READ ISOLATION LEVEL可重复读隔离级别
无论提交与否,session1都查不到新加入的行,必须把session1的commit才能查到session1新插入的内容。
SERIALIZABLE ISOLATION LEVEL序列化隔离级别
FIXED-PINT AND FLAOTING-POINT TYPES定点和浮点类型
Forward engineerring a model一个模型的正向工程
复合索引中的排序ORDER OF COMPOSITE INDEX
表中的任何列都可以作为主键,只要它满足以下条件:
任意两行都不具有相同的主键值;
每一行都必须具有一个主键值(主键列不允许空值 NULL);
主键列中的值不允许修改或更新;
主键值不能重用(如果某行从表中删除,它的主键不能赋给以后的新行)。
The SELECT Statement
USE sql_store;
SELECT * FROM customers
WHERE customer_id = 1
order by first_name
The SELECT Clause
SELECT
first_name,
last_name,
points,
(points+10)*100 AS 新的列名称
from customers
SELECT * -选中所有列
use sql_store;
SELECT
name,
unit_price,
unit_price*1.1 AS new_price
FROM products;
WHERE clause
use sql_store;
SELECT *
FROM customers
where birth_date>'1990-01-01'
SELECT *
FROM order_items
where order_id=6 and unit_price*quantity>30
SELECT *
FROM customers
where state IN ('VA' ,'GA','FL')
==============
SELECT *
FROM customers
where state='VA' OR state='GA' OR state='FL’
BETWEEN AND
SELECT *
FROM customers
WHERE birth_date between '1990-01-01' AND '2000-01-01'
THE LINK OPERATOR
%表示任意字符不限制数量
SELECT *
FROM customers
WHERE last_name LIKE '%y'
_表示一个任意字符
SELECT *
FROM customers
WHERE last_name LIKE '_____y'
SELECT *
FROM customers
where address like "%trail%"or
address like "%avenue%" and
phone like "%9"
The REGEXP Operator-正则表达式
[ ]的用法
USE sql_store;
SELECT *
FROM customers
WHERE last_name REGEXP '[gim]e'
代表搜出来lastname里包含ge ie me的词语
-表示范围
USE sql_store;
SELECT *
FROM customers
WHERE last_name REGEXP '[a-h]e'
^-beginning
USE sql_store;
SELECT *
FROM customers
WHERE last_name REGEXP '^field|mac|rose'
代表搜出来是开头为field 或者开头是mac或开头是rose的词语
$-end,|表示Logical or
USE sql_store;
SELECT *
FROM customers
WHERE last_name REGEXP 'field$|mac|rose'
THE IS NULL Operator
SELECT * FROM sql_store.customers
where phone is null
THE OEDER BY Clause
默认用primary key排序,用order可以使用其他列排序,DESC是倒序
SELECT *
FROM customers
ORDER by First_name DESC
SELECT ,quantity*unit_price as total_price
FROM sql_store.order_items
where order_id=2
order by total_price desc
THE TLMIT Clause
LIMIT 偏移量,步长
SELECT *
FROM customers
limit 6,3
SELECT *
FROM customers
order by points desc
limit 3
INNER JOINS
SELECT order_id,o.customer_id,first_name,last_name
FROM orders o---加空格可以省略AS
JOIN customers c
ON o.customer_id=c.customer_id
JOINNING ACROSS DATABASES
use sql_inventory;
SELECT *
FROM sql_store.order_items o
JOIN products p
on o.product_id=p.product_id
要为不属于这个database的数据库加上sql_databasename
SELF 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
JOIN Multiply tables
USE sql_invoicing;
select p.payment_id,c.client_id,p.invoice_id,p.date,p.payment_method,p.amount,pm.name as method_name
FROM clients c
JOIN payments p
on c.client_id=p.client_id
JOIN payment_methods pm
ON p.payment_method=pm.payment_method_id
COMPOUND JOIN CONDITIONS-复合主键
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
IMPLICT JOIN SYNTAX-隐式联合语法
select *
FROM orders o
JOIN customers c
ON o.customer_id= c.customer_id
==implicit join syntax
select *
from orders o,customers c
where o.customer_id= c.customer_id
OUTER JOINS
SELECT
c.customer_id,
c.first_name,
o.order_id
FROM customers c
LEFT JOIN orders o
ON c.customer_id = o.customer_id
ORDER BY c.customer_id
LEFT 会让 左面的表customers全量显示,无论是否满足布尔运算的条件
LEFT 会让 右面的表orders全量显示,无论是否满足布尔运算的条件
SELECT
c.customer_id,
c.first_name,
o.order_id
FROM customers c
RIGHT JOIN orders o
ON c.customer_id = o.customer_id
ORDER BY c.customer_id
Outer JOINS BETWEEN MULTIPLE TABLES
USE sql_store;
SELECT o.order_date,o.order_id,c.first_name,sh.name as shipper,os.name as status
FROM orders o
JOIN customers c
ON c.customer_id = o.customer_id
LEFT JOIN shippers sh
ON o.shipper_id=sh.shipper_id
JOIN order_statuses os
ON o.status=os.order_status_id
ORDER BY o.order_id
多个表左连接查询,应该将所查主表放在最左边,而且后面的表都应该和它作为连接条件
SELF OUTER JOINS
USE sql_hr;
select
e.employee_id,
e.first_name,
m.first_name manager
FROM employees e
LEFT JOIN employees m
ON e.reports_to=m.employee_id
THE USING CLAUSE
use sql_store;
select
o.order_id,
c.first_name
FROM orders o
JOIN customers c
ON o.customer_id = c.customer_id
==========
use sql_store;
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)
__________________________________________________________________________
组合主键
select*
FROM order_items oi
JOIN order_item_notes oin
ON oi.order_id=oin.order_id AND
oi.product_id=oin.product_id
============================
select*
FROM order_items oi
JOIN order_item_notes oin
USING(order_id, product_id)
NATURAL JOINS
不需要指定列,系统自动判断连接2个table
USE sql_store;
select customer_id,order_id
FROM orders o
natural join customers c
CROSS JOINS
把select的两列做笛卡尔积
显性
USE sql_store;
select c.first_name as customer,
p.name as product
FROM customers c
CROSS JOIN products p
ORDER BY c.first_name
隐形
USE sql_store;
select c.first_name as customer,
p.name as product
FROM customers c,products p
ORDER BY c.first_name
UNIOS
USE sql_store;
select order_id,
order_date,
'ACTIVE' as status
FROM orders o
where order_date>='2019-01-01'
UNION
select order_id,
order_date,
'ARCHIVED' as status
FROM orders o
where order_date < '2019-01-01'
USE sql_store;
SELECT first_name
FROM customers
UNION
SELECT name
FROM shippers
COLUMN ATTRIBUTE
INSERT INTO customers(
first_name,
last_name,
birth_date,
address,
city,
state
)
values(
'John',
'Smith',
'1999-12-25',
'ADDRESS',
'CITY',
'CA'
)
INSETING MULTIPLE ROWS
INSETING HIERARCHIAL ROWS
INSERT INTO orders (customer_id,order_date,status)
values(1,'2019-01-01',2);
select last_insert_id()
INSERT INTO orders (customer_id,order_date,status)
values(1,'2019-01-01',2);
INSERT INTO order_items
values(last_insert_id(),1,1,2.64),
(last_insert_id(),2,5,4.65);
CREATING A COPY OF A TABLE
INSERT INTO order_archieved
SELECT *
from ORDERS
WHERE order_date<'2019-01-01'
USE sql_invoicing;
CREATE TABLE invoices_archieved
SELECT name as client,
i.client_id,
invoice_id,
number,
invoice_total,
payment_total,
due_date,
payment_date
FROM invoices i
JOIN clients c
USING (client_id)
WHERE payment_date is not null
UPDATING A SINGLE ROW
UPDATE invoices
SET payment_total=invoice_total*0.5,
payment_date=due_date
WHERE invoice_id=3
UPDATING MUTIPLE ROW
在默认情况,MYSql工作台在安全模式下运行,它仅允许更新一条记录。可以进入edit的perference取消safe updates
UPDATE invoices
SET payment_total=invoice_total*0.5,
payment_date=due_date
WHERE client_id IN (3,4)
USING Subqueries in Updates
USE sql_invoicing;
UPDATE invoices
SET
payment_total=invoice_total*0.5,
payment_date=due_date
WHERE client_id IN(
SELECT client_id
FROM clients
where state in ('CA','NY'))
UPDATE orders
SET comments='gold customer'
where customer_id in
(
select customer_id
from customers
where points>3000)
DELETING ROWS
DELETE FROM invoices
where client_id=(
select cl