SQL基础教程代码

不是知识的生产者,只是教程的搬运工。原B站视频链接如下,建议1.5倍速使用。

【数据库】SQL 3小时快速入门 #数据库教程 #SQL教程 #MySQL教程 #database#Python连接数据库_哔哩哔哩_bilibili

根据视频所敲代码如下,有一些自己添加的注释,纯小白

-- https://www.bilibili.com/video/BV1PT4y1e7UU/?share_source=copy_web&vd_source=db6a78f582ae44efdbe2dd6d7395bc83

CREATE DATABASE `database` ;  -- 创建数据库
SHOW DATABASES; -- 显示所有数据库
DROP DATABASE `database`; -- 删除数据库、表

-- constraints 限制、约束
CREATE DATABASE `sql_tutorial`;  -- ctrl+enter 快速运行,` Tab上面的键
USE `sql_tutorial`;
CREATE TABLE `student`(
	`student_id` INT AUTO_INCREMENT,  -- AUTO_INCREMENT自动增加序号 
    `name` VARCHAR(20), -- 可以加特定约束,比如 not null就限制了`name`里必须要有内容,UNIQUE属性限制唯一性,DEFAULT后可跟预设值
    `major` VARCHAR(20),
    PRIMARY KEY(`student_id`)
);
DROP TABLE `student`;
DESCRIBE `student`; -- 查看表格

ALTER TABLE `student` ADD gpa DECIMAL(3,2); -- 新增表格属性,删除将ADD换成DROP COLUMN 即可
ALTER TABLE `student` DROP COLUMN gpa;  -- DECIMAL(3,2) 3位数,小数点后有2位

SELECT * FROM `student`; -- 搜寻表格所有资料
INSERT INTO `student` VALUES(1, '小白', '历史'); -- 表格填值
INSERT INTO `student` VALUES(2, '小黑','生物'); -- 也可以自己决定填入顺序,在`student`后加(`name`,`major`,`student_id`)
INSERT INTO `student` VALUES(3, '小绿', NULL);-- 不填默认null


-- 修改、删除资料
SET SQL_SAFE_UPDATES = 0; -- 删除预设更新

-- DROP TABLE `student`; 
CREATE TABLE `student`(
	`student_id` INT PRIMARY KEY AUTO_INCREMENT, 
    `name` VARCHAR(20), 
    `major` VARCHAR(20),
    `score` INT
);
-- INSERT INTO `student`(`name`,`major`,`score`) VALUES('小白', '英语', 50);
-- INSERT INTO `student`(`name`,`major`,`score`) VALUES('小黄', '生物', 90);
-- INSERT INTO `student`(`name`,`major`,`score`) VALUES('小绿', '历史', 70);
-- INSERT INTO `student`(`name`,`major`,`score`) VALUES('小蓝', '英语', 80);
-- INSERT INTO `student`(`name`,`major`,`score`) VALUES('小黑', '化学', 20);
SELECT * FROM `student`; -- 搜寻表格所有资料; 
UPDATE `student`
SET `major`='生化'
WHERE `major` = '生物' OR `major` = '化学'; -- WHERE 是限定条件属性,不加一列均变成生化

UPDATE `student`
SET `name`= '小灰', `major`='物理'
WHERE `student_id`=1;

DELETE FROM `student`
WHERE `student_id` = 4;  -- 删除资料,WHERE同样可以写多个条件,不写则删除所有资料
DELETE FROM `student`
WHERE `score` < 60; 


-- 取得资料
SELECT `name`,`major` FROM `student`; -- 选择性获取资料
SELECT * FROM `student` ORDER BY `score` DESC; -- 获取资料并排序,DESC由高到低 ASC由低到高,ORDER BY后也可跟多个属性,
SELECT * FROM `student` ORDER BY `score` DESC LIMIT 1; -- 由高到低取第一个资料
SELECT * FROM `student` WHERE `major` = '英语' OR `score` <> 70; -- <>表示不等于


-- 创建公司资料库表格
DROP TABLE `student`;
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  -- ON DELETE SET NULL:当某个emp_id不存在时,manager_id为NULL
 );
ALTER TABLE `employee`
ADD FOREIGN KEY (`branch_id`)
REFERENCES `branch`(`branch_id`)
ON DELETE SET NULL; -- `employee`表中外键连接`branch`中的值

ALTER TABLE `employee`
ADD FOREIGN KEY (`sup_id`)
REFERENCES `employee`(`emp_id` )
ON DELETE SET NULL;  -- 就算是本表属性设外键,也要先创表再引用

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, -- ON DELETE CASCADE:当某个emp_id不存在时,整笔资料都删掉
FOREIGN KEY (`client_id`) REFERENCES `client`(`client_id`) ON DELETE CASCADE -- FOREIGN KEY这里不能用 ON DELETE NULL
);
-- 新增公司资料
INSERT INTO `branch` VALUES(1,'研发',NULL); -- 如果这里直接新增employee数据会因为外键无值而报错,所以要先填branch,并且外键部分填null
INSERT INTO `branch` VALUES(2,'行政',NULL);
INSERT INTO `branch` VALUES(3,'咨讯',NULL);

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,2,207);
INSERT INTO `employee` VALUES(210,'小蓝','1925-11-10','F',84000,1,207);
-- DELETE FROM `employee`; -- 清除`employee`所有资料
-- SELECT * FROM `employee`;

UPDATE `branch` SET `manager_id` =206 WHERE `branch_id` = 1;-- 将branch中外键的null值改过来 
UPDATE `branch` SET `manager_id` =207 WHERE `branch_id` = 2;
UPDATE `branch` SET `manager_id` =208 WHERE `branch_id` = 3;

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, 402, '9800');
INSERT INTO `works_with` VALUES(208, 403, '24000');
INSERT INTO `works_with` VALUES(210, 404, '87940');
-- 取得所有员工性别且不重复
SELECT  DISTINCT `sex` FROM `employee`; -- 不重复通过DISTINCT实现


-- aggregate function 聚合函数
-- 1.取得员工人数
SELECT COUNT(*) FROM `employee`; -- COUNT()里面也可以加属性
-- 2.取得所有出生于1970-01-01之后的女性员工人数
SELECT * 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.取得电话号码尾数是335的客户
SELECT * FROM `client` WHERE `phone` LIKE '%335'; -- LIKE是模糊查询,254%也可以,%代表多个字元
-- 2.取得姓艾的客户
SELECT * FROM `client` WHERE `client_name` LIKE '艾%';
-- 3.取得生日在12月的员工
SELECT * FROM `employee` WHERE `birth_date` LIKE '_____12%'; -- 月份之前有5个字符


-- union 联集
-- 1.员工名字 union 客户名字
SELECT `name` FROM `employee` 
UNION
SELECT `client_name` FROM `client` ; -- union两边的属性应该是一样多的,并且类型相同
-- 2.员工id + 员工名字 union 客户id +客户名字
SELECT `emp_id` AS `total_id`,`name` AS `total_name` FROM `employee`  -- AS后为重命名属性名
UNION
SELECT `client_id`,`client_name` FROM `client` ;
-- 3.员工薪水 union 销售金额
SELECT `salary` AS `total_money`FROM `employee`
UNION
SELECT `total_sales` FROM `works_with`;


-- join 连接
INSERT INTO `branch` VALUES(4,'偷懒',NULL);
-- 取得所有部门经理的名字
SELECT `emp_id`,`name`,`branch_name` FROM `employee` 
JOIN `branch` 
ON `employee`.`emp_id` = `branch`.`manager_id`; -- 在属性前面加上表格名称可以区分不同表格有同一属性名称的情况

SELECT `emp_id`,`name`,`branch_name` 
FROM `employee`  LEFT JOIN `branch` 
ON `employee`.`emp_id` = `branch`.`manager_id`; -- LEFT JOIN会把左边`employee`表格所有的内容都输出,右边`branch` 满足条件才输出,不满足为NULL


-- 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因为判断里面结果可能不止一个

最后python和MySQL连接的代码:

# import mysql.connector
# connection = mysql.connector.connect(host='localhost',
#                                      port='3306',
#                                      user='root',
#                                      password='257101pyD@')  # 对应内容在MySQL Workbench home页面
# cursor = connection.cursor()
# # 创建资料库
# # cursor.execute("CREATE DATABASE `qq`;")
#
# # 取得所有资料库名称
# # cursor.execute("SHOW DATABASES;")
# # records = cursor.fetchall()  # 导出所有回传的资料
# # for r in records:
# #     print(r)
#
# # 连接资料库并创建表格
# cursor.execute("USE `sql_tutorial`;")  # 也可直接在connection中connect()加入database,如下所示
# cursor.execute("CREATE TABLE `qq`(qq INT);")
#
# cursor.close()  # 关闭连接
# connection.close()

import mysql.connector
connection = mysql.connector.connect(host='localhost',
                                     port='3306',
                                     user='root',
                                     password='257101pyD@',
                                     database='sql_tutorial')  # 对应内容在MySQL Workbench home页面
cursor = connection.cursor()

# 取得部门表格所有资料
cursor.execute('SELECT * FROM `branch`;')
records = cursor.fetchall()  # 导出所有回传的资料
for r in records:
    print(r)

# 新增、修改、删除也类似
# cursor.execute("INSERT INTO `branch` VALUES(5,'qq',NULL);")  # ;可加可不加
# cursor.execute("UPDATE `branch` SET `manager_id` = 206 WHERE `branch_id` = 4;")
# cursor.execute("DELETE FROM `branch` WHERE `branch_id` = 5;")

cursor.close()  # 关闭连接
connection.commit()  # 改变资料内容时的指令
connection.close()

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值