第一章

本篇笔记仅为本人在观看CodeWithMosh的10小时sql学习视频中自学所记。
特此感谢b站up主:伟大的海伦君 的搬运以及翻译。

第二章

1.选择语句

SELECT * --选择全部语句,顺序影响
SELECT column 1, column 2 --以列为主
FROM customers --tableSELECT DISTINCT column
--distinct 自动删去该列中的重复项
SELECT price, price * 1.1 AS 'new price'
--用AS关键字为列重命名
--用单引号或者双引号写字符串

2.WHERE
写Boolean语句,判断是否符合条件,筛选

SELECT *
FROM orders
WHERE order_date >= '2019-01-01'
--‘xxxx-xx-xx’是sql的日期书写格式,可以用作判断大小
WHERE Order_id = 6 AND price * quantity >30
--还有NOT, OR等判断符号,NOT优先级最高,OR优先级最低
WHERE state IN ('VA','GA','FL')
--IN判断是否在合集里(NOT IN)
WHERE points BETWEEN 1000 AND 3000
--判断points是否【1000,3000】注意是闭区间
WHERE name LIKE 'b____y'
--不区分大小写
--中间几个下划线代表特定数量的字符
WHERE name LIKE '%b%'
--%代表不限数量的字符
--即名字中有b即符合条件--正则表达式Regular expression
WHERE name REGEXP 'b'
--判断是否有b
--'^b'句首,'b$'句尾
WHERE name REGEXP 'a|b'
--'|'代表或
--'[gim]e'判断e前缀是否有gim中任一字符
--'e[gim]'判断e后缀是否有gim中任一字符
--'[a-h]e'是否有a到h(闭区间)任一字符
WHERE phone IS NULL
--判断是否为空
--IS NOT NULL

3.ORDER BY语句
排序方式
默认排序:根据主键列,且为从小到大(升序)

ORDER BY name DESC
--DESC 降序排列 descending
ORDER BY state DESC, name
--先降序排序 state, 再根据name升序排序
--可以不select 但是order by某些column

4.LIMIT
限制查询返回的记录数。

SELECT *
FROM tables
LIMIT 3
--不超过3行
--limit 300 若小于这个数字则返回所有
--常用于分页
--选择第三页的话
LIMIT 6,3
--跳过前6条,选择3条,即返回第7,8,9
--LIMIT通常语句排序在最后

第三章:连接

1.内连接
从多张表格里选取列。
JOIN
两种类型:内连接,外连接
INNER JOIN。

SELECT *
FROM orders
--FROM orders o
--别名,直接空格加简称,方便书写
JOIN customersON orders.customers_id = customers.customers_id
--两张表格单纯连接在一起SELECT order_id, name, orders.customers_id
--选取不重复的列
--选取重复名列时需要前缀表格名称

2.跨数据库连接
双击设置主数据库。query一般用于当前主数据库。

--navigator 导航
USE sql_store;
--设置当前主数据库或者导航界面双击SELECT *
FROM orders o
JOIN sql_inventory.products p
--直接将另一个数据库的名字作为table前缀ON o.product_id = p.product_id

3.自连接
同一张表格自连接

USE sql_hrSELECT e.employee_id,e.name,m.name
FROM employees e
JOIN employees m AS manager --'manager'也一样ON e.reports_to = m.employee_id

4.多表连接

USE sql_store;SELECT o.id,o.date,c.name,os.status
FROM orders o
JOIN customers cON o.id = c.id
JOIN order_statuses osON o.status = os.id

5.复合连接条件
复合主键

SELECT oi
JOIN oinON oi.id = oin.idAND oi.pid = oin.pid

6.隐式连接

SELECT *
FROM o, c
WHERE o.id = c.id
--一般不用

7.外连接
OUTER JOIN
INNER JOIN只返回符合ON 条件的语句
但是如果想要返回无论是否有订单的顾客,则需要外连接
分左右两种

SELECT c.id,c.name,o.id
FROM c
LEFT JOIN o
--返回所有from语句中的table的记录
--RIGHT JOIN 返回右表
--类似交集,left返回A∪(A∩B),right相反
--JOIN返回A∩BON c.id = o.id
--8.多表格连接
--LEFT JOIN another table
--为了方便理解一般都用LEFT JOIN
ORDER BY c.id

9.自外连接

USE sql_hr;SELECT e.id,e.name,m.name AS manager
FROM employees e
LEFT JOIN employees mON e.reports_to = m.first_name

10.USING
如果两个table中有列的名称完全一样

SELECT c.id,c.name,o.id
FROM c
LEFT JOIN o--ON c.id = o.idUSING(customer_id)
JOIN shippers shUSING(Shipper_id,product_id)--多个列比较时用逗号分隔

11.自然连接(用的很少)

SELECT o.id,c.name
FROM orders o
NATURAL JOIN customers c

12.交叉连接

SELECT c.name AS customersp.product AS product
FROM customers c
CROSS JOIN products p
--显示连接
--隐式:FROM c, o
--order by c.name

13.联合Unions

SELECT o.id,o.date,'Active' AS 'status'
FROM orders
WHERE order_date>'2019-01-01';UNION
--合并多段查询记录
SELECT o.id,o.date,'Archived' AS 'status'
FROM orders
WHERE order_date < '2019-01-01';

第四章

1.列属性
Datatype
INT 整数类型
CHAR(50) 字符类型 (填满50个字符)
VARCHAR(50) variable character 不填满也不会浪费空间
DATE XXXX-XX-XX 日期

PK primary key 主键(唯一识别)
NN Not NULL 不允许空值
AI Auto increment 自动递增 通常用作主键列
Default value 默认值

2.插入单行 Inserting a single row
INSERT INTO

INSERT INTO customers
VALUES(DEFAULT,--主键必须是唯一值'John','Smith',NULL,DEFAULT,'add','CA',200)
--完整赋值--如果只想赋值某些列,而其他列就默认
INSERT INTO customers(name,address,city)--以这个顺序为准
VALUES('John','add','CA',)

3.插入多行 Inserting multiple rows

INSERT INTO shippers (name)
VALUES ('shipper1'),('shipper2'),('shipeer3')
--逗号分割,且每一个新行的元素都要用括号括起来

4.插入分级行(子母级)(往多张表里插入数据)

INSERT INTO orders(customer_id,order_date,stauts)
VALUES (1,'2019-01-02',1);--内置函数 LAST_INSERT_ID()
--返回mysql最新生成的idINSERT INTO order_items
VALUES(LAST_INSERT_ID(),1,1,2.95),(LAST_INSERT_ID(),2,1,2.45),(LAST_INSERT_ID(),3,1,2.35);

5.创建表复制

CREATE TABLE new _table AS
SELECT *
FROM orders
--会忽略一些属性,比如主键设置和自动递增
--这个select是子查询
--部分属于另外一段SQL语句的选择语句

右键table-Truncate Table,删除表中所有行
-drop table,删除表

--将选择语句作为insert的子查询
INSERT INTO new_table
SELECT *
FROM orders
WHERE order_date < '2019-01-01'

6.更新单行 update
7.更新多行

UPDATE table1
SET payment = DEFAULT, date = '2020-01-01', name = NULL,price = total *0.5
WHERE id = 1
--WHERE id IN(3,4)
--在table内点击刷新

8.update子查询

WHERE id = (SELECT idFROM clientsWHERE name = 'aaa')
WHERE id IN (SELECT idFROM clientsWHERE name IN ('aaa','bbb'))

9.删除行

DELETE FROM table1
--单语句删除所有行
WHERE id = 1
WHERE id = (SELECT idFROM clientWHERE name = 'a')

10.恢复数据库
Open SQL script

第五章

为数据汇总编写查询
1.聚合函数
内置函数的一种
比如取最大值等等,

MAX()
MIN()
AVG()
SUM()--总值
COUNT()--总数
SELECT MAX(invoice_total) AS highest,--括号内也可以写表达式,如倍数计算等等COUNT(total) as total,--不计算NULL值COUNT(*) as total--计算NULL值COUNT(DISTINCT name)--去除重复值
FROM invoices
WHERE number > 2
--返回筛选后的计算数值

2.group by数组分列

SELECT id,SUM(total)
FROM invoices
JOIN clients USING(id)
WHERE
GROUP BY id
--根据指定列计算
ORDER BY total DESC
--根据指定列进行排序

3.HAVING
where语句在group by语句之前,不能筛选分组后的数据
4.ROLLUP

SELECT id,sum(totalsale) as total
FROM invoices
--WHERE 分组之前
GROUP BY id WITH ROLLUP
--只应用于计算值的列,汇总结果
--多列分组可以分别计算每组的总值
HAVING total>500
--having的数据必须来自于select的列

第六章

1.编写复杂查询的介绍
2.子查询
3.IN

SELECT *
FROM products
WHERE price>(SELECT priceFROM productsWHERE id =3)
--子查询返回price,单一值
--返回多个值,则用IN

4.子查询和连接
1.时间
2,可读性

5.ALL关键字
6.ANY关键字/SOME

SELECT *
FROM invoices
WHERE invoice_total> ALL(--将上面这个数字与合集内的所有数字逐一比较--<ALL()就是小于所有元素SELECT invoice_totalFROM invoicesWHERE id=3)
--WHERE id IN()
--WHERE id = ANY()

7.相关子查询 Correlated Subqueries

SELECT *
FROM employees e
WHERE salary>(SELECT AVG(salary)FROM employeesWHERE office_id = e.office_id--e.id指代当前循环的数据条的特定id,比如第一位员工在部门1,则avg salary重新遍历表格找到部门1的所有salary计算;第二位员工在部门2,则e.id更改为2,之后同理--类似for循环--查询速度更慢,很花时间
)

8.EXISTS

SELECT *
FROM clients c
WHERE id IN (SELECT DISTINCT idFROM invoices--返回有发票的客户id--产生很大的结果集,数据成千上万时会影响)
WHERE EXISTS(SELECT idFROM invoicesWHERE id = c.id--返回符合这个条件的记录record--处理大型数据,效率更高--并没有产生结果集,只产生true或false)

9.SELECT子句中的子查询
10.FROM子句中的子查询

SELECT *
FROM(SELECT id,total,(SELECT AVG(total)FROM invoices) AS invoice_average,invoice_total - (SELECT invoice_average) AS difference--average 作为刚刚新建的列不能直接引用,需要select套娃FROM invoices
) AS sumsalary--FROM语句子查询仅限于简单查询
--视觉上太错乱了

第七章:内置函数

1.数值函数numeric functions

SELECT ROUND(5.73,1)
--四舍五入
--第二个参数指定精度,保留到小数点后几位
SELECT TRUNCATE(5.2345,2)
--保留2位小数,舍去其余数字
SELECT CEILING(5.7)
--返回≥该数字的最小整数
--返回6
SELECT FLOOR(5.7)
--返回≤该数字的最大整数
SELECT ABS(-1)
--返回绝对值
SELECT RAND()
--生成0-1区间的随机浮点数

2.字符串函数string

LENGTH('SKY')
--返回长度
UPPER('a')
--返回大写字母
LOWER('A')
--小写
LTRIM('    A')
--left trim
--删除左侧空格或其他预定字符
RTRIM('a    ')
--right,删除右侧
TRIM('   a   ')
--删除所有空格
LEFT('ASAFWF',3)
--返回前n个字符
RIGHT('AFWEZV',2)
--返回后n个字符
SUBSTRING('AFWESDCZVDV',n,m)
--返回从第n个字符开始的m个字符
--没有第0个字符
--m置空默认之后所有字符
LOCATE('VSOD','ADFOJDVSOD',)
--搜索string1在string2中的位置
--不区分大小写
--若找不到则返回0
--很多语言中返回-1
REPLACE('KINDERGARTEN','GARTEN','GARDEN')
--在string1中将string2替换成string3
CONCAT('FIRST','LAST')
--无缝连接两个字符串

3.MySQL中的日期函数 Date Functions

SELECT NOW(), CURDATE(),CURTIME()
--get the current date and time
YEAR(NOW())
--return only year
--also for date and month,minute,second
--return values
DAYNAME(NOW()),MONTHNAME(NOW())
--return day as a string
EXTRACT(YEAR FROM NOW())

4.格式化日期和时间 Formatting dates and Times

DATE_FORMAT(NOW(),'%y')
--2019, y for 19, Y for 2019
--similarly, %m for 03 ,%M for March
--'%M %d %Y' for 'March 11 2019'
TIME_FORMAT(NOW(),'%H:%i %p')
--'12:58 PM'

5.计算时间 Calculating dates and times

DATE_ADD(NOW(), INTERVAL 1 DAY--YEAR--MONTH)
-- DATE_SUB() minus
DATEDIFF('2021-01-05','2021-01-01')
--return the day of their difference(4), not hour or minute
TIME_TO_SEC('01:00')
--return the number of seconds since midnight
--return 60*60 = 3600
  1. IFNULL 和 COALESCE
SELECT id,IFNULL(shipper_id,'NOT assigned') AS  shipper
--if the first argument is null, replace it with the last argumentCOALESCE(shipper_id,comments,'NOT assigned') AS  shipper
--return the first non-null value
FROM orders
  1. IF function
    archived 归档
    quote 引号
IF(expression, first,second)
--if exp is true, return first value, otherwise return second value

8.CASE operator

CASE WHEN YEAR(order_date)= YEAR(NOW()) THEN 'ACTIVE'WHEN ... THEN... --end with default 'break' 不再进行接下来的查询WHEN ... THEN...ELSE 'FUTURE'END --formationAS CATEGORY--more than two situations

第八章

1.创建视图 Creating Views
Simplify the queries
filter 筛选;过滤

CREATE VIEW sales AS
--creating a view in navigator panel//panel面板
--we can use it just like a virtul table
--views dont save data -different from real tableSELECTc.id,c.name,SUM(invoice_total) AS total_sales
FROM c
JOIN invoices ii USING(id)
GROUP BY id, nmae

2.Altering or Dropping Views
更改或者删除视图

CREATE VIEW new_view
DROP VIEW new_view
CREATE OR REPLACE VIEW new_view
--source control
  1. Updatable Views
    recap 概括;摘要;回顾
    recap on what we have discussed
    TO recap, most of time we …
--DISTINCT
--Aggregate functions(min,max)
--GROUP BY/ HAVING
--UNION
--NOT Having any expression above, then we call this view updatable
--and then we can use these views in statements like INSERT, UPDATE, DELETE
CREATE OR REPLACE VIEW balance AS
SELECT id,number,date,total1 - total2 AS balance
FROM invoices
WHERE (total1 - total2) >0
--refresh the view
--modify the data
DELETE FROM balance
WHERE id = 1
--similarly, update-set,
UPDATE balance
SET DUE_DATE = 01
WHERE ID = 1

4.with option check子句保护数据
update有时候会使整行记录消失

--在建立view的时候最后一行补充
CREATE OR REPLACE VIEW new
...
...
...
WITH CHECK OPTION
--prevent UPDATE or DELETE statement from excluding rows from the view

5.Other benefits of views
simplify the queries
reduce the impact of changes -data security
restrict access to the data (for users

第九章:存储过程

1.What are stored procedures

reason:
application - database - simply call the procedure to get data
store it where it belongs
what:
is database object that contains the block of sql code
benefits:
store and organize sql
faster execution
data security(limit user

2.creating a stored procedure

DELIMITER $$
--设置默认分隔符
CREATE PROCEDURE get_clients ( )
BEGINSELECT * FROM clients;--每个语句后使用分号
END$$
--between BEGIN and END are the body of the procedureDELIMITER ;
--set dilimiter bact to semicolon分号
CALL get_clients()
--执行存储过程
--其他编程语言也可以call it
USE sql_invoicing
DELIMITER $$CREATE PROCEDURE get_invoices_with_balance()
BEGINSELECT *FROM invoicesWHERE invoice_total - payment_total > 0;
END$$DELIMITER ;

3.使用mysql工作台创建存储过程
直接右键stored procedures-create
不用担心分隔符的设置

CREATE PROCEDURE `new_procedure` ()
--英文模式下敲esc下面这个键`
--右下角apply

4.dropping stored procedure

DROP PROCEDURE new_procedure
--只能删除一次
DROP PROCEDURE IF EXISTS new_procedure ;
--safer
--create it again

5.参数 parameters (形参) arguments 实参
6.-with default value

USE sql_invoicing;
DROP PROCEDURE IF EXISTS get_clients_bystate;DELIMITER $$;
CREATE PROCEDURE get_clients_bystate
(--parametersstate CHAR(2),--逗号分隔不同参数)
BEGINIF state IS NULL THEN SET state = 'CA';END IF;--regular(IF;ELSE;END IF;)--必须填NULL不能直接放空SELECT *FROM clients cWHERE c.state = state;--或者:WHERE c.state = IFNULL(state, c.state);--IFNULL(A,B),IF A=0, RETURN B
END$$
DELIMITER ;--生成后调用
CALL get_clients_bystate('CA')
--返回地点为CA的客户--所有参数必须填写,否则报错

7.参数验证 Parameter validation

CREATE PROCEDURE makepayment
( invoice_id INT,payment_amount DECIMAL(9,2),--带小数点的数,9总位数,2小数点后payment_date DATE
)
BEGIN IF payment_amout<= 0 then SIGNAL SQLSTATE '22003' SET MESSAGE_TEXT ="invalid payment amount";--超出数值范围--SIGNAL 类似抛出异常--不同错误有不同的数据错误代码END IF;UPDATE invoices iSET i.payment_total = payment_amounti.payment_date = payment_dateWHERE i.invoice_id = invoice_id;
END

8.输出参数 output parameters

CREATE PROCEDURE get_unpaid
(id INT,OUT invoices_count INT,--TINYINTOUT invoices_total DECIMAL(9,2))
BEGIN SELECT COUNT(*),SUM(invoice_total)INTO invoices_count, invoices_total --将select所得into到输出参数里FROM invoices iWHERE i.id = idAND payment_total = 0
END
--调用时
set @invoices_count = 0;
set @invoices_total = 0;--@用户或回话变量,User or session variables
call get_unpaid(3,@invoices_count,@invoices_total);
select @invoices_count,@invoices_total;

9.变量 variables
local variable,存储过程或者函数中的变量

CREATE PROCEDURE getrisk()
BEGIN--声明变量DECLARE risk_factor DECIMAL (9,2) DEFAULT 0;DECLARE invoices_total DECIMAL (9,2);DECLARE invoices_count INT;SELECT COUNT(*),SUM(invoice_total)INTO invoices_count,invoices_totalFROM invoices;SET risk_factor = invoices_total / invoices_count *5;SELECT risk_factor;
END--调用结束之后本地变量自动删除

10.函数 Functions
建立自己的函数
函数只能返回单一值
存储过程能返回多列

CREATE FUNCTION getrisk(client_id INT)
RETURN INTEGER
--设置返回类型
DETERMINISTIC--同一参数返回固定值,确定性
READS SQL DATA--读取sql数据
MODIFIES SQL DATA--更新删除修改BEGINDECLARE risk_factor DECIMAL (9,2) DEFAULT 0;DECLARE invoices_total DECIMAL (9,2);DECLARE invoices_count INT;SELECT COUNT(*),SUM(invoice_total)INTO invoices_count,invoices_totalFROM invoices i;WHERE i.client_id = client_id;SET risk_factor = invoices_total / invoices_count *5;RETURN risk_factor;
END
--调用函数
SELECT client_id,name,getrisk(client_id)
FROM clients;
--删除函数
DROP FUNCTION IF EXISTS getrisk;

11.Other conventions其他约定
不同公司的习惯不同。命名习惯。

第十章 触发器 trigger

A block of SQL code that automatically gets executed before or after an insert, update or delete statement.
在插入,更新和删除语句前后自动执行的sql代码。
增强数据一致性。data consistency

DELIMITER $$
CREATE TRIGGER payment_after_insert
--命名:位置-before/after-functionAFTER INSERT ON payments--不能用于本表格,否则无限自燃--BEFORE--UPDATE/DELETEFOR EACH ROW
BEGINUPDATE invoicesSET payment_total = payment_total + NEW.amount--NEW: 返回刚刚插入的行--OLD:返回更新前的行以及对应数值WHERE invoice_id = NEW.invoice_id;
END $$
DELIMITER ;--测试
INSERT INTO payments
VALUES (DEFAULT,5,3,'2019-01-01',10,1)--create a trigger that gets fired  when we
--delete a payment
DELIMITER $$
CREATE TRIGGER payments_after_deleteAFTER DELETE ON paymentsFOR EACH ROW
BEGINUPDATE invoicesSET payments_total = payments_total - OLD.amountWHERE invoice_id = OLD.invoice_id;
END $$
DELIMITER ;--测试
DELETE
FROM payments
WHERE payment_id = 10;

2.Viewing triggers

SHOW TRIGGER--FILTER
SHOW TRIGGER LIKE 'payments%'
--table_after/before_insert/update/delete

3.Dropping triggers
最好将删除和建立的代码都放入同一个源代码库中
令团队中的其他人都可以创建同样的数据库
还可以看历史数据修改记录

DROP TRIGGER IF EXISTS payments_after_insertCREATE TRIGGER ...

4.使用触发器进行审计 Using triggers for auditing
为了之后审计的目的而记录对数据库的修改

...
--创建表格记录audit审计记录
BEGIN
...
INSERT INTO payments_audit
VALUES(NEW.client_id,NEW.date,NEW.amount,'insert',NOW());
--插入功能
...
INSERT INTO payments_audit
VALUES(old.client_id,old.date,old.amount,'delete',NOW());
--删除功能
...
END

5.事件 events
a task (or block of sql code) that gets executed according to a schedule
根据计划执行,按照规律或者只执行一次
删除过期数据,或者复制,或者汇总等等
turn on mysql events schedule 事件调度器,是后台程序

SHOW VARIABLES;
--系统变量
SHOW VARIABLES LIKE 'event%';
-- if off
SET GLOBAL event_scheduler = ON;
-- or off

创建:

DELIMITER $$CREATE EVENT yearly_delete_stale_audit_rows
--命名时第一个词常用xxxly,方便查找
ON SCHEDULEAT '2019-05-01'--only onceEVERY 1 HOUR STARTS '2019-01-01' ENDS '2020-01-01'-- 1 YRER 1 MONTH etc--STARTS ENDS都不是必须的
DO BEGIN --执行events DELETE FROM payments_auditWHERE action_date < NOW() - INTERVAL 1 YEAR;--DATEADD(NOW(),INTERVAL 1 YEAR)--DATESUB()--删除超过一年的审计记录
END $$DELIMITER ;

6.查看,删除和更改事件 Viewing, Dropping and Altering

SHOW EVENTS LIKE 'yearly%';
DROP EVENTS IF EXISTS yearly_delete_stale_audit_rows;
ALTER EVENT yearly_delete_stale_audit_rows DISABLE;
--用法和CREATE一样
--不用删除和建立,直接DISABLE or ENABLE

十一章 事务 TRANSACTIONS

1.事务和并发 transactions
is a group of SQL statements that represent a single unit of work
表示单个工作单元的一组sql语句
每条语句都正常执行才算完成,transaction completed
一条失败则全部失败,所有更改都会撤销
properties特点:
Atomicity 原子化,牢固
consistency 一致性
isolation 隔离,不会互相干扰,不同事物对同样的数据分开执行
Durability 持久性 提交后更改是永久的

  1. Creating transactions
START TRANSACTION;
--开始
INSERT INTO orders (cuscomer_id,order_date,status)
VALUES(1,'2020-01-01',1);INSERT INTO order_items
VALUES(LAST_INSERT_ID(),1,1,1);COMMIT;
--结束ROLLBACK;
--把commit改成这个,退回事务并撤销所有更改

3.并发和锁定 concurrency and locking
mysql默认行为
多名用户同时对数据进行操作。
当一个事务对某row进行操作,但是还没有结束操作时,系统将会对该row上锁
不允许其他事务插入操作

START TRANSACTION
UPDATE customers
SET points= points +10
WHERE customer_id = 1;
COMMIT;

4.并发问题
常见问题:1.lost updates,丢失更新,较晚提交的事务会覆盖先前的
2.dirty reads,当一个事务读取了尚未提交的数据
事务隔离:1.read committed 只读取已提交数据
3.Non-repeating Reads 不可重复读,防止读取两次却获得不同数据
事务隔离:2.Repeatable read 读取的数据是可重复和一致的
4.Phantom reads 幻读
事务隔离:3.Serializable 序列化 如果其他事务修改了可能影响查询结果的数据,该事务需要等待其他事务结束之后再执行
最高级,等待时间久,会损害性能和可扩展性。

5.Transaction isolation levels

更低的隔离级别更容易并发,也更容易出现问题。用的lock少。
更高的隔离级别限制并发,减少并发问题,降低性能和可扩展性。lock多。
mysql默认隔离级别:Repeatable read

前两种大多数时候用于 不需要精确的一致性的 批量报告或者数据不怎么更新的情况

--查看当前隔离级别
SHOW VARIABLES LIKE 'transaction_isolation';
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
--为下一个事务设置
SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;
--当前会话的未来所有事务都设置
SET GLOBAL TRANSACTION ISOLATION LEVEL SERIALIZABLE;
--所有会话的所有新事务设置全局隔离级别--应用程序对接数据库流程
--连接sql,修改隔离级别,执行事务,断开连接
  1. 读未提交隔离级别 read uncommitted isolation level
  2. 读已提交隔离级别
  3. 可重复读隔离级别
  4. 序列化隔离级别
  5. 死锁deadlocks
    互相等待对方解锁,僵持不下无法解开锁,死循环。
    非高峰,避开活跃用户。

数据类型 DATA TYPES

1.introduction 数据类型
string types
numeric types
date and time types
blob types 存储二进制数据
spatial types 存储几何或者地区值的空间类型

byte 即字符
英语一个字母占1字符,中文日文占3字符

2.string
CHAR(x) 固定长度 fixed-length
VARCHAR(x) 可变长度 max 65535
VARCHAR(50) for short strings
VARCHAR(255) for medium-length strings
VARCHAR 可以被编入索引
MEDIUMTEXT 中 文本串 max:16MB
LONGTEXT 长文本串 max:4GB
TINYTEXT 微文本串 max:255 bytes
TEXT 文本类型 max:64KB

3.integer 没有小数点的整数
TINYINT 1b [-128, 127]
UNSINGED TINYINT [0, 255] 用于存储年龄等
SMALLINT 小整型 2b [-32k, 32k]
MEDIUMINT 中整型 3b [-8M, 8M]
INT 4b [-2B, 2B]
BIGINT 8b [-9Z, 9Z]

ZEROFILL 补零

4.定点数和浮点数
rationals.
decimal(p,s) 总共p位precision 小数点后s位
同意义: DEC NUMARIC FIXED

DOUBLE 8b
FLOAT 4b
科学计算,精度小

5.布尔类型,boolean
TRUE or FALSE,即1或0

6.枚举和集合类型
枚举ENUM

ENUM('SMALL','MEDIUM','LARGE')
--不建议使用

7.日期和时间类型
DATE
TIME
DATETIME
TIMESTAMP 时间戳 4b 记录某行插入或最近更新的时间
YEAR

8.Blob类型
TINYBLOB 255b
Blob 65KB
MEDIUMBLOB 16MB
LONGBLOB 4GB

–一般不往数据库里存储图像视频等文件

9.JSON类型
Lightweight format for storing and transferring data over the internet
是一种通过网络存储和传输数据的轻量级格式
在网络和移动应用中使用
JSON
{
“keys” : value
}
大括号和键值对

USE sql_store;
UPDATE products
SET properties = '
{"dimensions": [1,2,3],"weight" :10,"manufacturer" : {"name" :"sony"}
}
'
WHERE product_id = 1;
UPDATE products
SET properties = JSON_OBJECT('weight',10,'dimension',JSON_ARRAY(1,2,3),'manufacturer',JSON_OBJECT('name','sony'))
WHERE product_id = 1;
--普通查询,返回所有json
SELECT *
FROM products;--单独查询json中的特定键值对
SELECT product_id,JSON_EXTRACT(properties,'$.weight')
--arg1即当前json的列表名,¥表示当前json
FROM products;
WHERE product_id = 1;SELECT properties -> '$.weight'
--   -> 列路径运算符 column path operator
SELECT properties -> '$.dimension[0]'
--array数组里从0开始计算
SELECT properties -> '$.manufacturer.name'
--'sony'
SELECT properties ->> '$.manufacturer.name'
--sony
--修改json JSON_SET()
UPDATE products
SET properties = JSON_SET(properties,'$.weight',20,'$.age',10
)
WHERE product_id = 1;
--删除
SET properties = JSON_REMOVE(properties,'$.age'
)--json相关函数都是返回json对象

设计数据库

1.introduction

2.数据建模 data modelling
steps:
1.understand the requirements
2.build a conceptual model 构建业务的概念模型(包括识别业务中的实体,事务,或概念以及他们之间的关系)
3.build a logical model 生成逻辑模型 独立于数据技术的抽象数据模型
4.build a physical model 为特定数据库管理系统构建实体模型3.conceptual models
represents the entities and their relationships
比如人,事件,位置等等比如建立在在线课程网站:学生,课程
entity relationship (ER) 实体关系图
unified modelling languages (UML) 标准建模语言图 使用范围大于前者MODELLING TOOLS
Microsoft Visio
draw.io
LucidCharts

2.conception model

4.logical data model
基于概念模型,更细节
逻辑模型独立于数据库技术

步骤:1.指定数据类型
2.指定实体之间关系的类型
ont-to-one
one-to-many
many-to-many
一个学生可以注册多个课程,一门课程可以有多个学生

注册是一件学生和课程之间共同的关系
所以需要将“注册”作为另一个实体
一个学生可以有多门注册
一门课程被注册很多次


5.实体模型 physical models
File- New Model -
EER - enhance entity relationship


6.主键 Primary Keys
composite 复合主键包括多个列
introduce 引入id列

7.外键 Foreign Keys
在一张表汇总引用了另一张表主键的那列
学生 1 - m 注册
父表


8.外键约束 Foreign keys constraints
table - foreign keys - on update -
cascade -如果主键更改,mysql自动更新子表中的记录
restrict -拒绝更新
set null -如果键值变化则自动设为null

on delete -
cascade - 自动删除
  1. 标准化 normalization
    审查设计,确保它遵循一些防止数据重复的预定义规则的过程
    七范式:(重点前三)normal form

10.第一范式
1.each cell should have a single value and we cannot have repeated columns
一行中每个单元格都有单一值,且不能出现重复列
tags VARCHAR(255) -单元格里有多个值 -不知道会有几个标签
-增加新table命名为tags

11.链接表 link tables
mysql里没有n对n连接线
引入新表 将n对n变成 1对n n对1

12.第二范式
every table should describe on entity
and every column in that table should describe that entity
比如说注册时间不是课程属性,而是注册属性,所以需要引入注册实体
orders table里不应该有customer_name
同理 courses table不应该有instructor

每次引入外键之后都要记得设置外键约束,update cascade ,delete no action

13.第三范式
A column in a table should not be derived from other columns
balance = invoice - payment
应该将balance另起一个表格

14.实用建议 pragmatic advice
实际项目中只需要专心消除冗余

15.不要对什么都建模Don’t model the universe
简单 simplicity is the ultimate sophistication

16.模型的正向工程
forward engineering a model

错误


不要多勾选column的第一行student_id!!!!!

16.模型的正向工程
forward engineering a model

17.数据库同步模型
Synchronizing a model with a database
生产环境production environment用户访问应用程序或者数据库的地方
阶段环境staging environment 接近生产环境
测试环境
开发环境
每个环境都有一个或多个服务器
开发人员更改时需要在其他服务器上同步更改

正向工程:在没有数据时生成一个全新数据库
同步数据:在model中做的更改进行同步

  1. 反向工程 Reverse engineering a database
    database - reverse
    用于没有model的数据库
    1.先建立model
    –注意只能同时打开一个model
    –除非数据库高度相关,否则不一次性选定多个数据库进行建模

19.项目:航班订票系统
20.概念模型
不必纠结几对几的关系,连起来就完了
确认主题entity:
乘客(名字),
乘客-预订-航班
预订(号码,价格,舱位,确认号码)
航班(航班号,起飞时间,到达时间,飞行时间,距离,航空公司),

机场(代码,名字,城市,州)


21.逻辑模型
1.确认几对几
一个乘客对多个机票
一个航班对多个机票
一个机场有多个航班,一个航班可以有两个机场
2.确认数据类型
string
通常将名字分为last name和first name
date time
INT
命名时命名清楚单位 DistanceInMiles

(由于经常会出现重复情况)
增加实体:航空公司 1 对 n 航班
增加实体:舱位,一个舱位可以有多张票
更改属性:由于一个航班只有两个机场,所以可以直接分设两个外键

22.项目 视频租赁应用程序
23.概念模型
1.阅读业务需求,确认主体:
User: username, password,
Permission: description
Customer: name, email, phone
Movie: barcode(条形码), daily rental rate, numberInStock,
Rental: numberOfDays,
Coupon: code, description, discount

24.逻辑模型
1.回顾业务需求
增加实体:Role: name, 1 对 n users
删去实体:permission
2.确认数据类型
rental - 1 - 0 - coupon
租金可以有优惠券,优惠券不会有租金

25.创建和删除数据库

CREATE DATABASE IF NOT EXISTS sql_store2;
DROP DATABASE IF EXISTS sql_store2;

26.创建表

USE sql_store2;
DROP TABLE IF EXISTS customers;
CREATE TABLE IF NOT EXISTS customers
(customer_id INT PRIMARY KEY AUTO_INCREMENT,first_name VARCHAR(50) NOT NULL,points INT NOT NULL DEFAULT 0,email VARCHAR(255) NOT NULL UNIQUE
);

17.修改表

ALTER TABLE customersADD last_name VARCHAR(50) NOT NULL AFTER first_name,ADD city      VARCHAR(50) NUT NULL,MODIFY COLUMN first_name VARCHAR(55) DEFAULT '',DROP points;--最好只在测试环境中修改

28.创建关系

DROP TABLE IF EXISTE orders;
CREATE TABLE orders
(order_id INT PRIMARY KEY,customer_id INT NOT NULL,FOREIGN KEY fk_orders_customers(customer_id)REFERENCES customers(customer_id)ON UPDATE CASCADEON DELETE NO ACTION
);

DROP时先删除子表再删除主表

29.更改主键和外键约束

--在建立表之后更改主键
ALTER TABLE ordersDROP FOREIGN KEY fk_orders_customers,ADD FOREIGN KEY fk_orders_customers(customers_id)REFERENCES customers(customer_id)ON UPDAT CASCADEON DELETE NO ACTION;

30.字符集和排序规则
类似ASCII码
更新charset来节省数据量

CREATE DATABASE dbCHARACTER SET latin1,name VARCHAR(5) CHARACTER SEt latin1 NOT NULL;

31.存储引擎 Storage Engines

SHOW ENGINES;
--MyISAM 旧版
--InnoDB 支持大多数features
--不同table可以使用不同engine
--直接设置或者
ALTER TABLE a
ENGINE = InnoDB
--会重建table,不建议产品环境使用

第十四章 高效索引

1.introduction
indexes speed up our queries

2.索引 indexes
cost: 1. increase the database
2.slow down the writes
for these reasons : reverse indexes for performance critical queries

3.creating indexes

EXPLAIN
SELECT customer_id
FROM customers
WHERE state = 'CA'
--TYPE ALL 循环所有行
--ROWS 1010  总共1010行,很慢
CREATE INDEX idx_state ON customers (state);EXPLAIN SELECT customer_id FROM customers WHERE points>1000;
CREATE INDEX idx_point ON customers (points>1000);

4.查看索引

SHOW INDEXES IN customers;
--collation-
--A for ascending
--B for decending
--cardinality 单索引共多少种不同的类型
ANALYZE TABLE customers;--primary key 自带索引,称为clustered index
--自己创建的叫secondary indexex
--type BTREE 二叉树
--外键自带索引,也是secondary

5.前缀索引 prefix indexes
string columns

CREATE INDEX idx_lastname ON customers(last_name(20))
--按照lastname的前20位查找
SELECT COUNT(LEFT(last_name,1)) FROM customers;
--left(a,b)获取a的前b位字符

6.全文索引 FULL-TEXT INDEX

USE sql_blog;
SELECT *
FROM posts
WHERE title LIKE '%REACT REDUX%' ORbody LIKE '%REACT REDUX%';
--用时久,不能完美执行任务USE sql_blog;
CREATE FULLTEXT INDEX idx_title_body ON posts(title,body);
SELECT *, MATCH(title, body) AGAINST('REACT REDUX')
--revelant score最后一列返回相关系数[0, 1]
FROM posts
WHERE MATCH(title, body) AGAINST('REACT REDUX');WHERE MATCH(title, body) AGAINST('REACT -REDUX +FORM' IN BOOLEAN MODE);
WHERE MATCH(title, body) AGAINST('"handling a form"' IN BOOLEAN MODE);
-- redux前面多个负号表示让redux不存在,in boolean表示返回0或1,必须完美符合该要求
--双引号表示完整字符串

7.组合索引 composite indexes

WHERE state ='CA' AND points > 1000;
--只将第一个作为索引CREATE INDEX idx_state_points ON customers (state, points);
--创建复合索引
DROP INDEX idx_state ON customers;

8.组合索引中的列顺序
order of columns:
put the most frequently used columns first
put the columns with a higher cardinality first
cardinality --the amount of unique member
take your queries into account

9.索引无效时 when indexes are ignored

WHERE state = 'CA' OR points>1000;
--可能这条查询会无视index
--拆分条件
SELECT customer_id FROM customers
WHERE state = 'CA'
UNION
SELECT customer_id FROM customers
WHERE points > 1000;

10.使用索引排序 for sorting

SELECT customer_id FROM customers
ORDER BY state;
--idx_state起作用

11.覆盖索引
索引不会覆盖全部列,所以最好选择已经建立好索引的列

12.维护索引
duplicate 复制
redundant 多余的

保护数据库

1.intro
2.创建一个账户
app - database
为app创建账户并授予将数据写入应用程序数据库的权限。
只读。不能修改。

CREATE USER john
--什么都不加意味着没有限制
--@127.0.0.1
--限制用户的连接位置,@后接计算机ip地址
--127.0.0.1代表本机地址
--也可以指定主机名@localhost
--域名@codewithmosh.com
--从该域的任何计算机连接(除了子网)
--'@%.codewithmosh.com' 加上%.表示任何子网域
IDENTIFIED BY 'PASSWORD';
--设置密码

3.查看用户 viewing users

SELECT * FROM mysql.user;

4.删除用户

DROP USER john@code.com;

5.修改密码

SET PASSWORD FOR john = '1234';
SET PASSWORD = '1234';
--为当前用户改密码
--or navigator panel

6.授予权限 Granting privileges

--WEB / APP
--only read
CREATE USER moon_app@xxx.com IDENTIFIED BY 'PASSWORD';
GRANT SELECT, INSERT, UPDATE, DELETE, EXECUTE
ON sql_store.*
--sql_store.customers
TO moon_app@xxx.com;--admin
GRANT ALL
ON *.*
TO john;

7.查看权限

SHOW GRANTS FOR john;

8.撤销权限 revoking privileges

REVOKE CREATE VIEW
ON sql_store.*
FROM moon.app;

9.WRAP UP 总结

MySQL入门 初学者详细笔记相关推荐

  1. mysql入门很简单系列视频-学习笔记

    mysql入门很简单系列视频-学习笔记 视频链接:mysql入门很简单系列视频 https://www.bilibili.com/video/av14920200/ 以前主要就了解DDL.DML.DC ...

  2. 尚硅谷-康师傅-MySQL详细笔记(1-9章)

    mysq详细笔记 第1章 数据库概述 1.1. 为什么要使用数据库 1.2. 数据库与数据库管理系统 1.2.1 数据库的相关概念 1.2.2 数据库与数据库管理系统的关系 1.2.3 常见的数据库管 ...

  3. MySql入门笔记二~悲催的用户

    这些是当年小弟的MySql学习笔记,木有多么复杂的结构操作,木有多炫丽的语句开发,木有...总之就是木有什么技术含量... 日复一日,彪悍的人生伴随着彪悍的健忘,运维操作为王,好记性不如烂笔头,山水有 ...

  4. 【内容详细、源码详尽】MySQL极简学习笔记

    碎话 本人整理资料时,发现了之前学习MySQL时做的笔记.笔记内容做的蛮好的,值得分享给大家.所以根据自己的学习能力.精力.空余时间情况,把笔记整理成了四天的学习章节. 每一个DQL.DML.DDL语 ...

  5. 轩小陌的Python笔记-day25 MySQL入门

    第四模块 MySQL数据库 从今天开始将进入第四模块的学习,这个模块就是给大家讲解MySQL数据库. 以前,在开发程序时,我们会把很多的数据和信息存储到某个文件夹中的文件中,例如:user.txt . ...

  6. 【mysql入门笔记01 2022.9.27】

    mysql入门笔记01 2022.9.27 数据库概念 数据库管理系统 关系型数据库(RDBMS) 非关系型数据库(NoSQL) SQL概念 Mysql 版本 Mysql安装 Mysql启动 方式一 ...

  7. Java并发编程(中下篇)从入门到深入 超详细笔记

    接上一篇博客笔记:Java并发编程(中上篇)从入门到深入 超详细笔记_未来很长,别只看眼前的博客-CSDN博客https://blog.csdn.net/weixin_53142722/article ...

  8. 清晰易懂!关于PS入门的超详细笔记!

    给大家分享一篇关于PS入门的超详细笔记!原理讲解清晰明了,虽不是新版本解析,但都是新手学习PS必掌懂的一些知识点,灰常的实用,转走收藏学习! 编辑:千锋UI设计 来源:PS学堂

  9. 超详细的MySQL入门教程(四)

    MySQL:简单的增删改查 查询数据 基本语法介绍 打印任意值 查询表中全部数据 查询表中部分字段 限定条件查询 例1:查询编号值小于指定值的记录 例2:查询地址不等于某值的记录 例3:查询一级地址等 ...

最新文章

  1. 用 Python 动态可视化,看看比特币这几年
  2. Docker创建Nexus
  3. 《Nature》重磅 | 研究员利用机器学习发现近 6000 种未知病毒
  4. java 集合反射_关于granite源码包CollectionUtil集合工具类获取集合反射类型、实例化各种集合类型HashSet/ArrayList等...
  5. cg word List5
  6. HH SaaS电商系统的标签系统设计
  7. shiro学习(10):servelet实现权限认证一
  8. mysql存储过程查询所有表_mysql存储过程利用游标查询每个数据库的所有表
  9. 桥梁模式 :Bridge(转自Terrylee)
  10. html 竖排导航条,html 导航栏
  11. N卡所有旧版本驱动下载(2021年6月3日测试可用版)
  12. 如何用纯 CSS 创作一个永动的牛顿摆
  13. 机器人辅助符文天赋符文天赋_机器人符文天赋
  14. pyc php js echarts css 数据挖掘感悟 2016.05.24回顾
  15. git push提交成功后如何撤销回退
  16. mib2c : You didn‘t give mib2c a valid OID to start with.解决
  17. 完美日记母公司逸仙电商发布Q4财报净亏损同比收窄42.5%
  18. mysql 8.0 导入文件_MySQL8.0实验-从本地文件导入数据
  19. DSP在线升级程序步骤
  20. 分享一波CSS免费可商用字体(一)

热门文章

  1. html中ul和li标签的用法介绍
  2. labview数据采集保存mysql_【源程序】基于Labview多通道数据采集系统 数据库存储...
  3. IEEE SPL文章接收后通讯作者注册IEEE账户并验证文章
  4. 回收站删除数据恢复怎么操作
  5. 多元高斯分布(Multivariate Gaussian Distribution)(详细说明,便于理解)
  6. 通过对象实现圆柱体体积计算
  7. 如何把自己写的网站项目发布到网上?
  8. Linux网络服务(中)FTP服务配置
  9. 前端:jQuery使用eq的作用
  10. 计算机毕业设计SSM宾馆管理信息系统【附源码数据库】