把最麻烦的查询写完了,下面继续写DML中的insert、delete、update以及DDL中的CREATE、DROP、ALTER吧,这篇博客的内容只要记住就会用了。
注:这里会把章节都续上,都是SQL基础知识。这块内容写完后会把链接都贴到这里的。
上一篇:MySQL学习笔记_上(select查询)
-使用 INSERT 语句向表中插入数据。语法如下:
INSERT INTO table[(column[,column...])]
VALUES [(value[,value...])]
注意事项:
INSERT INTO departments(department_id, department_name,
manager_id, location_id)
VALUES (70, 'Pub', 100, 1700);
向表中插入空值
INSERT INTO departments (department_id,department_name )
VALUES (30, 'Purchasing');
INSERT INTO departments
VALUES (100, 'Finance', NULL, NULL);
同时插入多行数据
INSERT INTO emp(NAME)
VALUES('Tom'),('Jerry'),('Rose');
从其它表中拷贝数据
INSERT INTO emp2
SELECT *
FROM employees
WHERE department_id = 90;
INSERT INTO sales_reps(id, name, salary, commission_pct)
SELECT employee_id, last_name, salary, commission_pct
FROM employees
WHERE job_id LIKE '%REP%';
使用 UPDATE 语句更新数据。语法如下:
UPDATE table
SET column=value[,column=value,...]
[WHERE conition];
注意:
可以一次更新多条数据。
如果需要回滚数据,需要保证在DML前,进行设置:SET AUTOCOMMIT = FALSE;
使用 WHERE 子句指定需要更新的数据。
UPDATE employees
SET department_id = 70
WHERE employee_id = 113;
UPDATE copy_emp
SET department_id = 110;
更新中的数据完整性错误
UPDATE employees
SET department_id = 55
WHERE department_id = 110;
说明:不存在 55 号部门
使用 DELETE 语句从表中删除数据,语法如下:
DELETE FROM table
[WHERE conition];
DELETE FROM departments
WHERE department_name = 'Finance';
DELETE FROM copy_emp;
删除中的数据完整性错误
DELETE FROM departments
WHERE department_id = 60;
说明:You cannot delete a row that contains a primary key that is used as a foreign key in another table.
create database employees;
注意:database不能改名。一些可视化工具可以改名,它是建新库,把所有表复制到新库,再删旧库完成的。
show databases;
use 数据库名;
show tables from 数据库名;
drop database 数据库名;
SELECT DATABASE() from dual;
注意:要操作表格和数据之前必须先说明是对哪个数据库进行操作,否则就要对所有对象加上“数据库名.”。
注:黑体代表常用的。
数据类型 | 描述 |
---|---|
INT | 从-231到231-1的整型数据。存储大小为 4个字节 |
CHAR(size) | 定长字符数据。若未指定,默认为1个字符,最大长度255 |
VARCHAR(size) | 可变长字符数据,根据字符串实际长度保存,必须指定长度 |
FLOAT(M,D) | 单精度,M=整数位+小数位,D=小数位。 D<=M<=255,0<=D<=30,默认M+D<=6 |
DOUBLE(M,D) | 双精度。D<=M<=255,0<=D<=30,默认M+D<=15 |
DATE | 日期型数据,格式’YYYY-MM-DD’ |
BLOB | 二进制形式的长文本数据,最大可达4G |
TEXT | 长文本数据,最大可达4G |
必须具备:
CREATE TABLE [schema.]table
(column datatype [DEFAULT expr][, ...]);
必须指定:
CREATE TABLE dept(
deptno INT(2),
dname VARCHAR(14),
loc VARCHAR(13));
DESCRIBE dept;
--创建表
CREATE TABLE emp (
--int类型,自增
emp_id INT AUTO_INCREMENT,
--最多保存20个中英文字符
emp_name CHAR (20),
--总位数不超过15位
salary DOUBLE,
--日期类型
birthday DATE,
--主键
PRIMARY KEY (emp_id)
) ;
SHOW CREATE TABLE 表名;
使用 AS subquery 选项,将创建表和插入数据结合起来
create table 表名 [(column,column...)]
as subquery;
指定的列和子查询中的列要一一对应
create table emp1 as select * from employees;
create table emp2 as select * from employees where 1=2; --创建的emp2是空表
CREATE TABLE dept80
AS
SELECT employee_id, last_name, salary*12 ANNSAL
FROM employees
WHERE department_id = 80;
DESCRIBE dept80;
使用 ALTER TABLE 语句可以实现:
向已有的表中添加列
修改现有表中的列
删除现有表中的列
重命名现有表中的列
ALTER TABLE dept80
ADD job_id varchar(15);
ALTER TABLE dept80
MODIFY (last_name VARCHAR(30));
ALTER TABLE dept80
MODIFY (salary double(9,2) default 1000);
使用 CHANGE old_column new_column dataType子句重命名列。
ALTER TABLE dept80
CHANGE department_name dept_name varchar(15);
使用 DROP COLUMN 子句删除不再需要的列。
ALTER TABLE dept80
DROP COLUMN job_id;
执行RENAME语句改变表, 视图的名称
RENAME TABLE emp
TO myemp;
ALTER table dept
RENAME [TO] detail_dept; -- [TO]可以省略
注意事项:
数据和结构都被删除
所有正在运行的相关事务被提交
所有相关索引被删除
DROP TABLE 语句不能回滚
DROP TABLE dept80;
TRUNCATE TABLE语句:
TRUNCATE TABLE detail_dept;
TRUNCATE语句不能回滚。
可以使用 DELETE 语句删除数据,可以回滚。
set autocommit = false;
delete from emp2;
select * from emp2;
rollback;
select * from emp2;
注意: MySQL不支持check约束,但可以使用check约束,而没有任何效果
SELECT * FROM information_schema.table_constraints
WHERE table_name = 'employees';
非空约束用于确保当前列的值不为空值,非空约束只能出现在表对象的列上。
Null类型特征:
创建 not null 约束
CREATE TABLE emp(
id INT(10) NOT NULL,
NAME VARCHAR(20) NOT NULL DEFAULT 'abc',
sex CHAR NULL
);
ALTER TABLE emp
MODIFY sex VARCHAR(30) NOT NULL;
ALTER TABLE emp
MODIFY sex VARCHAR(30) NULL;
ALTER TABLE emp
MODIFY NAME VARCHAR(15) DEFAULT 'abc' NULL;
UNIQUE注意事项:
同一个表可以有多个唯一约束。
唯一约束可以是某一个列的值唯一,也可以多个列组合的值唯一。
在创建唯一约束的时候,如果不给唯一约束名称,就默认和列名相同。
MySQL会给唯一约束的列上默认创建一个唯一索引。
CREATE TABLE t_course(
cid INT PRIMARY KEY,
cname VARCHAR(100) UNIQUE,
description VARCHAR(200)
);
CREATE TABLE USER(
id INT NOT NULL,
NAME VARCHAR(25),
PASSWORD VARCHAR(16),
--使用表级约束语法
CONSTRAINT uk_name_pwd UNIQUE(NAME,PASSWORD)
);
表示用户名和密码组合不能重复
ALTER TABLE USER
ADD UNIQUE(NAME,PASSWORD);
ALTER TABLE USER
ADD CONSTRAINT uk_name_pwd UNIQUE(NAME,PASSWORD);
ALTER TABLE USER
MODIFY NAME VARCHAR(20) UNIQUE;
删除约束
ALTER TABLE USER
DROP INDEX uk_name_pwd;
注意:如果忘记名称,可以通过“
show index from 表名称
;”查看。
主键约束相当于唯一约束+非空约束的组合,主键约束列不允许重复,也不允许出现空值
如果是多列组合的主键约束,那么这些列都不允许为空值,并且组合的值不允许重复。
每个表最多只允许一个主键,建立主键约束可以在列级别创建,也可以在表级别上创建。
MySQL的主键名总是PRIMARY,就算自己命名了主键约束名也没用。
当创建主键约束时,系统默认会在所在的列和列组合上建立对应的主键索引。删除主键时,也会直接删除主键索引。
CREATE TABLE emp4(
id INT AUTO_INCREMENT PRIMARY KEY,
NAME VARCHAR(20)
);
CREATE TABLE emp5(
id INT NOT NULL AUTO_INCREMENT,
NAME VARCHAR(20),
pwd VARCHAR(15),
CONSTRAINT emp5_id_pk PRIMARY KEY(id)
);
CREATE TABLE emp6(
id INT NOT NULL,
NAME VARCHAR(20),
pwd VARCHAR(15),
CONSTRAINT emp7_pk PRIMARY KEY(NAME,pwd)
);
删除主键约束
ALTER TABLE emp5
DROP PRIMARY KEY;
说明:删除主键约束,不需要指定主键名,因为一个表只有一个主键,删除主键约束后,非空还存在。
ALTER TABLE emp5
ADD PRIMARY KEY(NAME,pwd);
ALTER TABLE emp5
MODIFY id INT PRIMARY KEY;
departments表将locations主键值拿过来就是外键,用于两张表的连接。
基本理解:
外键约束是保证一个或两个表之间的参照完整性,外键是构建于一个表的两个字段或是两个表的两个字段之间的参照关系
同一个表可以有多个外键约束
从表的外键值必须在主表中能找到或者为空。当主表的记录被从表参照时,主表的记录将不允许删除,如果要删除数据,需要先删除从表中依赖该记录的数据,然后才可以删除主表的数据
注意:外键约束的参照列,在主表中引用的只能是主键或唯一键约束的列
从表的外键列与主表被参照的列名字可以不相同,但是数据类型必须一样
注意点:
创建外键约束
CREATE TABLE dept(
dept_id INT AUTO_INCREMENT PRIMARY KEY,
dept_name VARCHAR(20)
);
CREATE TABLE emp(
emp_id INT AUTO_INCREMENT PRIMARY KEY,
last_name VARCHAR(15),
dept_id INT,
CONSTRAINT emp_dept_id_fk FOREIGN KEY(dept_id)
REFERENCES dept(dept_id)
);
– FOREIGN KEY: 在表级指定子表中的列
– REFERENCES: 标示在父表中的列
创建多列外键组合,必须使用表级约束
CREATE TABLE classes(
id INT,
NAME VARCHAR(20),
number INT,
PRIMARY KEY(NAME,number)
);
CREATE TABLE student(
id INT AUTO_INCREMENT PRIMARY KEY,
classes_name VARCHAR(20),
classes_number INT,
FOREIGN KEY(classes_name,classes_number)
REFERENCES classes(NAME,number)
);
删除外键约束
ALTER TABLE emp
DROP FOREIGN KEY emp_dept_id_fk;
说明:外键列上的索引,需要单独删除。比如:
ALTER TABLE 表名称 DROP INDEX 外键列索引名; ALTER TABLE t_emp DROP INDEX dept_id; -- 举例
查看索引名:
show index from 表名称;
ALTER TABLE emp
ADD [CONSTRAINT emp_dept_id_fk] FOREIGN KEY(dept_id)
REFERENCES dept(dept_id);
CREATE TABLE student(
id INT AUTO_INCREMENT PRIMARY KEY,
NAME VARCHAR(20),
classes_name VARCHAR(20),
classes_number INT,
/*表级别联合外键*/
FOREIGN KEY(classes_name, classes_number)
REFERENCES classes(NAME, number) ON DELETE CASCADE);
CREATE TABLE student(
id INT AUTO_INCREMENT PRIMARY KEY,
NAME VARCHAR(20),
classes_name VARCHAR(20),
classes_number INT,
/*表级别联合外键*/
FOREIGN KEY(classes_name, classes_number)
REFERENCES classes(NAME, number) ON UPDATE CASCADE);
MySQL可以使用check约束,但check约束对数据验证没有任何作用,添加数据时,没有任何错误或警告
CREATE TABLE temp(
id INT AUTO_INCREMENT,
NAME VARCHAR(20),
age INT CHECK(age > 20),
PRIMARY KEY(id)
);
CREATE TABLE myemp(
id INT AUTO_INCREMENT PRIMARY KEY,
NAME VARCHAR(15),
salary DOUBLE(10,2) DEFAULT 2000
);
关于数据操作语言(DML)与数据定义语言(DDL)就讲到这了,还有剩下关于事务那块的内容,也是很重要滴,期待吧。欢迎大家一起交流学习哈。
上一篇:MySQL学习笔记_上(select查询)
下一篇:MySQL学习笔记_下(事务、视图、索引)