数据库二
约束条件
CREATE TABLE default_test(
id INT(5),
number INT(10) DEFAULT 8
);
INSERT INTO default_test(id) VALUES(1);
INSERT INTO default_test VALUES(2, 10);
效果图:
//如果默认值给定了,就会覆盖原来的默认值
2.非空
要限制一个列的值不能为空的关键字是:
CREATE TABLE t_notnull (
notnull_value INT NOT NULL
);
CREATE TABLE not_null(
id INT(5),
number INT(10) NOT NULL
);
INSERT INTO not_null(id) VALUES(1); #也就是说如果不给id值的话就会报错
INSERT INTO not_null VALUES(1, 11);
效果图:
3.唯一键
如果希望某列的值不能重复,可是使用关键字:
CREATE TABLE t_unique (
unique_value INT,
other_value INT,
UNIQUE KEY (unique_value)
);
CREATE TABLE unique_key(
id INT(5),
number INT(10),
UNIQUE KEY(id)
);
INSERT INTO unique_key VALUES(001, 100);#此处001和1在int类型下是等价的,如果换成char类型则不同
INSERT INTO unique_key VALUES(002, 102);
INSERT INTO unique_key VALUES(001, 103);#该语句无法插入,因为id的值只能有一个
效果图:
4.主键 (主键等于 非空+唯一)
通常,每张表都需要一个主键来体现唯一性:
CREATE TABLE t_primarykey (
primarykey_value INT,
PRIMARY KEY (primarykey_value)
);
CREATE TABLE primary_key(
id INT(5),
number INT(10),
PRIMARY KEY(id)
);
INSERT INTO primary_key VALUES(1, 10);
INSERT INTO primary_key VALUES(2, 12);
INSERT INTO primary_key VALUES(1, 11);#唯一键不可重复
INSERT INTO primary_key(number) VALUES(10);#唯一键必须非空
效果图:
5.自增长(AUTO_INCREMENT 要求用在主键上 )
如果希望某整数列的值,默认+1填充:
CREATE TABLE t_auto (
auto_value INT AUTO_INCREMENT,
PRIMARY KEY (auto_value)
);
CREATE TABLE auto_increment(
id INT(5) AUTO_INCREMENT,
number INT(10),
PRIMARY KEY(id)
);
INSERT INTO auto_increment VALUES(NULL, 99);
INSERT INTO auto_increment VALUES(NULL, 99);
INSERT INTO auto_increment VALUES(NULL, 99);
INSERT INTO auto_increment VALUES(8, 99);
INSERT INTO auto_increment VALUES(NULL, 99);#默认+1
效果图:
----------------->
6.外键 (外键有,主键必须得有)
我(外键)有的你一定有,你没有的,我(外键)绝对没有: (我属于你)
CREATE TABLE c ( CREATE TABLE d (
c_col INT, d_col INT, C
PRIMARY KEY (c_col) FOREIGN KEY (d_col) REFERENCES c(c_col)
); );
CREATE TABLE a(
id INT(5),
PRIMARY KEY(id)
);
CREATE TABLE b(
id INT(5),
FOREIGN KEY(id) REFERENCES a(id)
);
INSERT INTO a VALUES(1);
INSERT INTO a VALUES(2);
SELECT * FROM a;
INSERT INTO b VALUES(1);
INSERT INTO b VALUES(2);
INSERT INTO b VALUES(3);#插入失败,因为主键a没有3,则外键b不能有3
INSERT INTO a VALUES(3);
INSERT INTO b VALUES(3);#插入成功,此时主键a有3
效果图:
事务及编码(mysql支持事务)
事务的特点:
表的修改
1.表述:
2.添加列:如果是char 默认为1字节
ALTER TABLE students
ADD adress CHAR;
把列加到第一列:
ALTER TABLE students
ADD address CHAR FIRST;
把列插到任意一列的后面:
ALTER TABLE students
ADD addressS CHAR AFTER age;#插到age的后面
3.删除列:
ALTER TABLE students
DROP adress;
4.修改字段类型:
ALTER TABLE students
MODIFY number INT(10);
5.修改字段名称:
ALTER TABLE students
CHANGE addressS addresss CHAR(12); #將addressS改名成address 注意新的字段要定义清楚
6.修改字段默认值:
ALTER TABLE students
ALTER addressS SET DEFAULT 'xiaos';
7.修改表名:
ALTER TABLE students
RENAME TO new_students;
子查询
示例:
CREATE TABLE students (
number CHAR(9), # 学号
name VARCHAR(20), # 姓名
age INT, # 年龄
birth DATE, # 生日
PRIMARY KEY(number)
);
INSERT INTO students VALUES ('201804001', '刘一', 16, '2002-01-01');
INSERT INTO students VALUES ('201804002', '陈二', 17, '2001-01-02');
INSERT INTO students VALUES ('201804003', '张三', 18, '2000-01-03');
INSERT INTO students VALUES ('201804004', '李四', 19, '2001-01-04');
INSERT INTO students VALUES ('201804005', '王五', 20, '2000-01-05');
INSERT INTO students VALUES ('201804006', '赵六', 21, '1999-01-06');
INSERT INTO students VALUES ('201804007', '孙七', 22, '1999-01-07');
INSERT INTO students VALUES ('201804008', '周八', 23, '1999-01-08');
INSERT INTO students VALUES ('201804009', '吴九', 24, '1999-01-09');
INSERT INTO students VALUES ('201804010', '郑十', 25, '1999-01-10');
问题:如何查找张三的成绩?
第一步 先在student表里找到张三的学号,再根据学号,在grade表里找成绩。
# 获取张三学号
SELECT number FROM students WHERE name='张三';
# 根据学号获取成绩
SELECT grade FROM grades
WHERE student_number=201804003;
#一步完成
SELECT student_number,subject_number,grade FROM grades
WHERE student_number=(SELECT number FROM students WHERE name='张三');
结果:
连续查询:
问题:如何在展示成绩的同时展示出其他成绩?
如何将多张表交叉到一起?
SELECT * FROM students JOIN subjects;
效果:
就是student有十个数据,subject有5个数据,交叉在一起有50个数据。
内连接:
但是现在我们只想要学号和其对应科目的成绩,怎么办。就需要内连接
左表 join 右表 on 左表.字段 = 右表.字段;
on表示连接条件
条件字段就是代表相同的业务含义(如my_student.c_id和my_class.id)
SELECT student_number,title,grade FROM subjects
JOIN grades ON subjects.number=grades.subject_number;
SELECT student_number,title,grade FROM subjects
JOIN grades ON subjects.number=grades.subject_number;
效果:
如果再加上姓名怎么办?
SELECT name,title,grade FROM subjects
JOIN grades ON subjects.number=grades.subject_number
JOIN students ON students.number = grades.student_number;
效果图: