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
限制返回行的数量。
语句中的SELECT
和FROM
语句是必须的,其他部分是可选的。
查询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
子句中使用来形成复杂的条件,例如:
插入表数据
语法:
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
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
重命名视图引用的表
如果重命名一个被视图引用的表,在重命名表后,视图就无效了,并且必须手动调整视图。
例如,我们基于employees
和departments
表创建一个名为v_employee_info
的视图,如下所示:
重命名表会引起关联视图无效!!!