SQL | SQL 3小时快速入门学习笔记

【【数据库】SQL 3小时快速入门 #数据库教程 #SQL教程 #MySQL教程 #database#Python连接数据库】 课程链接

一、SQL

1.资料库管理系统(Database Management System,简称DBMS)

是整理资料的软件。其主要功能包括数据的存储、检索、更新和删除,以及对数据进行安全性、完整性和一致性的管理。以下是资料库管理系统的一些重要特征和功能:
a. 数据定义语言(Data Definition Language,DDL):用于定义数据库中的数据结构,包括表、字段、索引等。
b. 数据操作语言(Data Manipulation Language,DML):用于对数据库中的数据进行增加、删除、修改和查询等操作。
c. 数据库查询语言(Database Query Language,如SQL):用于向数据库发出查询请求,以检索所需的数据。
d. 数据库事务管理:确保数据库操作的原子性、一致性、隔离性和持久性,以支持并发访问和数据的完整性。
e. 数据库安全性管理:包括用户认证、授权和权限管理,以确保只有授权用户可以访问和操作数据库。
f. 数据备份与恢复:提供定期备份数据库的功能,并能够在需要时将数据库恢复到先前的状态。
g. 数据库性能优化:通过索引、查询优化、分区等技术提高数据库的性能和效率。
h. 数据库监控与管理:监控数据库的运行状态、性能指标和资源利用情况,并进行必要的管理和调整。
在这里插入图片描述

2.SQL(Structured Query Language,结构化查询语言)

是一种用于管理关系数据库系统的标准化语言。它允许用户定义、操作和管理数据库中的数据,以及执行各种数据库操作,如查询、插入、更新和删除数据等。具有以下几个主要方面的功能:
a. 数据查询(Query):SQL允许用户通过使用SELECT语句从数据库中检索数据。SELECT语句可以根据用户的需求从一个或多个表中选择特定的列,并根据特定的条件过滤所需的行。
b. 数据操作(Manipulation):SQL包括INSERT、UPDATE和DELETE语句,用于向数据库中添加、更新或删除数据。这些语句使用户能够对数据库中的数据进行修改,以保持数据的最新状态。
c. 数据定义(Definition):SQL提供了一组用于定义数据库结构的语句,如CREATE TABLE、ALTER TABLE和DROP TABLE等。这些语句允许用户创建新表、修改现有表的结构,或删除不再需要的表。
d. 数据控制(Control):SQL包括用于控制对数据库对象的访问权限的语句,如GRANT和REVOKE。这些语句允许数据库管理员管理用户对数据库的访问权限,以确保数据的安全性和完整性。
e. 事务控制(Transaction Control):SQL支持事务处理,通过BEGIN TRANSACTION、COMMIT和ROLLBACK等语句,允许用户在数据库中执行一系列操作,并将它们作为一个原子单元进行提交或回滚。
在这里插入图片描述
在这里插入图片描述

二、基础

1.安装:

环境:Windows系统
官网链接: MySQL Community Downloads
在这里插入图片描述
跟教程不同选下面的:
在这里插入图片描述
在这里插入图片描述

2.table and keys:

主键和外键
在这里插入图片描述

3.创建资料库:

关于database

-- 创建 指定数据库
CREATE DATABASE `sq_tutroial`;
-- 显示 所有的数据库
SHOW DATABASES;
-- 丢掉 指定数据库
DROP DATABASE `sq_tutroial`;
-- 使用 指定数据库
USE `sq_tutroial`;

关于table

-- 创建 指定表格
CREATE TABLE `student`(
	`student_id` INT PRIMARY KEY AUTO_INCREMENT,
    `name` VARCHAR(20) NOT NULL,
    `major` VARCHAR(20) UNIQUE
    );
-- 描述 指定表格的结构
DESCRIBE TABLE `student`;
-- 删除 指定表格
DROP TABLE `student`;
-- 返回 指定表格所有数据
SELECT * FROM `student`;
-- 修改 指定表格数据 添加
ALTER TABLE `student` ADD gpa DECIMAL(3,2);

关于数据格式

-- 格式
INT				-- 整数
DECIMAL(m,n)	-- 有小数点的数
VARCHAR(n)		-- 字串
BLOB			-- (Binary Large Object)图片 影片 档案...
DATE			-- 'YYYY-MM-DD'
TIMESTAMP		-- 'YYYY-MM-DD HH:MM:SS'

三、实例

在这里插入图片描述

注意:先创建主体的 Employee 和 Branch 表格,再补上 Employee 的 branch_id的foreign key设定,∵有创建顺序,后者的主键是前者的外键

1.创建

-- 创建公司表格资料库
CREATE DATABASE `sq_test`;
USE `sq_test`;
SET SQL_SAFE_UPDATES = 0;
-- 创建 employee 和 branch 表格
CREATE TABLE `employee` (
	`emp_id` INT PRIMARY KEY,
    `name` VARCHAR(20),
    `birth_date` DATE,
    `sex` VARCHAR(1),
    `salary` INT,
    `branch_id` INT,
    `sup_id` INT
    );
CREATE TABLE `branch` (
	`branch_id` INT PRIMARY KEY,
    `branch_name` VARCHAR(20),
    `manager_id` INT,
    FOREIGN KEY (`manager_id`) REFERENCES `employee`(`emp_id`) ON DELETE SET NULL
    );
-- 补上foreign key的设定
ALTER TABLE `employee`
ADD FOREIGN KEY(`branch_id`)
REFERENCES `branch`(`branch_id`)
ON DELETE SET NULL;
ALTER TABLE `employee`
ADD FOREIGN KEY(`sup_id`)
REFERENCES `employee`(`emp_id`)
ON DELETE SET NULL;
-- 创建 client 和 works_with 表格
CREATE TABLE `client` (
	`client_id` INT PRIMARY KEY,
    `client_name` VARCHAR(20),
    `phone` VARCHAR(20)
    );
    
CREATE TABLE `works_with` (
	`emp_id` INT,
    `client_id` INT,
    `total_sales` INT,
    PRIMARY KEY(`emp_id`, `client_id`),
    FOREIGN KEY(`emp_id`) REFERENCES `employee`(`emp_id`) ON DELETE CASCADE,
    FOREIGN KEY(`client_id`) REFERENCES `client`(`client_id`) ON DELETE CASCADE
    );
-- 增加部门资料
INSERT INTO `branch` VALUES(1, '研发', 206);
INSERT INTO `branch` VALUES(2, '行政', 207);
INSERT INTO `branch` VALUES(3, '咨询', 208);

-- 增加员工资料
INSERT INTO `employee` VALUES(206, '小黄', '1998-10-08', 'F', 50000, 1, NULL);
INSERT INTO `employee` VALUES(207, '小绿', '1985-09-16', 'M', 29000, 2, 206);
INSERT INTO `employee` VALUES(208, '小黑', '2000-12-19', 'M', 35000, 3, 206);
INSERT INTO `employee` VALUES(209, '小白', '1997-01-22', 'F', 39000, 3, 207);
INSERT INTO `employee` VALUES(210, '小蓝', '1925-11-10', 'F', 84000, 1, 207);

-- 增加客户资料
INSERT INTO `client` VALUES(400,'阿狗','254354335');
INSERT INTO `client` VALUES(401,'阿猫','25633899');
INSERT INTO `client` VALUES(402,'旺来','45354345');
INSERT INTO `client` VALUES(403,'露西','54354365');
INSERT INTO `client` VALUES(404,'艾瑞克','18783783');

-- 增加合作资料
INSERT INTO `works_with` VALUES(206,400,'70000');
INSERT INTO `works_with` VALUES(207,401,'24000');
INSERT INTO `works_with` VALUES(208,400,'9800');
INSERT INTO `works_with` VALUES(208,403,'24000');
INSERT INTO `works_with` VALUES(210,404,'87940');

2.练习:

-- 1.取得所有员工的资料
SELECT * FROM `employee`;
-- 2.取得所有客户的资料
SELECT * FROM `client`;
-- 3.按照薪水低到高取得员工资料
SELECT * FROM `employee` ORDER BY `salary`;
-- 4.取得薪水前3高的员工的资料
SELECT * FROM `employee` ORDER BY `salary` DESC LIMIT 3;
-- 5.取得所有员工的名字
SELECT * FROM `employee` ORDER BY `name`;
-- aggregate function 聚合函数
-- 1.取得员工人数
SELECT COUNT(*) FROM `employee`;
-- 2.取得所有出生于1970-01-01之后的女性员工人数 
SELECT COUNT(*) FROM `employee` 
WHERE `birth_date` > '1970-01-01' AND `sex` = 'F';
-- 3.取得所有员工的平均薪水 
SELECT AVG(`salary`) FROM `employee`;
-- 4.取得所有员工薪水的总和 
SELECT SUM(`salary`) FROM `employee`;
-- 5.取得薪水最高的员工 
SELECT MAX(`salary`) FROM `employee`;
-- 6.取得薪水最低的员工
SELECT MIN(`salary`) FROM `employee`;
-- wildcards 万用子元  % 代表多个子元, _ 代表一个子元
-- 1.取得电话号码尾数是355的客户
SELECT * FROM `client` 
WHERE `phone` LIKE '%335';
-- 取得电话号码开头是123的客户
-- SELECT * FROM `client` WHERE `phone` LIKE '123%';
-- 取得电话号码包含是123的客户
-- SELECT * FROM `client` WHERE `phone` LIKE '%123%';
-- 2.取得姓艾的客户
SELECT * FROM `client` 
WHERE `client_name` LIKE '艾%';
-- 3.取得生日在12月的员工
SELECT * FROM `employee` 
WHERE `birth_date` LIKE '_____12%';
-- union 联合查询 并集
-- 1.员工名字 union 客户名字 1+1 同属性
SELECT `name` FROM `employee` 
UNION 
SELECT `client_name` FROM `client`;
-- 2.员工id + 员工名字 union 客户id + 客户名字
SELECT `emp_id` AS `total_id`, `name` AS `total_name` FROM `employee` 
UNION 
SELECT `client_id`, `client_name` FROM `client`;
-- 3.员工薪水 union 销售金额
SELECT `salary` AS `total_salary` FROM `employee` 
UNION 
SELECT `total_sales` FROM `works_with`;
-- join 连接
INSERT INTO `branch` VALUES(4, '偷懒', NULL);
-- 取得所有部门经理的名字
SELECT `employee`.`emp_id`, `employee`.`name`, `branch`.`branch_name` 
FROM `employee` LEFT JOIN `branch` 
ON `employee`.`emp_id` = `branch`.`manager_id`;
-- 不论 on 的条件成立与否,左面的表格都会回传全部资料,只有条件成立右边的表格才会回传资料,其他则是NULL
-- SELECT `employee`.`emp_id`, `employee`.`name`, `branch`.`branch_name` 
-- FROM `employee` RIGHT JOIN `branch` 
-- ON `employee`.`emp_id` = `branch`.`manager_id`;
-- subquery 子查询
-- 1.找出研发部门的经理名字
SELECT `name` FROM `employee` WHERE `emp_id` = (
	SELECT `manager_id` FROM `branch` WHERE `branch_name` = '研发'
);
-- 2.找出对单一位客户销售金额超过50000的员工的名字
SELECT `name` FROM `employee` WHERE `emp_id` IN (
	SELECT `emp_id` FROM `works_with` WHERE `total_sales` > 50000 
);
-- 因为超过两笔 所以用 IN
-- on delete
-- 	ON DELETE  SET NULL
-- CREATE TABLE `branch` (
-- 	`branch_id` INT PRIMARY KEY,
--     `branch_name` VARCHAR(20),
--     `manager_id` INT,
--     FOREIGN KEY (`manager_id`) REFERENCES `employee`(`emp_id`) ON DELETE SET NULL
--     );
-- manager_id 对应的 emp_id 被删掉了 就把manager_id设为NULL
--	 ON DELETE CASCADE 级联删除
-- CREATE TABLE `works_with` (
-- 	`emp_id` INT,
--     `client_id` INT,
--     `total_sales` INT,
--     PRIMARY KEY(`emp_id`, `client_id`),
--     FOREIGN KEY(`emp_id`) REFERENCES `employee`(`emp_id`) ON DELETE CASCADE,
--     FOREIGN KEY(`client_id`) REFERENCES `client`(`client_id`) ON DELETE CASCADE
--     );
-- CASCADE针对左表关联列为首要键所在的列,且由于首要键列不得为NULL,所以采取CASCADE的清空本行的
-- 如果某一个值同时是primary key 或者 foreign key就不能用ON DELETE SET NULL

3.sql连接python:

选用:Vscode
终端安装包:pip install mysql-connector-python
打开Vscode,

import mysql.connector

打开指定的连接

connection = mysql.connector.connect(
    host='localhost',
    port='3306',
    user='root',
    password='密码',
    database='指定的database名字'
)
cursor = connection.cursor()
# 创建资料库
cursor.execute("CREATE DATABASE `指定的table名字`;")
# 取得所有资料库名称
cursor.execute("SHOW DATABASES;")
records = cursor.fetchall()
for r in records:
    print(r)
# 选择资料库
cursor.execute("USE `指定的资料库名字`;")
# 创建表格
cursor.execute("CREATE TABLE `指定的database名字`(指定的database名字 INT);")
# 查看`branch`表里面数据
cursor.execute("SELECT * FROM `branch`;")
records = cursor.fetchall()
for r in records:
    print(r)
# 新增 table 数据
cursor.execute("INSERT INTO `branch` VALUES(5, 'qq', NULL);")
# 修改 table 数据
cursor.execute("UPDATE `branch` SET `manager_id = NULL WHERE `branch_id` = 4;")
# 删除 table 数据
cursor.execute("DELETE FROM `branch` WHERE `branch_id` = 5;")
cursor.close()
connection.commit() #改动资料就要加上这一句
connection.close()
  • 27
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yatingliu2019

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值