SQL(Structured Query Language 即结构化查询语言)
SQL语言主要用于存取数据、查询数据、更新数据和管理关系数据库系统,SQL语言由IBM开发。
DDL语句—数据库定义语言: 数据库、表、视图、索引、存储过程,例如CREATE DROP ALTER
DML语句—数据库操纵/操作语言(对记录的操作): 插入数据INSERT、删除数据DELETE、更新数据UPDATE
DCL语句—数据库控制语言(和权限有关): 例如控制用户的访问权限GRANT、REVOKE
DQL语句—数据库查询语言: 查询数据SELECT
库相当于windows/linux中的一个目录,用于存放文件的
库里面存放了若干张表,表可以看作成是一个文件。
每一行叫做记录,除了第一行。
每一列叫一个字段。列上面的第一个叫字段名称。
创建数据库
mysql> create database 库名;
查看数据库
mysql> show databases;
进入数据库
mysql> use 库名
查看当前所在的库
mysql> select database();
创建表案例:
mysql> create table users(
id int primary key, #id字段名,int数据类型,整数 primary key主键
name varchar(30), #name字段名,varchar(30)可变长字符串,限制30字符
age int #age是字段名 数据类型是int整数,
)ENGINE=InnoDB DEFAULT CHARSET=utf8; #指定存储引擎,设置默认的字符集
参数解释
表名:需要创建的表名
字段:表中包含的各个字段名和类型
类型:字段的类型,如int、varchar等
宽度:某些类型的长度限制,如varchar(50)
约束条件:给字段添加的约束,如primary key、 null 等
存储引擎:指定表使用的存储引擎,如InnoDB、MyISAM等
字符集:指定表使用的字符集,如utf8等
注意:在同一张表中,字段名是不能相同;宽度和约束条件是可选的;字段名和类型是必须的。
1、创建表:
mysql> create table t1(id int,name varchar(20),age int);
# 字段 类型 字段 类型(长度),字段 类型
mysql> create table t2(id int,name varchar(50),sex enum('m','f'),age int);
#m:male f:female 女士
2、查看有哪些表
mysql> show tables;
3、查看表结构
mysql> desc t1;
4、查看表里面的所有记录
语法: select 内容 from 表名;
mysql> select * from t1;
#*代表所有内容
5、查看表里面的指定字段的数据
语法:select 字段,字段 from 表名;
mysql> select name,sex from t1;
6、查看表的状态
mysql> show table status like '表名'\G
#每条SQL语句会以分号结尾,想看的清楚一些以\G结尾,一条记录一条记录显示。
#(把表90度向左反转,第一列显示字段,第二列显示记录)使用的\G就不用添加分号了
7、修改表名称
方式一
语法:rename table 旧表名 to 新表名;
mysql> rename table t1 to t2;
Query OK, 0 rows affected (0.00 sec)
方式二
语法:alter table 旧表名 rename 新表名;
mysql> alter table t2 rename t3;
8、使用edit(\e)编辑
mysql> \e
create table users2(
id int primary key,
name varchar(30),
age int(3)
)ENGINE=InnoDB DEFAULT CHARSET=utf8
-> ;
#可以写新的语句,调用的vim编辑器,在里面结尾的时候不加分号,保存退出之后在加“;”
9、删除表:在企业中是危险操作,慎用!
mysql> drop table 表名;
10、删除库:在企业中是危险操作,慎用!
mysql> drop database 库名;
数据完整性指的是数据的一致性和正确性。
完整性约束是指数据库的内容必须遵守约束的规则。
若定义了数据完整性约束,MySQL会负责数据的完整性,每次更新数据时,MySQL都会测试新的数据内容是否符合相关的完整性约束条件,只有符合完整性的约束条件的更新才被接受。
作用:为了规范数据格式, 在用户进行插入、修改、删除等操作时,DBMS(数据库管理系统(Data Base Management System))自动按照约束条件对数据进行监测, 使不符合规范的数据不能进入数据库,以确保数据的完整性和唯一性
约束条件说明PRIMARY KEY (PK)标识该字段为该表的主键,可以唯一的标识记录,不能为空UNIQUE + NOT NULL标识该字段的值是唯一的,且不能为空FOREIGN KEY (FK) 标识该字段为该表的外键,实现表与表之间的关联NULL标识是否允许为空,默认为NULLNOT NULL 标识该字段不能为空,可以修改UNIQUE KEY (UK)标识该字段的值是唯一的,可以为空AUTO_INCREMENT标识该字段的值自动增长(整数类型,而且为主键)DEFAULT为该字段设置默认值
主键和外键的区别:
主键用于唯一标识表中的每一行,不允许重复。而外键只是用于引用其他表中的主键,可以重复。
主键在建表时就需要定义,不能为空。而外键可以为空。
主键一般选择不重复且不易改变的字段。外键一般选择另一个表中的主键。
主键在数据修改时提供紧密控制,外键提供了表与表之间关联的链接。
删除主键记录,表中此记录将被删除。删除外键记录,外键与主键的关联会被删除,但数据仍存在。
举个简单的例子:学生表的ID字段是主键,课程表也有ID字段,但是课程表中的学生ID字段引用学生表的ID字段,课程表中的学生ID就叫外键。
总结:
- 主键用于标识表中的每一行
- 外键用于关联两个表
- 主键不允许重复
- 外键可以重复
每张表里只能有一个主键,不能为空,而且唯一,主键保证记录的唯一性,主键自动为NOT NULL。
拓展知识:
未设置主键时如何处理表?
首先Innodb从上往下搜索所有字段, 直到找到一个非空且唯一的字段, 该字段就会自动升级为主键
如果表中既没有主键, 也没有非空且唯一的字段, 那么InnoDB会采用自己内部提供的一个隐藏字段作为主键, 此时提升查询效率的作用就无法享受了(隐藏字段看不见)
即:一个UNIQUE KEY 又是一个NOT NULL的时候,那么它被当做PRIMARY KEY主键。
定义两种方式:
#表存在,添加约束
mysql> alter table t03 add primary key (hostname);
案例:
mysql> desc t03;
+-----------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+---------+------+-----+---------+-------+
| born_year | year(4) | YES | | NULL | |
+-----------+---------+------+-----+---------+-------+
1 row in set (0.00 sec)
#指定born_year为主键
mysql> alter table t03 add primary key (born_year);
Query OK, 0 rows affected (0.06 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc t03;
+-----------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+---------+------+-----+---------+-------+
| born_year | year(4) | NO | PRI | NULL | |
+-----------+---------+------+-----+---------+-------+
1 row in set (0.00 sec)
#创建表并指定主键约束
mysql> create table t9(hostname char(20),ip char(150),primary key(hostname));
mysql> insert into t9(hostname,ip) values('edu.com', '10.10.10.11');
Query OK, 1 row affected (0.00 sec)
mysql> insert into t9(hostname,ip) values('edu.com', '10.10.10.12');
ERROR 1062 (23000): Duplicate entry 'edu.com' for key 'PRIMARY'
#主键冲突了,主键有且只能有一个
mysql> insert into t9(hostname,ip) values('edu', '10.10.10.11');
Query OK, 1 row affected (0.01 sec)
mysql> select * from t9;
+-----------+-------------+
| hostname | ip |
+-----------+-------------+
| edu | 10.10.10.11 |
| edu.com | 10.10.10.11 |
+-----------+-------------+
2 rows in set (0.00 sec)
mysql> insert into t9(hostname,ip) values('jy', '10.10.10.12');
Query OK, 1 row affected (0.00 sec)
#可以插入成功,因为ip并不是主键
mysql> select * from t9;
+-----------+-------------+
| hostname | ip |
+-----------+-------------+
| edu | 10.10.10.11 |
| edu.com | 10.10.10.11 |
| jy | 10.10.10.12 |
+-----------+-------------+
3 rows in set (0.00 sec)
#删除主键
mysql> alter table t9 drop primary key;
#再查看一下表结构,看看hostname是否为主键了
mysql> desc t9;
设置后,会自动编号,且必须与主键组合使用,默认情况下,起始值为1,每次的增量为1。
当插入数据时,如果为AUTO_INCREMENT数据列明确指定了一个数值
则会出现两种情况:
1、如果插入的值与已有的编号重复,则会出现出错信息,因为AUTO_INCREMENT数据列的值必须是唯一的;
2、如果插入的值大于已编号的值,则会把它插入到数据列中,并在下一个编号将从这个新值开始递增。也就是说,可以跳过一些编号。如果自增序列的最大值被删除了,则在插入新记录时,该值被重用。
每张表只能有一个字段为自增,而且必须要成了key也就是主键才可以自动增长
案例
mysql> CREATE TABLE department3 (
dept_id INT PRIMARY KEY AUTO_INCREMENT,
dept_name VARCHAR(30),
comment VARCHAR(50)
);
上述案例是创建了一个department3(部门3)的表格,并且将dept_id部门id设置成了主键和自增键,后续添加了一个部门成员就会自动加1
查看表结构:
mysql> select * from department3;
Empty set (0.00 sec)
#插入数据,一次插入2条数据,它会自动增加id号,从1开始自增
mysql> insert into department3(dept_name, comment) values('tom','test'), ('jack', 'test2');
Query OK, 2 rows affected (0.00 sec)
mysql> select * from department3;
+---------+-----------+---------+
| dept_id | dept_name | comment |
+---------+-----------+---------+
| 1 | tom | test |
| 2 | jack | test2 |
+---------+-----------+---------+
2 rows in set (0.00 sec)
#也可以指定id插入,直接跳过3和4
mysql> insert into department3(dept_id,dept_name,comment) values('5','bob','test5');
Query OK, 1 row affected (0.00 sec)
#或者,不指定字段也是可以的,不指定具体的字段就是必须要插入3个数据值
mysql> insert into department3 values('6','jary','test6');
#查询数据
mysql> select * from department3;
+---------+-----------+---------+
| dept_id | dept_name | comment |
+---------+-----------+---------+
| 1 | tom | test |
| 2 | jack | test2 |
| 5 | bob | test5 |
| 6 | jary | test6 |
+---------+-----------+---------+
#删除自动增长
#语法:ALTER TABLE table_name CHANGE old_col_name new_col_name column_definition(列定义约束条件)
mysql> ALTER TABLE department3 CHANGE dept_id dept_id INT NOT NULL;
Query OK, 2 rows affected (0.01 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> desc department3;
+-----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+-------+
| dept_id | int(11) | NO | PRI | NULL | |
| dept_name | varchar(30) | YES | | NULL | |
| comment | varchar(50) | YES | | NULL | |
+-----------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
设置唯一约束UNIQUE,字段添加唯一约束之后,该字段的值不能重复,也就是说在一列当中不能出现一样的值。
案例
mysql> CREATE TABLE department2 (
dept_id INT,
dept_name VARCHAR(30) UNIQUE,
comment VARCHAR(50)
);
Query OK, 0 rows affected (0.00 sec)
#插入第一条数据
mysql> insert into department2(dept_id,dept_name,comment) values('1','tom',good'')
#插入第二条数据
mysql> insert into department2(dept_id,dept_name,comment) values('2','tom',good'')
ERROR 1062 (23000): Duplicate entry 'tom' for key 'dept_name'
#插入数据的时候id和comment字段相同可以插入数据,如果有相同的名字不唯一。所以插入数据失败。
#将名字换掉再次插入
mysql> insert into department2(dept_id,dept_name,comment) values('2','jack',good'')
Query OK, 1 row affected (0.00 sec)
#插入第三条数据,id可以相同,名字不能相同
mysql> insert into department2(dept_id,dept_name,comment) values('2','jim',good'')
Query OK, 1 row affected (0.00 sec)
mysql> select * from department2;
+---------+-----------+---------+
| dept_id | dept_name | comment |
+---------+-----------+---------+
| 1 | tom | good |
| 2 | jack | good |
| 2 | jim | good |
+---------+-----------+---------+
3 rows in set (0.00 sec)
是否允许为空,默认NULL,可设置NOT NULL,字段不允许为空,必须赋值
字段是否有默认值,默认值是NULL,如果插入记录时不给字段赋值,此字段使用默认值,也就是空值
例如:sex enum('male','female') not null default 'male'
只能选择male和female,不允许为空,默认是male
案例:不允许为空not null
#创建表格
mysql> create table t2(id int(5),name varchar(10),sex enum('male','female') not null default 'male');
Query OK, 0 rows affected (0.00 sec)
#查看表结构
mysql> desc t2;
+-------+-----------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-----------------------+------+-----+---------+-------+
| id | int(5) | YES | | NULL | |
| name | varchar(10) | YES | | NULL | |
| sex | enum('male','female') | NO | | male | |
+-------+-----------------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
#插入数据
mysql> insert into t2(id,name) values(1,'tom');
#查询数据
mysql> select * from t4;
+------+------+------+
| id | name | sex |
+------+------+------+
| 1 | tom | male |
+------+------+------+
1 row in set (0.00 sec)
#再插入一条
mysql> insert into t2 values(1,'jack','female');
Query OK, 1 row affected (0.00 sec)
mysql> select * from t2;
+------+------+--------+
| id | name | sex |
+------+------+--------+
| 1 | tom | male |
| 1 | jack | female |
+------+------+--------+
2 rows in set (0.00 sec)
#加错了,删掉,使用delete删除
#语法:DELETE FROM table_name WHERE column_name = 'value';
#多条件匹配:DELETE FROM table_name WHERE column_name1 = 'value1' AND column_name2 = 'value2';
#操作:
mysql> delete from t2 where name='jack';
Query OK, 1 row affected (0.00 sec)
mysql> select * from t2;
+------+------+------+
| id | name | sex |
+------+------+------+
| 1 | tom | male |
+------+------+------+
1 row in set (0.00 sec)
#允许为空null
mysql> create table t3(id int(5),name varchar(10),age int(5));
Query OK, 0 rows affected (0.00 sec)
#查看表结构
mysql> desc t3;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(5) | YES | | NULL | |
| name | varchar(10) | YES | | NULL | |
| age | int(5) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.01 sec)
mysql> insert into t3(id,name) values(1,'tom');
Query OK, 1 row affected (0.00 sec)
mysql> select * from t3;
+------+------+------+
| id | name | age |
+------+------+------+
| 1 | tom | NULL |
+------+------+------+
1 row in set (0.00 sec)
指定字符集:
#在创建表的最后面指定一下: default charset=utf8
mysql> create table t4(id int(5)) default charset=utf8;
Query OK, 0 rows affected (0.01 sec)
添加/删除默认约束
#创建一个表
mysql> create table user(id int not null, name varchar(20), number int, primary key(id));
Query OK, 0 rows affected (0.01 sec)
mysql> describe user;
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(20) | YES | | NULL | |
| number | int(11) | YES | | NULL | |
+--------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
#设置默认值,将number这个字段设置成:不给这个字段赋值时,默认为0,而不是为空
mysql> ALTER TABLE user ALTER number SET DEFAULT 0;
Query OK, 0 rows affected (0.00 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> DESCRIBE user;
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(20) | YES | | NULL | |
| number | int(11) | YES | | 0 | |
+--------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
#将id这个字段设置成自增建
mysql> ALTER TABLE user CHANGE id id INT NOT NULL AUTO_INCREMENT;
Query OK, 2 rows affected (0.01 sec)
Records: 2 Duplicates: 0 Warnings: 0
#查看表结构
mysql> desc user;
+--------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(20) | YES | | NULL | |
| number | int(11) | YES | | 0 | |
+--------+-------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)
#插入数据
mysql> INSERT INTO user(name) VALUES('rock');
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO user(name) VALUES('rock');
Query OK, 1 row affected (0.00 sec)
mysql> select * from user;
+----+------+--------+
| id | name | number |
+----+------+--------+
| 1 | rock | 0 |
| 2 | rock | 0 |
+----+------+--------+
2 rows in set (0.00 sec)
#如果我想自己填number的值,也是可以的
mysql> insert into user values('3','rock1','2');
Query OK, 1 row affected (0.00 sec)
mysql> select * from user;
+----+-------+--------+
| id | name | number |
+----+-------+--------+
| 1 | rock | 0 |
| 2 | rock | 0 |
| 3 | rock1 | 2 |
+----+-------+--------+
3 rows in set (0.00 sec)
#不指定自增建的值,也是可以的,它会自动增加
mysql> insert into user(name,number) values('jack','4');
Query OK, 1 row affected (0.00 sec)
mysql> select * from user;
+----+-------+--------+
| id | name | number |
+----+-------+--------+
| 1 | rock | 0 |
| 2 | rock | 0 |
| 3 | rock1 | 2 |
| 4 | jack | 4 |
+----+-------+--------+
4 rows in set (0.00 sec)
#删除默认值
mysql> ALTER TABLE user ALTER number drop DEFAULT;
#再次查看表结构
mysql> desc user;
+--------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(20) | YES | | NULL | |
| number | int(11) | YES | | NULL | |
+--------+-------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)
#就能看到number这个字段的Default为空了