MySql 数据库、表常用语句

数据库

查看当前所有数据库

sql 复制代码
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+

创建一个新数据库

创建一个叫senpai的数据库:

sql 复制代码
mysql> create database senpai;

创建一个重名的数据库会报错。所以良好的创建数据库的习惯是先检查senpai的存在性,如果不存在就创建,如果存在那么不进行任何操作。下面的语句就是这个功能。

sql 复制代码
mysql> create database if not exists senpai;

在 Windows 下,数据库名、表名这些是不区分大小写的,即senpai,SenPai,SENPAI都是同一个数据库。但是 Linux 下会严格区分大小写。

切换数据库

切换到一个叫senpai的数据库:

sql 复制代码
mysql> use senpai;

切换一个不存在的数据库会报错。

删除数据库

删除一个叫senpai的数据库。同样地,由于删除不存在的数据库会报错,建议使用下面第二条语句。

sql 复制代码
mysql> drop database senpai;
mysql> drop database if exists senpai;

基本表

只有指定了具体的数据库或者模式,才能进行对表的操作。比如下面在数据库senpai里进行表的操作,需要先use senpai;

定义基本表 AND 表的主码约束

最基本的情况就是对每一列进行定义,如有下面的"学生表":

列名 类型
Sno char(9)
Sname char(20)
Ssex char(2)
Sage smallint
Sdept char(20)

可以使用如下语句进行定义,基本格式是列名 + 数据类型 + 列级完整性约束条件

sql 复制代码
create table Student(
	Sno char(9) primary key,
	Sname char(20) unique,
	Ssex char(2),
	Sage smallint,
	Sdept char(20)
);

完整性约束包括实体完整性 (要定义主码primary key),参照完整性 (可能要定义外码foreign key),以及用户定义的完整性 (比如上面的unique唯一性,当然还有not null非空,unsigned非负等)。

上面是一个属性作为主码。如果多个属性作为主码要用括号括起来,放在表级完整性约束里面(单属性主码也可以这样)。比如

sql 复制代码
create table SC(
	Sno char(9),
	Cno int, // 到这里都是列级完整性
	primary key(Sno,Cno); // 表级完整性约束
	...
);

外码约束

sql 复制代码
create table SC(
	Sno char(9) foreign key references ,
	Cno int,
	...
	foreign key(Sno) references Student(Sno),
	foreign key(Cno) references Course(Cno)
);

其它约束

Check约束

有时候一些列的取值限定在某个范围内,或者列与列之间存在相互约束,就可以用check(约束条件)来约束。

字段名称 数据类型 备注
pid char(10) 产品户ID,主码
name varchar(32) 产品名称
brand char(10) 品牌,只能是('A','B')中的某一个
price int 价格,必须 > 0 >0 >0
sql 复制代码
drop table if exists products;
create table products(
    ...,
    brand char(10) [constraint CK_products_brand] check(brand in ('A','B')),
    price int [constraint CK_products_price] check(price > 0)
);

中括号里是给约束加名字,可省略。

Default 约束

给属性列设置默认值。

sql 复制代码
create table test(
   pk int primary key,
   test_col int default 114514);

只有在缺省插入值时,才会触发默认值。如果指定该列是NULL则不会触发默认值。

sql 复制代码
mysql> insert into test values(1,NULL);
mysql> insert into test (pk) values (2);

上面语句的执行结果:

mysql> select * from test;
+----+----------+
| pk | test_col |
+----+----------+
|  1 |     NULL |
|  2 |   114514 |
+----+----------+
2 rows in set (0.00 sec)

Unique 约束

它和主码约束有点像,可以令某一属性列具有唯一性,也可以令多个属性列的组合具有唯一性。

sql 复制代码
create table test(
   pk int primary key,
   col1 int unique,
   col2 int
);

不能出现重复的col1,比如插入(0,1,2),(1,1,3)会报错。

sql 复制代码
create table test(
   pk int primary key,
   col1 int,
   col2 int,
   unique(col1,col2)
);

不能出现重复的(col1,col2),但是col1或者col2本身可以重复。

sql 复制代码
mysql> insert into test values(0,1,2),(1,2,1),(2,1,1),(3,2,2);
Query OK, 4 rows affected (0.01 sec)
Records: 4  Duplicates: 0  Warnings: 0

可行,结果如下:

mysql> select * from test;
+----+------+------+
| pk | col1 | col2 |
+----+------+------+
|  2 |    1 |    1 |
|  0 |    1 |    2 |
|  1 |    2 |    1 |
|  3 |    2 |    2 |
+----+------+------+
4 rows in set (0.00 sec)

插入重复的(col1,col2) = (1,1)后报错。

sql 复制代码
mysql> insert into test values(5,1,1);
ERROR 1062 (23000): Duplicate entry '1-1' for key 'test.col1'
相关推荐
数据龙傲天37 分钟前
1688商品API接口:电商数据自动化的新引擎
java·大数据·sql·mysql
engineer-gxd1 小时前
MySQL 表的操作
mysql
cyt涛1 小时前
MyBatis 学习总结
数据库·sql·学习·mysql·mybatis·jdbc·lombok
Rookie也要加油2 小时前
01_SQLite
数据库·sqlite
liuxin334455662 小时前
教育技术革新:SpringBoot在线教育系统开发
数据库·spring boot·后端
看山还是山,看水还是。3 小时前
MySQL 管理
数据库·笔记·mysql·adb
fishmemory7sec3 小时前
Koa2项目实战2(路由管理、项目结构优化)
数据库·mongodb·koa
momo小菜pa3 小时前
【MySQL 09】表的内外连接
数据库·mysql
Jasonakeke3 小时前
【重学 MySQL】四十九、阿里 MySQL 命名规范及 MySQL8 DDL 的原子化
数据库·mysql
程序猿小D3 小时前
第二百六十九节 JPA教程 - JPA查询OrderBy两个属性示例
java·开发语言·数据库·windows·jpa