2020-08-06
初学数据库
DDL 数据定义语言 库|表
创建数据库
CREATE DATABASE java;
创建学生表
create table stu (
sid int,
sname varchar(20),
sage int,
birthday date,
score double(5,2)
);
– 添加 列–
alter table 表名 add 列名 类型(长度);
– 给stu添加性别字段alter table stu add sex char(1);
– 删除列–
alter table 表名 drop 列名;
alter table stu drop sex;
– 列更名+类型–
alter table 表名 change 旧列名 新列名 类型(长度);
alter table stu change sage stuage varchar(10);
– 表改名
rename table stu to stuuu;
– 表删除
drop table stu2;
– 查看表结构/查看建表语句
show create table stu;
DML 数据操作 -对表中数据的增删改
增
插入insert into 表名 (字段1,字段2,…) values (值1,值2,…);
1 插入的字段个数任意,顺序与原表无关
2 值的顺序与字段顺序一致
3 插入的数字:直接写数字即可 字符串和日期需要使用单引号 ‘’
4 插入空值时,传入null
5 插入全表数据时,还可以省略写字段,默认插入全表数据
insert into stu values(值1,值2,…);
那么后续的值的顺序与原表字段一致
-- 插入学生学号,姓名,年龄
insert into stu (sid,sname,sage) values (1,'张三',18);
insert into stu (sage,sname,sid,sbirthday) values (2,'李四',18,'2020-08-06');
insert into stu (sage,sname,sid,sbirthday) values (19,'王五',3,null);
insert into stu (sid,sname,sage,sbirthday,score) values (4,'赵六',20,null,99.2);
insert into stu values (5,'周期',21,null,100);
改
增加数据- 插入insert into 表名 (字段1,字段2,…) values (值1,值2,…);
1 插入的字段个数任意,顺序与原表无关
2 值的顺序与字段顺序一致
3 插入的数字:直接写数字即可 字符串和日期需要使用单引号 ‘’
4 插入空值时,传入null
5 插入全表数据时,还可以省略写字段,默认插入全表数据 insert into stu values(值1,值2,…);那么后续的值的顺序与原表字段一致
```sql
-- 插入学生学号,姓名,年龄
insert into stu (sid,sname,sage) values (1,'张三',18);
insert into stu (sage,sname,sid,sbirthday) values (2,'李四',18,'2020-08-06');
insert into stu (sage,sname,sid,sbirthday) values (19,'王五',3,null)insert into stu (sid,sname,sage,sbirthday,score) values (4,'赵六',20,null,99.2);
insert into stu values (5,'周期',21,null,100);
修改数据:
更新
修改单个字段: update 表名 set 字段 = 值 [where 字段 = 值];
修改多个字段: update 表名 set 字段1 = 值1,字段2 = 值2 [where 字段 = 值];
特别注意 : 不加后面的where过滤条件,更新全表 加上where后的条件,只更新符合条件的 根据where后的条件如果找不到数据,那就不更新*/
-- 将学号为1的学生年龄改为20
update stu set sage = 20 where sid = 10;
-- 将年龄为20的学生生日改为2020-01-01
update stu set sbirthday = '2020-01-01' where sage = 20;
-- 将学号为4的学生姓名改为张飞,生日改为2020-01-01
update stu set sname = '张飞',sbirthday = '2020-01-01' where sid = 4;
删除delete from 表 [where 字段 = 值];
特别注意: 不加where条件,会删除全表数据,慎用!
-- 删除学号为5的学生信息
delete from stu where sid = 5;
-- 删除年龄为20的学生信息
delete from stu where sage = 20;
-- 删全表
delete from stu;
约束
create table stu (
sid int [约束],
sname varchar(20) [约束],
sage int, birthday date,
score double(5,2)
);
约束该列数据存储时的限制.在创建表的时候指定该列的限制条件 , 后续也可以更改.
主键
主键primary key:设置主键的列,不能为空,且唯一
一半给id列设置主键
-- 主键设置方法1
CREATE TABLE s1(
id int PRIMARY KEY,
name varchar (10)
);
-- 主键设置方法2
CREATE TABLE s2(
id int ,
name varchar (10),
PRIMARY KEY(id)
);
– 设置联合主键
– 主键不能为空 ,插入时,必须指定主键
– 报错:主键没有值且不能重复 INSERT INTO s1(name) VALUES(1,‘张三’);
– INSERT INTO s1(id,name) VALUES(1,‘李四’); 插入成功
报错:因为已经有id = 1 的行数据了, INSERT INTO s1(id,name) VALUES(1,‘张三’);
自增:auto_increment 列自动增长,一般配合主键使用
当主键设置了自增,在插入时就可以不指定主键值,使其自增,每次自增1
CREATE TABLE s3(
id int PRIMARY KEY auto_increment,
name varchar(10)
);
INSERT INTO s3(name) VALUES('zs');
#执行三次后 执行删除,再执行插入
-- 当删除一行后数据后,继续使用自增,还是会从删除的数据之后进行自增
DELETE FROM s3 WHERE id = 3;
-
- =============================================
/*
唯一 UNIQUE:让该列数据唯一,不重复
*/
CREATE TABLE s4(
id int primary key auto_increment,
name varchar(10) unique
);
--语句执行,自增执行,最后name重复导致数据没有插入成功,但是自增已经执行,
-- 下次再执行,就不会按照元彪的顺序继续
-- 执行两次 表中有一个name为 ls 的数据,但是自增执行了两次,因为name是唯一unique 不能重复
INSERT INTO s4(name) VALUES('ls');
-- 执行一次,但是id 为 3 因为中间一次插入没有成功,但是已经自增
INSERT INTO s4(name) VALUES('zs');
不为空 NOT NULL:该列的值,在插入时不能为空
CREATE TABLE s5(
id int PRIMARY KEY auto_increment,
name VARCHAR(10) UNIQUE,
age INT NOT NULL
);
-- 报错:插入时没有指定age的值, age 的约束条件为 NOT NULL
-- INSERT INTO s5(name) VALUES('zs');
默认值 DEFAULT:插入数据时,没有指定该列,就会填充上默认值
CREATE TABLE s6(
id INT PRIMARY KEY auto_increment,
name VARCHAR(10) UNIQUE,-- 可以设置默认值 DEFAULT 'admin';
age INT NOT NULL DEFAULT 0 -- 当不指定age时,默认就是0
);
INSERT INTO s6(name ) VALUES('ls');
注释:comment 在建表时给列指定注释,如果有约束,放在约束后
再该表的对象信息的DDL中查看
*/
CREATE TABLE s7(
id int PRIMARY KEY auto_increment COMMENT '主键id',
name VARCHAR(10) UNIQUE DEFAULT 'admin'COMMENT '默认值 admin',
age INT NOT NULL DEFAULT 0 COMMENT '默认值0'
);
/*
查询 select:返回从表中查出的数据,返回到的是一张虚拟表
基本查询: SELECT 字段1,字段2,... FROM 表名;
1)字段顺序与原表无关
2)字段个数根据需求而定
3)返回的虚拟表字段顺序与原表无关,与select后的字段顺序有关
*/
-- 查询所有列: SELECT * FROM 表名
SELECT sid,sname,age,gender,score,cid,groupLeaderId FROM stu;
-- 查询指定列
-- 查询学生学号和姓名
SELECT sid,sname FROM stu;
-- 查询学生学号和成绩
SELECT sid,score FROM stu;
-- ========================================
/*
条件查询:返回符合条件的数据
条件查询需要在 基础查询语句后,使用where 字段 运算符 值;
条件查询关系符号: > < >= <= != =
and,
or ,
in (set) (set)是说in后是集合,集合数据不重复,查询的数据满足集合中的条件,即可返回
not in ,
butween and,
*/
-- 查询学号为1的学生信息
SELECT * FROM stu WHERE sid = 1001;
-- 查询学生性别为女,并且年龄小于50的记录
SELECT * FROM stu WHERE gender = '女'AND age<50;
-- 查询学生学号为1001,或者姓名为李四的记录
SELECT * FROM stu WHERE sid = 1001 OR sname = '李四';
-- 查询学号为1001,1002,1003的记录
-- SELECT * FROM stu WHERE sid=1001 OR sid=1002 OR sid=1003;
SELECT WHERE sid IN(1001,1002,1003); * FROM stu
-- 查询学号不是1001,1002,1003的记录
-- SELECT * FROM stu WHERE sid != 1001 AND sid != 1002 AND sid !=1003;
SELECT * FROM stu WHERE sid NOT IN(1001,1002,1003);
-- 查询学生年龄在20到40之间的学生记录
SELECT * FROM stu WHERE age BETWEEN 20 AND 40;
-- 查询性别非男的学生记录
SELECT * FROM stu WHERE gender != '男';
-- 查询学生分数大于60的学生id 姓名 分数,
SELECT sid ,sname,score FROM stu WHERE score >60;
-- ======================================================
/*
模糊查询 WHERE 字段 LIKE '%或者_值'
% 匹配任意个数的字符
%张->以'张'结尾,前边任意
张%->以'张'开头,后边任意
%张% ->只要内容包含'张' 即可。
_匹配一个任意字符
*/
-- 查询姓名以'张'开头的学生记录
SELECT * FROM stu WHERE sname LIKE '%张'; -- %张 以张结尾
SELECT * FROM stu WHERE sname LIKE '张%'; -- 以张开头, 后面任意
SELECT * FROM stu WHERE sname LIKE '_张'; -- 以张开头 一个_代表一个字
SELECT * FROM stu WHERE sname LIKE '张_'; --
-- 查询姓名中包含“三”的学生记录
SELECT * FROM stu WHERE sname like '%三%';
-- ============================================
/*
排序查询 基础查询后使用, ORDER BY 字段 排序类型;
排序类型: 升序 ASC,降序 DESC
默认是升序,可以不写
注意:如果没有条件查询,ORDER BY放在基础查询后,如果有条件查询,
规定必须要放在条件查询后
*/
-- 查询所有学生记录,按年龄升序排序
SELECT * FROM stu ORDER BY age;
-- 查询所有学生记录,按年龄降序排序
SELECT * FROM stu ORDER BY age DESC;
-- 查询所有学生记录,按年龄升序排序,如果年龄相同时,按编号降序排序
SELECT * FROM stu ORDER BY age ,sid DESC;
-- 查询成绩达于60的学生id,姓名,成绩,并根据成绩降序
SELECT * FROM stu WHERE score>60 ORDER BY score desc ;
加油