python全栈第二十四天 mysql
目录
MySQL
登录
用户设置
数据库示例教程
查询数据表结构
查询数据
MySQL WHERE语句
插入表数据
更新表数据
删除表数据
数据库错误Cannot delete or update a parent row: a foreign key constraint fails
创建与删除数据库
创建表
修改表结构
更改表结构数据
新增表列
删除表列
重命名表名
MySQL
登录
1.登录命令
mysql -u root -p
2.输入密码
用户设置
新增
1.先切换数据库
use mysql;
2.插入新的
create user 'lzc' identified by '123456';
3.查看权限
select * from user where user = 'lzc';
或者
SHOW GRANTS FOR 'lzc';
4.开放权限
grant all on *.* to 'lzc'@'%', 'localhost';
5.刷新权限,刷新后才会起作用
flush privileges;
收回
收回用户权限
# 语法格式 REVOKE privileges ON database.table FROM 'username'@'host';
revoke insert,update on *.* from 'lzc'@'%';
删除
删除用户
# 语法格式 DROP USER 'username'@'host';
drop user 'lzc'@'%';
数据库示例教程
示例数据库下载地址:http://www.yiibai.com/downloads/yiibaidb.zip
1.创建数据库
create database if not exists yiibaidb default charset utf8 collate utf8_general_ci;
2.导入数据
source D:/worksp/yiibaidb.sql;
3.测试导入结果
select city,phone,country from offices;
查询数据表结构
desc customers;
查询数据
使用SELECT
语句从表或视图获取数据。表由行和列组成,如电子表格。 通常,我们只希望看到子集行,列的子集或两者的组合。SELECT
语句的结果称为结果集,它是行列表,每行由相同数量的列组成。
SELECT column_1, column_2, ...
FROMtable_1
[INNER | LEFT |RIGHT] JOIN table_2 ON conditions
WHEREconditions
GROUP BY column_1
HAVING group_conditions
ORDER BY column_1
LIMIT offset, length;
SELECT
语句由以下列表中所述的几个子句组成:
SELECT
之后是逗号分隔列或星号(*
)的列表,表示要返回所有列。FROM
指定要查询数据的表或视图。JOIN
根据某些连接条件从其他表中获取数据。WHERE
过滤结果集中的行。GROUP BY
将一组行组合成小分组,并对每个小分组应用聚合函数。HAVING
过滤器基于GROUP BY
子句定义的小分组。ORDER BY
指定用于排序的列的列表。LIMIT
限制返回行的数量。
语句中的SELECT
和FROM
语句是必须的,其他部分是可选的。
查询employees表中所有数据
select * from employees;
查询employees表中的lastname,firstname,jobtitle三项数据
select lastname, firstname, jobtitle from employees;
MySQL WHERE语句
WHERE
子句允许根据指定的过滤表达式或条件来指定要选择的行
语法:
SELECT lastname, firstname, jobtitle
FROMemployees
WHEREjobtitle = 'Sales Rep';
select
lastname, firstname, jobtitle
from
employees
where
jobtitle = 'Sales Rep' and officeCode = 1;
下表列出了可用于在WHERE
子句中形成过滤表达式的比较运算符。
操作符 | 描述 |
---|---|
=
|
等于,几乎任何数据类型都可以使用它。 |
<> 或 !=
|
不等于 |
<
|
小于,通常使用数字和日期/时间数据类型。 |
>
|
大于, |
<=
|
小于或等于 |
>=
|
大于或等于 |
还有一些有用的运算符可以在WHERE
子句中使用来形成复杂的条件,例如:
- BETWEEN选择在给定范围值内的值。
- LIKE匹配基于模式匹配的值。
- IN指定值是否匹配列表中的任何值。
IS NULL
检查该值是否为NULL
。
插入表数据
语法:
insert into table(column1, column2...)
values (value1, value2,...);
1.创建数据库来测试
create database if not exists testdb default charset utf8 collate utf8_general_ci;
2.切换数据库
use testdb;
3.创建数据表tasks
create table if not exists tasks(
task_id int(11) auto_increment,
subject varchar(45) default null,
start_date date default null,
end_date date default null,
description varchar(200) default null,
primary key (task_id)
)engine = innodb default charset = utf8;
4.将任务插入到tasts表中,则使用insert语句
insert into tasks(subject, start_date, end_date, description)
values('learn mysql insert', '2020-12-17', '2020-12-18', 'start learing..');
5.查看数据
select * from tasks;
插入多行
语法:
insert into table(column1, column2..)
values (value1, value2,...),(value1,value2,...),
...;
eg:
insert into tasks(subject, start_date, end_date, description)
values('任务-1', '2020-01-01','2020-01-02', 'description 1'),('任务-2', '2020-01-01','2020-01-02', 'description 2'),('任务-3', '2020-01-01','2020-01-02', 'description 3');
更新表数据
语法:
update [low_priority] [ignore] table_name
set
column_name1 = expr1,
coumn_name2 = expr2,
...
where
condition;
在上面UPDATE
语句中:
- 首先,在
UPDATE
关键字后面指定要更新数据的表名。 - 其次,
SET
子句指定要修改的列和新值。要更新多个列,请使用以逗号分隔的列表。以字面值,表达式或子查询的形式在每列的赋值中来提供要设置的值。 - 第三,使用WHERE子句中的条件指定要更新的行。
WHERE
子句是可选的。 如果省略WHERE
子句,则UPDATE
语句将更新表中的所有行。
请注意,WHERE
子句非常重要,所以不应该忘记指定更新的条件。 有时,您可能只想改变一行; 但是,可能会忘记写上WHERE
子句,导致意外更新表中的所有行。
MySQL在UPDATE
语句中支持两个修饰符。
LOW_PRIORITY
修饰符指示UPDATE
语句延迟更新,直到没有从表中读取数据的连接。LOW_PRIORITY
对仅使用表级锁定的存储引擎(例如MyISAM,MERGE,MEMORY)生效。- 即使发生错误,IGNORE修饰符也可以使UPDATE语句继续更新行。导致错误(如重复键冲突)的行不会更新。
select firstname, lastname, email from employees where employeeNumber = 1056;
现在有个需求, 给customers表中没有销售人员的人,分配销售人员
1.查询出customers表中没有销售人员的集合
2.从employees表中随机抽一个销售人员
3.更新customers表中没有销售人员的客户
UPDATE customers SET salesRepEmployeeNumber = (SELECT employeeNumber FROM employees WHERE jobtitle = 'Sales Rep' LIMIT 1) WHERE salesRepEmployeeNumber IS NULL;
删除表数据
语法:
delete from table_name
where condition;
在上面查询语句中 -
- 首先,指定删除数据的表(
table_name
)。 - 其次,使用条件来指定要在
WHERE
子句中删除的行记录。如果行匹配条件,这些行记录将被删除。
delete from employees where officeCode = 4;
按客户名称按字母排序客户,并删除前10
个客户:
delete from customers order by customerName limit 10;
数据库错误Cannot delete or update a parent row: a foreign key constraint fails
问题描述:
删除数据库表中一条数据的时候,报错Cannot delete or update a parent row: a foreign key constraint fails。
原因:
此数据库表和其他数据库表有关联,再删除的时候会检查表之间的关联关系,从而导致无法删除。
数据库中的解决方法:
SET foreign_key_checks = 0; // 先设置外键约束检查关闭
drop table table1; // 删除表,如果要删除视图,也是如此
SET foreign_key_checks = 1; // 开启外键约束检查,以保持表结构完整性
创建与删除数据库
语法:
create database [if not exists] database_name;
显示数据库
show databases;
选择要使用的数据库
在使用指定数据库之前,必须通过使用USE
语句告诉MySQL要使用哪个数据库。
use database_name;
从现在开始,所有操作(如查询数据,创建新表或调用存储过程)都将对当前数据库(即database_name)产生影响
删除数据库
drop database if exists mytestdb;
创建表
语法:
CREATE TABLE [IF NOT EXISTS] table_name(column_list
) engine=table_type;
SQL
我们来更详细地来查看其语法:
首先,指定要在
CREATE TABLE
子句之后创建的表的名称。表名在数据库中必须是唯一的。IF NOT EXISTS
是语句的可选部分,允许您检查正在创建的表是否已存在于数据库中。 如果是这种情况,MySQL将忽略整个语句,不会创建任何新的表。 强烈建议在每个CREATE TABLE
语句中使用IF NOT EXISTS
来防止创建已存在的新表而产生错误。其次,在
column_list
部分指定表的列表。字段的列用逗号(,
)分隔。我们将在下一节中向您展示如何更详细地列(字段)定义。第三,需要为
engine
子句中的表指定存储引擎。可以使用任何存储引擎,如:InnoDB,MyISAM,HEAP,EXAMPLE,CSV,ARCHIVE,MERGE, FEDERATED或NDBCLUSTER。如果不明确声明存储引擎,MySQL将默认使用InnoDB。
column_list列的语法:
column_name data_type[size] [NOT NULL|NULL] [DEFAULT value]
[AUTO_INCREMENT]
以上语法中最重要的组成部分是:
column_name
指定列的名称。每列具有特定数据类型和大小,例如:VARCHAR(255)
。NOT NULL
或NULL
表示该列是否接受NULL
值。DEFAULT
值用于指定列的默认值。AUTO_INCREMENT
指示每当将新行插入到表中时,列的值会自动增加。每个表都有一个且只有一个AUTO_INCREMENT
列。
如果要将表的特定列设置为主键,则使用以下语法:
PRIMARY KEY (col1,col2,...)
mysql> create table if not exists tasks(
-> task_id int(11) not null auto_increment,
-> subject varchar(45) default null,
-> start_date date default null,
-> end_date date default null,
-> description varchar(200) default null,
-> primary key (task_id)
-> )engine = innodb;
修改表结构
语法:
alter table table_name action1[,action2,...]
要更改现有表的结构:
- 首先,在
ALTER TABLE
子句之后指定要更改的表名称。 - 其次,列出一组要应用于该表的操作。操作可以是添加新列,添加主键,重命名表等任何操作。
ALTER TABLE
语句允许在单个ALTER TABLE
语句中应用多个操作,每个操作由逗号(,
)分隔。
建一个名为tasks
的新表。 以下是创建tasks
表的脚本
DROP TABLE IF EXISTS tasks;CREATE TABLE tasks (task_id INT NOT NULL,subject VARCHAR(45) NULL,start_date DATE NULL,end_date DATE NULL,description VARCHAR(200) NULL,PRIMARY KEY (task_id),UNIQUE INDEX task_id_unique (task_id ASC)
);
更改表结构数据
假设您希望在任务表中插入新行时,task_id
列的值会自动增加1
。那么可以使用ALTER TABLE
语句将task_id
列的属性设置为AUTO_INCREMENT
,如下所示//原文出自
mysql -> alter table tasks
-> change column task_id task_id int(11) not null auto_increment;
可以通过在tasks
表中插入一些行数据来验证更改。
mysql> insert into tasks(subject, start_date, end_date, description)
-> values('learn mysql delete table', now(), now(), 'practiciong mysql delete statement'),
-> ('learn mysql 123 table', now(), now(), 'practiciong mysql 456 statement');
查看结果
select task_id, description from tasks;
新增表列
由于新的业务需求,需要添加一个名为complete
的新列,以便在任务表中存储每个任务的完成百分比。 在这种情况下,您可以使用ALTER TABLE
将新列添加到tasks
表中,如下所示:
mysql> alter table tasks
-> add column complete decimal(2, 1) null
-> after description;
删除表列
mysql> alter table tasks
-> drop column complete;
重命名表名
mysql> alter table tasks
-> rename to work_items;
或者 rename table work_items to task;
创建数据库 -
CREATE DATABASE IF NOT EXISTS hrdb;
SQL
创建表 -
USE hrdb;CREATE TABLE departments (department_id INT AUTO_INCREMENT PRIMARY KEY,dept_name VARCHAR(100)
);CREATE TABLE employees (id int AUTO_INCREMENT primary key,first_name varchar(50) not null,last_name varchar(50) not null,department_id int not null,FOREIGN KEY (department_id)REFERENCES departments (department_id)
);
SQL
其次,将样本数据插入到 employees
和 departments
表中:
-- 插入数据到 departments 表中
INSERT INTO departments(dept_name)
VALUES('Sales'),('Markting'),('Finance'),('Accounting'),('Warehouses'),('Production');-- 插入数据到 employees 表中
INSERT INTO employees(first_name,last_name,department_id)
VALUES('John','Doe',1),('Bush','Lily',2),('David','Dave',3),('Mary','Jane',4),('Jonatha','Josh',5),('Mateo','More',1);
SQL
第三,查询在 employees
和 departments
表中的数据:
mysql> SELECT department_id, dept_name
FROMdepartments;
+---------------+------------+
| department_id | dept_name |
+---------------+------------+
| 1 | Sales |
| 2 | Markting |
| 3 | Finance |
| 4 | Accounting |
| 5 | Warehouses |
| 6 | Production |
+---------------+------------+
6 rows in setmysql> SELECT id, first_name, last_name, department_id
FROMemployees;
+----+------------+-----------+---------------+
| id | first_name | last_name | department_id |
+----+------------+-----------+---------------+
| 1 | John | Doe | 1 |
| 2 | Bush | Lily | 2 |
| 3 | David | Dave | 3 |
| 4 | Mary | Jane | 4 |
| 5 | Jonatha | Josh | 5 |
| 6 | Mateo | More | 1 |
+----+------------+-----------+---------------+
6 rows in set
SQL
重命名视图引用的表
如果重命名一个被视图引用的表,在重命名表后,视图就无效了,并且必须手动调整视图。
例如,我们基于employees
和departments
表创建一个名为v_employee_info
的视图,如下所示:
重命名表会引起关联视图无效!!!
python全栈第二十四天 mysql相关推荐
- Python全栈工程师(25:Mysql数据库)
1. 数据库介绍 什么是数据库? 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库,每个数据库都有一个或多个不同的API用于创建,访问,管理,搜索和复制所保存的数据.由于将数据存储 ...
- Python 全栈开发十 socket网络编程
一.客户端(client)服务端(sever)架构 在计算机中有很多常见的C/S架构,例如我们的浏览器是客户端.而百度网站和其他的网站就是服务端:视频软件是客户端,提供视频的腾讯.优酷.爱奇艺就是服务 ...
- python自动化开发-[第二十四天]-高性能相关与初识scrapy
今日内容概要 1.高性能相关 2.scrapy初识 上节回顾: 1. Http协议Http协议:GET / http1.1/r/n...../r/r/r/na=1TCP协议:sendall(" ...
- Python全栈[第二篇]:计算机基础知识-进制
进制 常见进制有二进制.八进制.十六进制 十进制逢十进一;十六进制逢十六进一;八进制逢八进一;二进制逢二进一 计算机只识别二进制数据,其基础运算是采用2进制 二进制 计算机中最小的存储单位是二进制位( ...
- Python学习日记-第二十四天-飞机大战(敌机出场设计)
系列文章目录 ·使用定时器添加敌机 ·设计Enemy 类 前言 昨天因为有事,所以没有及时更新 一.使用定时器添加敌机 游戏启动后,每隔一秒会出现一架敌机 每架敌机向屏幕下方飞行,飞行速度各不相同 每 ...
- Python全栈(十)Django框架之9.聚合函数和表达式
文章目录 一.聚合函数 1.Avg函数 2.聚合函数实现链式调用 3.aggregate和annotate的区别 4.Count函数 5.Max和Min函数 6.Sum函数 二.F表达式和Q表达式 1 ...
- Python全栈(十)Django框架之10.ORM模型对象和QuerySet方法
文章目录 一.objects对象源码解读 二.QuerySet方法 1.exclude方法 2.order_by方法 3.values方法 4.values_list方法 5.create方法 6.g ...
- Python全栈(十)Django框架之6.ORM模型基本使用
文章目录 一.ORM创建模型和映射数据库 1.创建模型 2.数据库映射 二.ORM模型数据操作 1.添加数据 2.查询数据 3.删除数据 4.更新数据 三.ORM实现图书管理系统 一.ORM创建模型和 ...
- 最新python全栈3期高级开发工程师 独家完整版
课程目录: │ ├─1-10 │ │ │ ├─day01 │ │ 01 python全栈s3 day1 计算机发展史.mp4 │ │ 02 python全栈s3 d ...
最新文章
- 如何使用create-react-app在本地设置HTTPS
- 数据增强_浅析数据增强
- AT91RM9200Linux移植笔记(三)-移植Linux kernel 2.6.17
- mysql去重取最大值,逻辑类似oracle的over(partition by)函数
- 怎么从mysql注册表删除用户_mysql 创建和删除用户
- php网站开发项目实战,PHP动态网站开发项目实战
- 弄明白python reduce 函数
- kafka基础之介绍和分布式集群搭建
- 来几个 9 块 9 好吃零食
- 代码实现 | 方程组的实现
- jQuery插件的简单使用及制作
- MATLAB车牌识别GUI设计实现
- DeepSort轨迹跟踪方法
- RTL设计基础(一)
- 网站实现记住我(自动登录)的方法总结
- 转载:JAVE 视音频转码
- 计算机专业课学习清单(书籍+公开课)
- [java] JavaMail发送邮件
- Python编写数字转换成中文大写
- 分布式与集群的区别到底是什么?