mysql入门语句——DDL语句,DML语句

文章目录

  • 1. 建表
    • 1.1表名:**以 t_或者tbl_开始**,可读性强,见名知意
    • 1.2mysql中数据类型
  • 2.删除表
  • 3.指定默认值
    • 建表时指定
  • 4.插入数据insert
      • 4.1 插入普通数据
      • 4.2 插入日期
        • 注:当我们查询数据时,SQL实际上是先把date格式转化成varchar格式在展示出来的只不过使用了mysql默认的日期格式%Y-%m-%d
    • 一次性插入多条记录
  • 将查询结果插入到另外一张表里
  • 5.创建触发器
  • 6.update 改关键字
  • 7.修改表名(mysql,sqlite)
  • 删除数据 delete(DML),优点:后悔还可以恢复,数据上的硬盘物理真实存储空间不会释放
      • 将所有记录清空
  • 快速创建表(as)
  • 快速删除表数据(truncate),物理删除,删除效率高,表被一次截断 (DDL操作)
  • 表结构的修改
  • 1.创建表加入约束
    • 什么是约束?constraint
    • 2.约束包括哪些?
      • 非空约束
      • 唯一性约束
        • 两个字段联合起来具有唯一性
      • not null 和 unique连用
        • 如果一个字段同时被not null和unique同时约束,当该字段会自动成为主键字段(下表中key栏目中的PRI表示主键字段)在MySQL中是这样的,但是在Oracle中不是
  • SQL脚本文件执行
  • 主键约束(primary key,简称ky)
        • 主键值不能是null,也不能重复,具有唯一性
      • 列级约束
      • 表级约束
      • 复合主键
      • 一个表中主键约束能加两个吗?
        • 主键值建议使用:
      • 主键的其他分类
      • 在MySQL中,有一种机制可以帮助我们自动维护主键值,也就是自动生成主键值
  • 外键约束(foreign key,简称FK)
            • 外键约束涉及到的相关术语:
        • 第一种:班级和学生存到一张表中
        • 第二种:班级一张表,学生一张表
    • 注意:当使用外键约束时,两张表就有了父子关系,被引用的表成为父表
        • 删除表顺序:先删子表
        • 创建表顺序:先创建父表
        • 插入数据顺序:先插入父表数据
    • 外键约束语法
    • 思考:字表中的外键引用的父表中的某个字段,被引用的这个字段必须是主键吗?
      • 答:不一定,但必须是唯一索引,也就是说具有unique性质
    • 思考:外键可以为null吗?
      • 答:外键可以为null

1. 建表

create table 表明(字段名1 数据类型,字段名2 数据类型)

1.1表名:以 t_或者tbl_开始,可读性强,见名知意

表明和字段名都是标识符

1.2mysql中数据类型

字符类型 含义 例子
varchar 可变长度的字符串 根据传来数据的实际长度分配空间,节省空间,但是速度慢,最长255
char 定长字符串 不管实际数据长度,都分配固定长度的空间去存储数据,使用不恰当会导致空间浪费,但速度快,如性别字段就可以固定,最长255
int 整数型 最长11位
bigint 长整型
float 单精度浮点
double 双精度浮点
date 短日期 只包括年月日,默认格式:%Y-%m-%d
datatime 长日期 包括年月日、时分秒默认格式:%Y-%m-%d %h:%i:%s
clob 字符大对象 最高4G字符串(文章简介等),超过255字符的,用其存储对象
blob 二进制大对象 专门用来存储声音、视频等流媒体数据

create table t_student(
no int,
name varchar(10),
sex char(1),
age int(3),
email varchar(255)
);

create table t_student( no int,name varchar(10),sex char(1),age int(3),email varchar(255));

2.删除表

drop table 表名;//当这张表不存在时会报错
drop table if exists 表名 ;//如果这张表存在删除

3.指定默认值

建表时指定

create table t_student(
no int,
name varchar(10),
sex char(1) default ‘m’;
age int(3),
email varchar(255)
);

4.插入数据insert

4.1 插入普通数据

insert 语句只要执行成功必然会多一条记录,没有给其他字段指定值,则默认值是null
语法格式:
insert into 表名(字段名1,字段名2.。。) values(值1,值2.。。)
insert语句中字段名可以省略,但是全省略等于都写上了,所以值要全部写上
insert into t_student (no,name,sex,age,email) values(12,‘wqww’,‘m’,23,‘wsqwswqdx@122’);

4.2 插入日期

str_to_date:将字符串转换为date
date——format:将date类型转换成varchar字符串类型

str_to_date("字符串日期’,'日期格式’)
mysql的日期格式
%Y 年
%m月
%d日
%h时
%i分
%s秒

create table t_user(
birth date
);
insert into t_user(birth) values(str_to_date(‘01-10-1990’,‘%d-%m-%Y’));

mysql> select * from t_user;
+------------+
| birth      |
+------------+
| 1990-10-01 |
| 1990-10-01 |
+------------+

注:如果提供的日期字符串是以下格式则不用写str_to_date函数
%Y-%m-%d

date_format(‘’日期类型数据‘’,‘’日期格式‘’)
通常使用在设置展示的日期格式时使用。

注:当我们查询数据时,SQL实际上是先把date格式转化成varchar格式在展示出来的只不过使用了mysql默认的日期格式%Y-%m-%d

获取系统当前时间now(),且获取时间带有时分秒信息,是datetiome类型的
如果只获取当前的年月日,不要时分秒用**CURDATE() **函数
insert into t_user(id,name,birth,creat_time) values(2020,‘rng’,‘2012-10-1’,now());

一次性插入多条记录

语法:
insert into 表名(字段1,z字段2) values(),(),();

insert into t_user(id,name,birth,creat_time) values(2011,'dk','2020-1-1',now()),(2012,'v5','2022-3-6',now());
+------+------+------------+---------------------+
| id   | name | birth      | creat_time          |
+------+------+------------+---------------------+
| 2020 | rng  | 2012-10-01 | 2022-03-12 12:24:20 |
| 2011 | dk   | 2020-01-01 | 2022-03-12 12:30:58 |
| 2012 | v5   | 2022-03-06 | 2022-03-12 12:30:58 |
+------+------+------------+---------------------+

将查询结果插入到另外一张表里

create dept_bak select * from dept;
insert into dept_bak select * from dept
mysql> select * from dept_bak;
+--------+------------+----------+
| DEPTNO | DNAME      | LOC      |
+--------+------------+----------+
|     10 | ACCOUNTING | NEW YORK |
|     20 | RESEARCH   | DALLAS   |
|     30 | SALES      | CHICAGO  |
|     40 | OPERATIONS | BOSTON   |
|     10 | ACCOUNTING | NEW YORK |
|     20 | RESEARCH   | DALLAS   |
|     30 | SALES      | CHICAGO  |
|     40 | OPERATIONS | BOSTON   |
+--------+------------+----------+
8 rows in set (0.00 sec)//有8条记录了,没插入之前复制dept表只有4条记录

5.创建触发器

在MySQL中,创建触发器语法如下:
CREATE TRIGGER trigger_name
trigger_time trigger_event ON tbl_name
FOR EACH ROW
trigger_stmt
其中:

trigger_name:标识触发器名称,用户自行指定;
trigger_time:标识触发时机,取值为 BEFORE 或 AFTER;
trigger_event:标识触发事件,取值为 INSERT、UPDATE 或 DELETE;
tbl_name:标识建立触发器的表名,即在哪张表上建立触发器;
trigger_stmt:触发器程序体,可以是一句SQL语句,或者用 BEGIN 和 END 包含的多条语句,每条语句结束要分号结尾。
【NEW 与 OLD 详解】
MySQL 中定义了 NEW 和 OLD,用来表示
触发器的所在表中,触发了触发器的哪一行数据。
具体地:

在 INSERT 型触发器中,NEW 用来表示将要(BEFORE)或已经(AFTER)插入的新数据;
在 UPDATE 型触发器中,OLD 用来表示将要或已经被修改的原数据,NEW 用来表示将要或已经修改为的新数据;
在 DELETE 型触发器中,OLD 用来表示将要或已经被删除的原数据;
使用方法: NEW.columnName (columnName 为相应数据表某一列名)

作用:监视某种情况,并触发某种操作
很多人都不提倡使用触发器,因为这是一个隐藏的过程不好管理。

6.update 改关键字

语法格式:
uodate 表名 set 字段名1=值1,字段名2=值2…where 条件;
注:若没有条件限制泽会导致数据全部更新
更改前

mysql> select * from t_student;
+------+------+------+------+---------------+
| no   | name | sex  | age  | email         |
+------+------+------+------+---------------+
|   12 | wqww | m    |   23 | wsqwswqdx@122 |
+------+------+------+------+---------------+

update t_student set no=123,age=18 where name=‘wqww’;
更改后

mysql> select * from t_student;
+------+------+------+------+---------------+
| no   | name | sex  | age  | email         |
+------+------+------+------+---------------+
|  123 | wqww | m    |   18 | wsqwswqdx@122 |
+------+------+------+------+---------------+
1 row in set (0.00 sec)

7.修改表名(mysql,sqlite)

mysql可以使用的语法,其他的不行
rename table这个SQL语句来修改表名的基本语法是:
RENAME TABLE <旧表名> TO <新表名>;
sqlite 用下面的语法
alter table titles_test rename to titles_2017;

删除数据 delete(DML),优点:后悔还可以恢复,数据上的硬盘物理真实存储空间不会释放

缺点:删除效率比较低
语法格式
delete from 表名 where 条件;
注:如果不加条件会删除所有记录

将所有记录清空

delete * from t_user;

delete from t_user where id=2;

快速创建表(as)

creat table emp2 as select *from emp;

将select *from emp查询出来的表当做一张新表存进去

快速删除表数据(truncate),物理删除,删除效率高,表被一次截断 (DDL操作)

缺点:不支持回滚,无法恢复

truncate table dept_bak;
rollback://rollback后任然为empty,所以无法回滚

大表进行删除用delete删1h才能删完,效率较低,用truncate删除只需要不到1s。
删除之前询问是否真的删除,警告删除之后不可恢复。

注意:drop table 表名不是删除表中数据,是把一整个表删除,truncate是删除表数据,表还在。

表结构的修改

在实际的开发中一旦需求确定之后,很少对表结构进行修改,因为开发进行中的时候修改表结构成本较高

1.创建表加入约束

什么是约束?constraint

在创建表时对表中字段加入约束,保证表中数据的完整性和有效性。

2.约束包括哪些?

非空约束 :not null
唯一性约束:unique
主键约束:primary key(简称:PK)
外键约束:foreign key
检查约束:check(mySQL不支持,oracle支持)

非空约束

约束字段不能为空

create table t_vip(id int, name varchar(11) not null);
insert into t_vip(id,name) values(12,'lisi');
mysql> insert into t_vip(id) values(12);//此时报错,name字段不能为空
ERROR 1364 (HY000): Field 'name' doesn't have a default value

唯一性约束

unique
约束的字段不能重复,但是可以为null,null不算重复

drop table  if exists t_vip;
create table t_vip(id int, name varchar(10) unique,email varchar(255));
insert into t_vip(id,name,email) values(10000,'lisi','[email protected]');

insert into t_vip(id,name,email) values(10200,'lisi','182828');//执行该语句报错
ERROR 1062 (23000): Duplicate entry 'lisi' for key 'name'

两个字段联合起来具有唯一性

drop table  if exists t_vip;
create table t_vip(id int, name varchar(10) ,email varchar(255),unique(name,email));
insert into t_vip(id,name,email) values(10000,'lisi','[email protected]');
insert into t_vip(id,name,email) values(10000,'lisi','[email protected]');

+-------+------+---------------+
| id    | name | email         |
+-------+------+---------------+
| 10000 | lisi | [email protected] |
| 10000 | lisi | [email protected] |
+-------+------+---------------+

约束添加在列后面的较列级约束,约束没有加在列后面的叫表级约束,如多个字段联合起来约束就是表级约束 not null没有表级约束

not null 和 unique连用

如果一个字段同时被not null和unique同时约束,当该字段会自动成为主键字段(下表中key栏目中的PRI表示主键字段)在MySQL中是这样的,但是在Oracle中不是

drop table if exists t_vip;
create table t_vip(id int, name varchar(10) ,email varchar(255) not null unique);
mysql> desc t_vip;

+-------+--------------+------+-----+---------+-------+
| Field | Type         | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| id    | int(11)      | YES  |     | NULL    |       |
| name  | varchar(10)  | YES  |     | NULL    |       |
| email | varchar(255) | NO   | PRI | NULL    |       |
+-------+--------------+------+-----+---------+-------+

SQL脚本文件执行

source=“文件路径”

主键约束(primary key,简称ky)

主键约束相关术语
主键约束:是一种约束
主键字段:该字段上添加了主键约束的字段
主键值:主键字段上的每一个值就叫做主键值

主键值是每一行记录的唯一标识,是每一行记录的身份证号!!

任何一张表都应该有主键,没有主键,表无效!!

主键值不能是null,也不能重复,具有唯一性

如何给一张表添加主键约束?

列级约束

drop table if exists t_vip;
create table t_vip(id int primary key,name varchar(20));
insert into t_vip(id,name) values(12345,‘‘rng’)

表级约束

drop table if exists t_vip;
create table t_vip(id int ,name varchar(20),primary key(id));
insert into t_vip(id,name) values(12345,‘‘rng’)

复合主键

一个字段做主键叫做单一主键,两个字段做主键叫做复合主键,但是在实际开发中不建议使用复合主键,单一主键就可以达到身份标识的作用,效果达到即可
drop table if exists t_vip;
create table t_vip(id int ,name varchar(20),primary key(id,name))

一个表中主键约束能加两个吗?

是不可以的,一张表主键约束只能添加一个,复合主键的约束也只有一个,也就是说也只写了一个primary key
//错误:主键不能重复
drop table if exists t_vip;
create table t_vip(id int primary key,name varchar(20)primary key);

主键值建议使用:

int
bigint
char等类型
主键值一般都是数字,都是定长的

主键的其他分类

自然主键:主键值是一个自然数,和业务没关系,尽量使用自然主键
业务主键:主键值和业务紧密联系,如银行卡账号
在实际生活中使用自然主键使用较多,因为主键只要做到不重复即可,主键一旦和业务挂钩,当业务发生变动的时候可能会影响到主键值

在MySQL中,有一种机制可以帮助我们自动维护主键值,也就是自动生成主键值

drop table if exists t_vip;
create table t_vip(id int primary key auto_increment,name varchar(20));
insert into t_vip(name) values(‘lisi’);
insert into t_vip(name) values(‘lisi’);
mysql> select * from t_vip;

+----+------+
| id | name |
+----+------+
|  1 | lisi |
|  2 | lisi |
+----+------+

外键约束(foreign key,简称FK)

外键约束涉及到的相关术语:

外键约束:一种约束,限制可以添加的有效约束范围
外键字段:该字段上添加了外键约束
外键值:外键字段上的每一个值

业务背景:请设计数据库表来描述班级和学生的信息

第一种:班级和学生存到一张表中

存在一张表中是可以的
缺点:数据冗余,空间浪费,设计失败

第二种:班级一张表,学生一张表

t_class 班级表
class(pk)                   classname


100                             高三1班
101                             高三2班

t_student学生表
no(pk)    name        cno(班级编号)【FK引用t_class这张表的classno】
————————————————————
1         jack                100
2         jim                 100
3         pik                 101
当cno字段没有任何约束的时候可能导致数据无效,例如如果是102的话,但是102班级是不存在的,所以需要给cno添加外键约束,保证这个字段只有100和101

当我们设置外键约束之后我在学生表中输入的班级数据,就必须是班级表中存在的数据

注意:当使用外键约束时,两张表就有了父子关系,被引用的表成为父表

删除表顺序:先删子表

创建表顺序:先创建父表

插入数据顺序:先插入父表数据

drop table if exists t_student;
drop table if exists t_class;
create table t_class(classno int primary key,classname varchar(255));

外键约束语法

create table t_students(no int primary key auto_increment,name varchar(255),cno int,foreign key(cno) references t_class(classno));

思考:字表中的外键引用的父表中的某个字段,被引用的这个字段必须是主键吗?

答:不一定,但必须是唯一索引,也就是说具有unique性质

思考:外键可以为null吗?

答:外键可以为null

你可能感兴趣的:(MySQL,mysql,数据库,database)