create table tb(
id INT PRIMARY KEY AUTO_INCREMENT,
age int NOT NULL ,
num VARCHAR(10) ,
sex CHAR(1),
unique(age,num)
);
MySQL无法直接删除主键约束,需通过复制原表格,进行重新起名。
通过as(可省略)为列名起其他名时,必须在该列已创建的情况下进行取名。
外键中带有括号的地方表从属关系,不可以去掉括号。
CREATE TABLE STUDENT (
ID INT PRIMARY KEY,
NAME VARCHAR(20) NOT NULL,
C_id CHAR(10),
FOREIGN KEY (C_id) REFERENCES Course(id)
);
放最后进行设置:外键FORIGN KEY .
多表查询
笛卡尔积:取A.B集合所有的组合情况
多表查询:从多张表查询数据
-- 查询隐式内连接
select * from emp,dep where dep.id=emp.id;
-- 查询显式内连接
SELECT *from emp inner join dep on dep.id=emp.id;
-- 查询左外连接
SELECT * from emp LEFT JOIN dep on dep.id=emp.id;
-- 查询右外连接S
SELECT * from emp right join dep on dep.id=emp.id;
子查询
-- 子查询
-- 单行单列:作为条件,使用= != > <等进行条件判断
SELECT * FROM emp ,dep;
-- 查询age>=孙七的年纪的员工信息
step1:查询孙七的年纪
SELECT age FROM emp WHERE name="孙七";
step2:查询年纪大于22的员工信息
SELECT * from emp WHERE age>=22;
-- 综上:
SELECT *from emp where age>=(SELECT age from emp WHERE name="孙七");
-- 多行单列:
-- 查询"销售部"和"研发部"的所有的员工信息
step1:查询销售部和研发部对应emp表中的所在id
select id from dep WHERE dep_name='销售部' or dep_name='研发部';
SELECT * FROM emp where dep_id in ( select id from dep WHERE dep_name='销售部' or dep_name='研发部');
-- 多行多列
-- 查询年龄在20岁之后的员工信息和部门信息
step1:查询日期在20岁之后的员工
SELECT * FROM emp where age>=20;
step2:查询这些员工的员工信息和部门信息
SELECT * from emp,dep where emp.dep_id=dep.id;
-- 综合得到:
-- 将初步筛选的多行多列的表起别名为t1
SELECT * FROM (SELECT * FROM emp where age>=20) t1 ,dep WHERE t1.dep_id=dep.id;
事务
DROP TABLE IF EXISTS account;
-- 创建账户表
CREATE table account(
id int auto_increment PRIMARY KEY,
name char(10),
money double(10,2)
);
-- 添加数据
INSERT INTO account(name,money) VALUES('张三',1000),('李四',1000);
SELECT * from account;
-- 转账操作
-- 开启事务:语句出错会重新初始化
BEGIN;
-- 1.查询李四的余额
SELECT money FROM account where name='李四';
-- 2.李四金额-500
UPDATE account set money=money-500 WHERE name='李四';
-- 3.张三金额+500
UPDATE account set money=money+500 where name='张三';
-- 提交事务
COMMIT;
-- 回滚事务
-- 回到开始事物的地方
ROLLBACK;