查询字段
1、查询指定字段
select 字段1, 字段2 ,...] from 表名; select ename, sal from emp; select ename from emp; |
2、查询全部字段
select * from 表名; select * from emp; |
条件查询
使用 where 语句,放在 from 后
select * from emp where 条件; select * from emp where empno>7500; |
运算符
3、算术运算符:+ - * / %
# 员工年工资 select * from emp where sal * 12 > 20000; |
4、比较运算符:
5、逻辑运算符:and or not
select * from emp where job = 'salesman' and sal > 1500;
表
存储在表中的数据是一种类型的数据,不同类型的数据应放到不同的表中,否则会使以后的检索和访问很困难。
数据库中的每个表都有一个名字,用来标识自己。此名字是唯一的, 这表示数据库中没有其他表具有相同的名字。
表由一个或多个列组成。每一列存储一列特定的信息,列称为字段,每个列都有相应的数据类型。数据类型定义列可以存储的数据种类。例如,某一列中需要存储数字,该列的数据类型应该定义为数值类型。
数据类型
1、整型
2、浮点型和定点型
3、日期时间类型
4、字符型
DDL(数据定义语言)
Data Definition Language,用于定义和管理数据库中的对象和结构,如表、列、索引等。
创建表
create table [if not exists] 表名( 字段1 字段类型 [列级约束条件], 字段2 字段类型 [列级约束条件], ... [表级约束条件] ); |
create table users( id int, name varchar(20) ); |
查看表
1、显示数据库中的表
show tables; |
2、查看表的基本结构
desc 表名; desc users; |
3、查看数据库/表的创建语句
show create database 数据库名; show create table 表名; |
修改表
理想状态下,当表中存储数据以后,该表就不应该再被更新。在表的设计过程中需要花费大量时间来考虑,以便后期不对该表进行大的改动。
1、添加字段
alter table 表名 add column 新列名 数据类型 [约束条件] [first | after 列名]; |
2、修改字段的类型
alter table 表名 modify column 列名 数据类型 [约束条件]; |
3、修改字段的位置
alter table 表名 modify column 列名 数据类型 first | after 列名; |
4、修改字段名
alter table 表名 change column 旧列名 新列名 数据类型 ; |
5、删除字段
alter table 表名 drop column 列名 |
重命名表
alter table 旧表名 rename to 新表名; |
删除表
drop table [if exists] 表1[, 表2, 表3...]; |
DML(数据操作语言)
Data Manipulation Language,用于操作数据库中的实际数据,如插入、更新、删除和查询数据。
插入数据
插入完整的行,所有字段,每一个字段都必须提供一个值,如果某个字段没有值,应该使用 NULL,每个字段必须以他们在表中定义的顺序给出。这种语法简单,但是不安全,应该避免使用。
insert into 表名 values ( 字段1的值, 字段2的值, ... ); |
更安全的方法是,在表名后的括号中给出字段名,values 中的值的顺序与前面给出的字段的顺序相同,一一对应。不需要与表中定义的顺序相同,没有值的字段可以不提供。
insert into 表名 ( 字段1, 字段2, ... ) values ( 字段1的值, 字段2的值, ... ); |
values 后面可以跟多个括号,括号间用逗号分隔,每个括号代表要插入的一条数据。
单条 insert 语句插入多条数据比多条 insert 语句快。
更新数据
update 表名 set 字段1 = 字段1的值, 字段2 = 字段2的值, ... where 限制条件; |
记得加 where 限制条件,否则更新整个表中的每一条数据。
删除数据
delete from 表名 where 限制条件; |
同样,不加限制条件会删除整个表中每一条数据。
物理删除,无法恢复。
注意:在对 update 或 delete 使用 where 前,应该先用 select 语句进行测试,保证它的过滤结果是正确的。
约束
constraint
约束类型 | 非空约束 | 默认约束 | 唯一约束 | 主键约束 | 外键约束 |
关键字 | not null | default | unique | primary key | foreign key |
非空约束
NOT NULL,是否不可以为空(NULL),NULL 值就是没有值或缺值,非空就是不可以在插入时不给出该列的值,该列必须有值。
- 创建表时设置非空约束
create table 表名( 字段名 字段类型 not null, ... ); |
drop table if exists users; create table users( id int not null, name varchar(20) ); # 报错,id没有默认值,不允许为空 insert into users(name) values("李四"); |
- 已有字段添加非空约束
alter table 表名 modify column 字段名 字段类型 not null; |
- 删除非空约束(修改为允许为空)
alter table 表名 modify column 字段名 字段类型; |
注意:不要混淆 NULL 值和空串,NULL值是没有值,空串是 ''(两个单引号,中间没有字符)
默认约束
DEFAULT,如果在插入行时没有给出值,通过 DEFAULT 指定此时使用的默认值。
create table 表名( 字段名 字段类型 default 默认值, ... ); |
drop table if exists users; create table users( id int not null default 666, name varchar(20) ); # 不报错 insert into users(name) values("李四"); select * from users; |
唯一约束
用于确保特定列或列组合的唯一性,被约束的列的值在整个表中是唯一的,唯一约束默认允许空值(null),因此多个空值不违反唯一约束。
- 列级
create table 表名( 字段名 字段类型 unique, ... ); |
drop table if exists users; create table users( id int not null default 666, name varchar(20) unique ); insert into users(id, name) values(1, "李四"); insert into users(id, name) values(2, "李四"); insert into users(id) values(3); insert into users(id) values(4); |
- 表级,可以给约束起名,可以创建多列的唯一约束(联合唯一约束)
create table 表名( 字段1 字段类型, 字段2 字段类型, ... [constraint 约束名] unique(字段1[, 字段2, ...]) ); |
drop table if exists users; create table users( id int not null default 666, name varchar(20), unique(id, name) ); insert into users(id, name) values(1, "李四"); insert into users(id, name) values(2, "李四"); insert into users(id, name) values(1, "张三"); insert into users(id, name) values(1, "李四");#报错 insert into users(name) values("李四"); insert into users(name) values("李四");#报错 insert into users(id) values(5); insert into users(id) values(5); |
- 已有字段添加唯一约束
alter table 表名 modify 字段名 字段类型 unique ; alter table 表名 add [constraint 约束名] unique(字段名) ; |
- 删除唯一约束
alter table 表名 drop index 约束名; alter table 表名 drop key 约束名; |
主键约束
唯一标识表中每行的这个列(或这组列)称为主键。主键用来表示一个特定的行。没有主键,更新或删除表中特定行很困难,因为没有安全的方法保证只涉及相关的行。
因此:
- 每一个表都应该定义主键
- 主键的值不应该修改
- 不使用可能会修改值的列作为主键(与业务无关,通常使用 id 作为主键)
特点:
- 唯一性:主键要求每一行数据的主键值都必须是唯一的,不允许有重复值。
- 非空性:主键要求主键列的值不能为空,即不能为 NULL。
- 单一性:每个表只能有一个主键。主键可以由一个列或多个列组成,形成复合主键
- 列级
create table 表名( 字段名 字段类型 primary key, ... ); |
drop table if exists users; create table users( id int primary key, name varchar(20) unique ); insert into users(id, name) values(1, "张三"); insert into users(id, name) values(1, "李四"); insert into users(name) values("王五"); insert into users(id) values(2); |
- 表级,可以给约束起名,可以创建多列的联合主键
create table 表名( 字段1 字段类型, 字段2 字段类型, ... [constraint 约束名] primary key(字段1[, 字段2, ...]) ); |
- 删除主键
alter table 表名 drop primary key; |
自动递增
auto_increment:设置 auto_increment 的列,当每增加一行时自动增量。每个表只允许一个 auto_increment 列。
create table 表名( 字段1 字段类型 auto_increment ); |
drop table if exists users; create table users( id int primary key auto_increment, name varchar(20) unique ); insert into users(name) values("李四"); insert into users(name) values("张三"); insert into users(id,name) values(5, "王五"); insert into users(name) values("赵六"); |
外键约束
外键为表中的某一字段,该字段是另一表的主键值,外键用来在两个表的数据之间建立联结,一个表中可以有一个或多个外键。外键的作用是保持数据的一致性、完整性。
注意:
- 外键字段可以为null,外键为空的数据也叫孤儿数据
- 有了外键引用之后,表分为父表和子表
- 创建表时先创建父表,再创建子表
- 插入数据时,先插入父表数据,再插入子表数据
- 删除时先删除子表,再删除父表
- 子表外键类型要与父表外键类型一致
在子表创建外键:
[constraint 外键名] foreign key (列名) references 主表名(主键); create table student( id int primary key auto_increment, name varchar(20) unique ); create table score( id int primary key auto_increment, student_id int , degree int, constraint fk1 foreign key (student_id) references student(id) ); insert into score(student_id, degree) values(1, 90);#报错 insert into student(name) values("李四"); insert into score(student_id, degree) values(1, 90); insert into score(degree) values(90); delete from student where id=1;#报错 delete from score where student_id=1; delete from student where id=1; |