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, ...
FROM
    table_1
[INNER | LEFT |RIGHT] JOIN table_2 ON conditions
WHERE
    conditions
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限制返回行的数量。

语句中的SELECTFROM语句是必须的,其他部分是可选的。

查询employees表中所有数据

select * from employees;

查询employees表中的lastname,firstname,jobtitle三项数据

select lastname, firstname, jobtitle from employees;

MySQL WHERE语句

WHERE子句允许根据指定的过滤表达式或条件来指定要选择的行

语法:

SELECT 
    lastname, firstname, jobtitle
FROM
    employees
WHERE
    jobtitle = '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对仅使用表级定的存储引擎(例如MyISAMMERGEMEMORY)生效。
  • 即使发生错误,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子句中的表指定存储引擎。可以使用任何存储引擎,如:InnoDBMyISAMHEAPEXAMPLECSVARCHIVEMERGEFEDERATEDNDBCLUSTER。如果不明确声明存储引擎,MySQL将默认使用InnoDB

column_list列的语法:

column_name data_type[size] [NOT NULL|NULL] [DEFAULT value] 
[AUTO_INCREMENT]

以上语法中最重要的组成部分是:

  • column_name指定列的名称。每列具有特定数据类型和大小,例如:VARCHAR(255)
  • NOT NULLNULL表示该列是否接受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

其次,将样本数据插入到 employeesdepartments 表中:

-- 插入数据到 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

第三,查询在 employeesdepartments 表中的数据:

mysql> SELECT 
    department_id, dept_name
FROM
    departments;
+---------------+------------+
| department_id | dept_name  |
+---------------+------------+
|             1 | Sales      |
|             2 | Markting   |
|             3 | Finance    |
|             4 | Accounting |
|             5 | Warehouses |
|             6 | Production |
+---------------+------------+
6 rows in set

mysql> SELECT 
    id, first_name, last_name, department_id
FROM
    employees;
+----+------------+-----------+---------------+
| 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

重命名视图引用的表

如果重命名一个被视图引用的表,在重命名表后,视图就无效了,并且必须手动调整视图。

例如,我们基于employeesdepartments表创建一个名为v_employee_info的视图,如下所示:

重命名表会引起关联视图无效!!!

猜你喜欢

转载自blog.csdn.net/qq_41179365/article/details/111314901