一,0825MySQL-02
1,SQL 分类;
SQL 语句主要可以划分为一下3个类别。
- DDL 语句:数据定义语言,这邪恶语句定义了不同的数据段,数据库,表,列,索引等数据库对象的定义,常用的语句关键字主要包括create,drop,alter等。
- DML 语句:数据操作语句,用于添加,删除,更新和查询数据库记录,并检查数据量完整性,常用的语句关键字主要包括(insert,delete,update和select等,(增删改查)
- DCL 语句:数据控制语句,用于控制不同数据段直接的许可和访问级别的语句,这些语句定义了数据库,表,字段,用户的访问权限和安全级别。主要的语句关键字包括grant,revoke等。
2,创建数据库
语法:CREATE DATABASE dbname
例如,创建数据库test1,命令执行如下:
mysql> create database test1;
Query OK, 1 row affected
2.删除数据库
语法:drop database dbname;
例如,要删除 test1 数据库可以使用以下语句:
mysql> drop database test1;
Query OK, 1 row affected
3.创建表
在数据库中创建一张表的基本语法如下:
CREATE TABLE tablename (
column_name_1 column_type_1 constraints,
column_name_2 column_type_2 constraints ,
……
column_name_n column_type_n constraints)
因为 MySQL 的表名是以目录的形式存在于磁盘上,所以表名的字符可以用任何目录名允许的字符。
column_name 是列的名字,column_type 是列的数据类型,contraints 是这个列的约束条件。
例如,创建一个名称为 emp 的表。表中包括 3 个字段,ename(姓名),hiredate(雇用日期)、
sal(薪水),字段类型分别为 varchar(10)、date、int(2):
mysql> create table emp(
-> eanme varchar(10),
-> hiredate date,
-> sal decimal(10,2),deptno int(2));
Query OK, 0 rows affected
4.删除表
表的删除命令如下:DROP TABLE tablename
例如,要删除数据库emp可以使用以下命令:mysql>drop table emp;
5.修改表(重要)
1,修改表类型:
- ALTER TABLE tablename MODIFY(COLUMN) column_definition[FIRST|col_name]
- 例如,修改表emp的ename字段定义,将varchar(10),改为varchar(20):
2,增加表字段:
- ALTER TABLE tablename ADD [COLUMN] column_definition [FIRST | AFTER col_name]
- 例如,表 emp 上新增加字段 age,类型为 int(3):mysql> alter table emp add column age int(3);
3,修改表字段;
- ALTER TABLE tablename ADD [COLUMN] column_definition [FIRST | AFTER col_name]
- 例如,表 emp 上新增加字段 age,类型为 int(3):mysql> alter table emp add column age int(3);
3,字段改名;
- ALTER TABLE tablename CHANGE [COLUMN] old_col_name column_definition [FIRST|AFTER col_name]
- 例如,将 age 改名为 age1,同时修改字段类型为 int(4):mysql> alter table emp change age age1 int(4) ;
二,约束
1,什么是约束
约束英文:constraint
约束实际上就是表中数据的限制条件
2,约束作用
- 表在设计的时候加入约束的目的就是为了保证表中的记录完整和有效
- 比如name字段中要让其用户名不重复,这就需要添加约束。或者必须注册的时候需要添加邮箱等。
3,约束种类
- 非空约束(not null)
- 唯一性约束(unique)
- 主键约束(primary key)PK
- 外键约束(foreign key)FK
- 检查约束(目前mysql不支持,Oracle支持)
4,非空约束
用not null约束的字段不能为null值,必须给定具体的数据
创建表,给字段添加非空约束(创建用户表,用户名不能为空)
mysql> create table t_user(
-> id int(10),
-> name varchar(32) not null);
Query OK, 0 rows affected
如果没有插入 name 字段数据,则会报错
mysql> insert into t_user (id) values(1);
1364 - Field 'name' doesn't have a default value
5,唯一性约束
unique约束的字段,具有唯一性,不可重复性,但可以为null 创建表,保证邮箱地址唯一(列级约束)
mysql> drop table t_user;
Query OK, 0 rows affected
mysql> create table t_user(
-> id int(10),
-> name varchar(32) not null,
-> email varchar(128) unique);
Query OK, 0 rows affected
mysql>
6,使用表级约束,给多个字段联合约束
联合约束表示两个或以上的字段同时与另一条记录相等,则报错
插入第一条数据
mysql> insert into t_user(id,name,email) values(1,'xxx','qq,com');
Query OK, 1 row affected
插入第二条数据如果是与联合字段中的一条相同另一条相同,也是可以的
mysql> insert into t_user(id,name,email) values(2,'mmm','qq.com');
Query OK, 1 row affected
插入第三天数据,如果与联合字段都相同,则报错
mysql> insert into t_user(id,name,email) values(3,'mmm','qq.com');
1062 - Duplicate entry 'mmm-qq.com' for key 'name'
表级约束可以给约束起名字(方便以后通过这个名字来删除这个约束)
mysql> create table t_user(
-> id int(10),
-> name varchar(32) not null,
-> email varchar(128),
-> constraint t_user_email_unique unique(email));
Query OK, 0 rows affected
mysql>
constraint是约束关键字,也不能重复
name varchar(32) not null unique
三,主键约束(primary key)PK
1,表设计时一定要有主键
-
主键涉及术语
- 主键约束
- 主键字段
- 主键值
-
以上三种术语关系
- 表中的某个字段添加主键约束后,该字段为主键字段,主键字段中出现的每个数据都称为主键值
-
主键约束与“not null unique”区别
- 给某个字段添加主键约束之后,该字段不能重复也不能为空,效果和“not null unique”约束相同,但是本质不同
- 主键约束除了可以做到“not null unique”之外,还会默认添加索引—index
-
一张表应该有主键字段,如果没有,表示该表无效
- 主键值:是当前数据的唯一表示,是当前行数据的身份证好。即使表中两行记录相关数据相同,但由于主键值不同,所以也认为是
两行不同的记录
-
按主键约束的字段数量分类
- 无论是单一主键还是复合主键,一张表主键约束只能有一个(约束只能有一个吗,但可以作用到好几个字段)
- 单一主键:给一个字段添加主键约束
- 符合主键:给多个字段来拟合添加一个主键约束(之恶能表级定义)单一主键(列级定义)
mysql> create table t_user1( -> id int(10) primary key, -> name varchar(32)); Query OK, 0 rows affected
2,单一主键
mysql> create table t_user2(
-> id int(10),
-> name varchar(32) not null,
-> constraint t_user2_id_pk primary key(id));
Query OK, 0 rows affected
3,复合主键
mysql> create table t_user3(
-> id int(10),
-> name varchar(32) not null,
-> email varchar(128) unique,
-> primary key(id,name));
Query OK, 0 rows affected
4,自增主键
mysql> insert into t_user4(name) values('jay');
Query OK, 1 row affected
mysql> insert into t_user4(name) values('man');
Query OK, 1 row affected
mysql> select * from t_user4;
+----+------+
| id | name |
+----+------+
| 1 | jay |
| 2 | man |
+----+------+
2 rows in set