一、基本概念
1.1 行和列
行(记录):用来描述一个对象的信息
列(字段):用来描述对象的一个属性
1.2 常用的数据类型
int :整型
float :单精度浮点 4字节32位
double :双精度浮点 8字节64位
char :固定长度的字符类型
varchar :可变长度的字符类型
text :文本
image :图片
decimal(5,2) :5个有效长度数字,小数点后面有2位
1.3 数据类型大全
整型
MySQL数据类型 | 含义(有符号) |
---|
tinyint(m) | 1个字节 范围(-128~127) | smallint(m) | 2个字节 范围(-32768~32767) | mediumint(m) | 3个字节 范围(-8388608~8388607) | int(m) | 4个字节 范围(-2147483648~2147483647) | bigint(m) | 8个字节 范围(±9.22*10的18次方) |
浮点数
MySQL数据类型 | 含义 |
---|
float(m,d) | 单精度浮点型 8位精度(4字节) m总个数,d小数位 | double(m,d) | 双精度浮点型 16位精度(8字节) m总个数,d小数位 |
设一个字段定义为float(6,3)
如果插入一个数123.45678,实际数据库里存的是123.457;
如果插入数12.123456,存储的是12.123;
如果插入12.12,存储的是12.120。
字符串
MySQL数据类型 | 含义 |
---|
char(n) | 固定长度,最多255个字符 | varchar(n) | 固定长度,最多65535个字符 | tinytext | 可变长度,最多255个字符 | text | 可变长度,最多65535个字符 | mediumtext | 可变长度,最多2的24次方-1个字符 | longtext | 可变长度,最多2的32次方-1个字符 |
char和varchar的比较:
char相应速度快,但是占用固定大小;
varchar变长,但是会产生数据碎片;
二、查看数据库
2.1 查看当前服务器中的数据库
SHOW DATABASES;
2.2 查看数据库中包含的表
法一:进入库查看
USE 数据库名;
SHOW TABLES;
法二:在库外查看
show tables from mysql;
2.3 查看表的结构(字段)
法一:在库内查看
use mysql;
describe user;
desc user;
法二:在库外查看 d
esc mysql.user;
注: desc user \G;
2.4 查看mysql版本
select version();
mysql -V
三、SQL语句
SQL语句用于维护管理数据库,包括数据查询、数据更新、访问控制、对象管理等功能。
SQL语句分类:
语句 代表的意思
DDL 数据定义语言,用于创建数据库对象,如库、表、索引等(create )
DML 数据操纵语言,用于对表中的数据进行管理(insert drop delete update )
DQL 数据查询语言,用于从数据表中查找符合条件的数据记录(select )使用最多
DCL 数据控制语言,用于设置或者更改数据库用户或角色权限(grant )
查询语句使用的熟练就是DBA(数据库管理员)
3.1创建及删除数据库和表
3.1.1 创建新的数据库
CREATE DATABASE 数据库名;
mysql> create database student;
3.1.2 创建新的表
主键一般选择能代表唯一性的字段不允许取空值(NULL),一个表只能有一个主键。
CREATE TABLE 表名 (字段1 数据类型,字段2 数据类型[,...][,PRIMARY KEY (主键名)]);
use student;
create table info(id int,name char(10) not null,age int,sex char(4),score decimal(5,2));
desc info;
3.1.3 删除指定的数据表
在数据库内删
mysql> create table info1(id int,name char(10) not null,age int,sex char(4),sccore decimal(5,2));
mysql> drop table info1;
在数据库外删
3.1.4删除指定的数据库
DROP DATABASE 数据库名;
mysql> drop database student;
3.2 管理表中的数据记录
3.2.1向数据表中插入新的数据记录
insert into 表名(字段1,字段2,字段3) values(字段1的值,字段2的值,字段3的值);
mysql> insert into info(id,name,age,sex,score) values(1,'小强',20,'男',95.5);
Query OK, 1 row affected (0.00 sec)
mysql> insert into info(id,name,age,sex,score) values(2,'小红',19,'女',90.9);
Query OK, 1 row affected (0.00 sec)
mysql> select * from info;
+
| id | name | age | sex | score |
+
| 1 | 小强 | 20 | 男 | 95.50 |
| 2 | 小红 | 19 | 女 | 90.90 |
+
2 rows in set (0.00 sec)
直接使用表明加入字段
mysql> insert into info values(3,'小明',25,'男',99.99);
Query OK, 1 row affected (0.00 sec)
mysql> select * from info;
+
| id | name | age | sex | score |
+
| 1 | 小强 | 20 | 男 | 95.50 |
| 2 | 小红 | 19 | 女 | 90.90 |
| 3 | 小明 | 25 | 男 | 99.99 |
+
3 rows in set (0.00 sec)
可以指定字段添加
mysql> insert into info(id,name,age)values(4,'小芳',18);
Query OK, 1 row affected (0.00 sec)
mysql> select * from info;
+
| id | name | age | sex | score |
+
| 1 | 小强 | 20 | 男 | 95.50 |
| 2 | 小红 | 19 | 女 | 90.90 |
| 3 | 小明 | 25 | 男 | 99.99 |
| 4 | 小芳 | 18 | NULL | NULL |
+
4 rows in set (0.00 sec)
3.2.2 查询数据记录
SELECT 字段名1,字段名2[,...] FROM 表名 [WHERE 条件表达式];
mysql> select * from info;
+
| id | name | age | sex | score |
+
| 1 | 小强 | 20 | 男 | 95.50 |
| 2 | 小红 | 19 | 女 | 90.90 |
| 3 | 小明 | 25 | 男 | 99.99 |
| 4 | 小芳 | 18 | NULL | NULL |
+
4 rows in set (0.00 sec)
mysql> select name from info where id=1;
+
| name |
+
| 小强 |
+
1 row in set (0.00 sec)
mysql> select * from info limit 2;
+
| id | name | age | sex | score |
+
| 1 | 小强 | 20 | 男 | 95.50 |
| 2 | 小红 | 19 | 女 | 90.90 |
+
2 rows in set (0.00 sec)
mysql> select * from info where id<=2;
+
| id | name | age | sex | score |
+
| 1 | 小强 | 20 | 男 | 95.50 |
| 2 | 小红 | 19 | 女 | 90.90 |
+
2 rows in set (0.00 sec)
mysql> select * from info limit 2,2;
+
| id | name | age | sex | score |
+
| 3 | 小明 | 25 | 男 | 99.99 |
| 4 | 小芳 | 18 | NULL | NULL |
+
2 rows in set (0.01 sec)
mysql> select * from info where id>2 and id<=4;
+
| id | name | age | sex | score |
+
| 3 | 小明 | 25 | 男 | 99.99 |
| 4 | 小芳 | 18 | NULL | NULL |
+
2 rows in set (0.00 sec)
示例1:查看所有数据
示例2:查询指定数据
示例3:只显示头2行
示例4:显示2-4行
3.3修改、更新数据表中的数据记录
UPDATE 表名 SET 字段名1=字段值1[,字段名2=字段值2] [WHERE 条件表达式];
mysql> select * from info where id=4;
+
| id | name | age | sex | score |
+
| 4 | 小芳 | 18 | NULL | 85.00 |
+
1 row in set (0.00 sec)
3.4 在数据表中删除指定的数据记录
DELETE FROM 表名 [WHERE 条件表达式];
删除表中id为4的记录
mysql> delete from info where id=4;
Query OK, 1 row affected (0.00 sec)
mysql> select * from info;
+
| id | name | age | sex | score |
+
| 1 | 小强 | 20 | 男 | 95.50 |
| 2 | 小红 | 19 | 女 | 90.90 |
| 3 | 小明 | 25 | 男 | 99.99 |
+
3 rows in set (0.00 sec)
3.5修改表名和表结构
3.5.1 修改表名
ALTER TABLE 旧表名 RENAME 新表名;
mysql> alter table info rename base;
Query OK, 0 rows affected (0.00 sec)
mysql> show tables;
+
| Tables_in_student |
+
| base |
| test1 |
| test2 |
+
3 rows in set (0.00 sec)
3.5.2 扩展表结构(增加字段)
ALTER TABLE 表名 ADD address varchar(50) default 'default值';
3.5.3修改字段(列)名,添加唯一键
唯一键的作用,设置这个字段不能重复,比如说身份证、手机号,一般不作为主键,但也不能重复,就设置为唯一键
ALTER TABLE 表名 CHANGE 旧列名 新列名 数据类型 [unique key];
mysql> alter table base change id snum char(4) unique key;
Query OK, 3 rows affected (0.02 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> desc base;
+
| Field | Type | Null | Key | Default | Extra |
+
| snum | char(4) | YES | UNI | NULL | |
| name | char(10) | NO | | NULL | |
| age | int(11) | YES | | NULL | |
| sex | char(4) | YES | | NULL | |
| score | decimal(5,2) | YES | | NULL | |
| address | char(100) | YES | | china | |
+
6 rows in set (0.00 sec)
drop table info unique(key);
3.5.4删除字段
ALTER TABLE 表名 drop 字段名;
mysql> alter table base drop age;
Query OK, 0 rows affected (0.04 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> select * from base;
+
| snum | name | sex | score | address |
+
| 1 | 小强 | 男 | 95.50 | china |
| 2 | 小红 | 女 | 90.90 | china |
| 3 | 小明 | 男 | 99.99 | china |
+
3 rows in set (0.00 sec)
3.6 使用 if 判断 创建表并测试自增和填充
create table if not exists stevelu (
id int(4) zerofill primary key auto_increment,
name char(20) not null,
sid int(18) not null unique key,
ge int(3) not null,
address char(10insert0));
解析:
if not exists:表示检测要创建的表是否已存在,如果不存在就继续创建
int(4) zerofill:表示若数值不满4位数,则前面用“0”填充,例0001
auto_increment:表示此字段为自增长字段,即每条记录自动递增1,默认从1开始递增;自增长字段数据不可以重复;
自增长字段必须是主键;
如添加的记录数据没有指定此字段的值且添加失败也会自动递增一次;
如果插入记录时给定id,下一次自增长根据最大的id开始自增长
unique key:表示此字段唯一键约束,此字段数据不可以重复;一张表中只能有一个主键, 但是一张表中可以有多个唯一键
not null:表示此字段不允许为NULL
四、数据表高级操作
4.1克隆表——将数据表的数据记录生成到新的表中
法一:先创建再导入
create table test1 like info;
insert into test1 select * from info;
mysql> create table test1 like info;
Query OK, 0 rows affected (0.01 sec)
mysql> insert into test1 select * from info;
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> select * from test1;
+
| snum | name | sex | score | address |
+
| 1 | 小强 | 男 | 95.50 | china |
| 2 | 小红 | 女 | 90.90 | china |
| 3 | 小明 | 男 | 99.99 | china |
+
3 rows in set (0.00 sec)
法二:创建的时候同时导入
crmysql> create table test2 (select * from info);
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> select * from test2;
+
| snum | name | sex | score | address |
+
| 1 | 小强 | 男 | 95.50 | china |
| 2 | 小红 | 女 | 90.90 | china |
| 3 | 小明 | 男 | 99.99 | china |
+
3 rows in set (0.00 sec)
#获取数据表的表结构、索引等信息
show create table test1\G;
4.2 清空表——删除表内的所有数据
4.2.1 deldte删除
DELETE清空表后,返回的结果内有删除的记录条目;DELETE工作时是一行一行的删除记录数据的;如果表中有自增长字段,使用DELETE FROM 删除所有记录后,再次新添加的记录会从原来最大的记录 ID 后面继续自增写入记录。
mysql> delete from test1;
Query OK, 3 rows affected (0.00 sec)
mysql> select * from test1;
Empty set (0.00 sec)
4.2.2 truncate删除
TRUNCATE 清空表后,没有返回被删除的条目;TRUNCATE 工作时是将表结构按原样重新建立,因此在速度上 TRUNCATE 会比 DELETE 清空表快;使用 TRUNCATE TABLE 清空表内数据后,ID 会从 1 开始重新记录(相当于格式化)
truncate table info;
4.2.3创建临时表
临时表创建成功之后,使用SHOW TABLES命令是看不到创建的临时表的,临时表会在连接退出后被销毁。 如果在退出连接之前,也可以可执行增删改查等操作,比如使用 DROP TABLE 语句手动直接删除临时表。
create temporary table test03 (
id int(4) zerofill primary key auto_increment,
name varchar(10) not null,
cardid int(18) not null unique key,
score varchar(50));
临时表在重新登录数据库后会被自动销毁
4.3 创建外键约束
保证数据的完整性和一致性
外键的定义:如果同一个属性字段x在表一中是主键,而在表二中不是主键,则字段x称为表二的外键。
主键表与外键表的理解:
(1)以公共关键字作主键的表为主键表(父表、主表)
(2)以公共关键字作为外键的表为外键表(从表、外表)
与外键关联的子表的字段必须设置为主键。要求主表外键字段和子表的字段具备相同的数据类型、字符长度和约束。
专业课程表
课程ID | 课程名称 |
---|
1 | 云计算 | 2 | 大数据 | 3 | JAVA | 4 | 前端 | 主键 | |
学生信息表
学号 | 姓名 | 年龄 | 课程ID |
---|
1 | zhangsan | 18 | 1 | 2 | lisi | 20 | 2 | 3 | wangwu | 22 | 4 | 4 | zhaoliu | 23 | 1 | 5 | zhuba | 24 | 2 | | | | 外键 |
mysql> alter table class add constraint PK_CID primary key(cid);
mysql> insert into class values(1,'云计算');
mysql> insert into class values(2,'大数据');
mysql> insert into class values(3,'java');
mysql> insert into class values(4,'前端');
mysql> alter table student ADD constraint FK_CLASSID foreign key(classid) references class(cid);
mysql> insert into student values(1,'zhangsan',18,1);
mysql> insert into student values(2,'lisi',20,2);
mysql> insert into student values(3,'wangwu',22,4);
mysql> insert into student values(4,'zhaoliu',23,1);
mysql> insert into student values(5,'zhuba',24,2);
主表:class表结构、记录如下
子表:student表结构、记录如下
删除主表记录失败,只有将从表中与之关联的记录删掉,主表才能删掉该记录
此时不可以删除主表,因为主表被外表引用,要查看和删除外键约束 ,如果要删除外键约束字段先删除外键约束,再删除外键名
删除外键步骤:
1.查看外键别名
mysql> show create table student\G;
2.删除外键约束
mysql> alter table student drop foreign key FK_CLASSID;
3.删除别名
mysql> alter table student drop key FK_CLASSID;
做了外键约束后,
要插入新的数据记录时,需要先在主键表中插入相关数据,才能在外键表插入相关数据,插入数据时,是先主后从;
要删除数据记录时,要先删除外键表的相关数据,才能在主键表删除相关数据记录,删除数据时,是先从再主
总结
六种常见的约束
约束名 | 命令 | 含义 |
---|
主键约束 | primary key | 一个表只能有一个主键,该字段不能为空 | 外键约束 | foreign key | 保证数据的完整性和一致性(插入数据时,是先主后从,删除数据时,是先从再主) | 非空约束 | not null | 不能为空 | 唯一性约束 | unique[keylindex] | 不能重复 | 默认值约束 | default | 没有指定值的时候用默认值填充 | 自增约束 | auto_increment | 必须在主键上,每添加一条记录自增1 |
|