mysql -u root -p
SHOW databases;
USE 数据库名;
SHOW tables
SELECT * FROM 表名
CREATE DATABASE 数据库名
CREATE TABLE students(name VARCHAR(20),id VARCHAR(20),sex CHAR(1),grade INT);
DESCRIBE students
INSERT INTO 表名
VALUES('内容1','内容2');
常用数据类型
INT或INTEGER
BIGINT FLOAT DOUBLEDELETE FROM 表名 WHERE 条件
UPDATE SET 改前='改后' WHERE 条件
它能够唯一确定一张表中的一条记录。使得该字段不重复且不为空。
添加单条约束:
CREATE TABLE user
(
id INT PRIMARY KEY,--这里id不为空、不重复
name VARCHAR(20)
);
添加联合约束:
CREATE TABLE user2
(
id INT,
name VARCHAR(20)
password VARCHAR(20)
PRIMARY KEY(id,name)--这里id和name都不能为空,不能同时重复
);
CREATE TABLE user3
(
id INT PRIMARY AUTO_INCREMENT,
name varchar(20)
);
INSERT INTO user3(name) VALUES('张三');--没有设定id,但id按加入顺序从1开始自增
ALTER TABLE user4 ADD PRIMARY KEY(id);
ALTER TABLE user4 DROP PRIMARY KEY;
ALTER TABLE user4 MODIFY id INT PRIMARY KEY;
在建表时设置唯一约束:
格式一:这种格式可以同时设置多个
CREATE TABLE user5
(
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20);
UNIQUE(id,name);
--id和name都设置,此时不同时重复就可以添加,类似联合主键
)
格式二:
CREATE TABLE user6
(
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20) UNIQUE//只设置name
);
建表后再添加唯一约束
CREATE TABLE user7
(
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20);
)
ALTER TABLE user4 ADD UNIQUE(name);//新增name为唯一约束
ALTER TABLE user7 DROP INDEX name;
ALTER TABLE user7 MODIFY name VARCHAR(20) UNIQUE;
总结:
修饰的字段不能为null
CREATE TABLE user9
(
name VARCHAR(20) NOT NULL;
)
如果没有传值使用默认值
CREATE TABLE user10
(
id INT,
name VARCHAR(20),
age INT DEFAULT 10
);
涉及到两个表:父表,子表
或 主表,副表
CREATE TABLE classes--班级表
(
id INT PRIMARY KEY,
name VARCHAR(20)
);
CREATE TABLE students--学生表
(
id INT PRIMARY KEY,
name VARCHAR(20),
class_id INT,
FOREIGN KEY(class_id) REFERENCES classes(id)
);
INSERT INTO classes VALUES(1,'一班');
INSERT INTO classes VALUES(2,'二班');
INSERT INTO classes VALUES(3,'三班');
INSERT INTO classes VALUES(4,'四班');
INSERT INTO students VALUES(1005,'王五',5);--是错误的
DELETE FROM classes WHERE id=4;--错误
范式,设计得越详细,对某些实际操作可能更好,但是不一定都是好的。
CREATE TABLE myorder
(
product_id INT,
customer_id INT,
product_name VARCHAR(20),
customer_name VARCHAR(20),
PRIMARY KEY(product_id,customer_id)
);--不满足第二范式
CREATE TABLE myorder
(
order_id INT PRIMARY KEY
product_id INT,
customer_id INT,
);
CREATE TABLE product
(
id INT PRIMARY KEY;
name VARCHAR(20)
);
CREATE TABLE customer
(
id INT PRIMARY KEY;
name VARCHAR(20)
);--分成三个表满足第二范式
CREATE TABLE myorder
(
order_id INT PRIMARY KEY,
product_id INT,
customer_id INT,
customer_phone VARCHAR(15)
);--customer_phone可以通过customer_id找到,不满足第三范式
CREATE TABLE myorder
(
order_id INT PRIMARY KEY,
product_id INT,
customer_id INT
);
CREATE TABLE customer
(
id INT PRIMARY KEY,
name VARCHAR(20),
phone VARCHAR(15)
);--满足第三范式
学生表:
学号
姓名
性别
生日
班级
CREATE TABLE student
(
snum VARCHAR(20) PRIMARY KEY,
sname VARCHAR(20) not null,
ssex VARCHAR(10) not null,
sbirthday DATETIME,
class VARCHAR(20)
);
教师表:
教师编号
教师名字
教师性别
教师生日
职称
所在部门
CREATE TABLE teacher
(
tnum VARCHAR(20) PRIMARY KEY,
tname VARCHAR(20) NOT NULL,
tsex VARCHAR(10) NOT NULL,
tbirthday DATETIME,
prof VARCHAR(20) NOT NULL,
depart VARCHAR(20) NOT NULL
);
课程表:
课程号
课程名
教师编号
CREATE TABLE course
(
cnum VARCHAR(20) PRIMARY KEY,
cname VARCHAR(20) NOT NULL,
tnum VARCHAR(20) NOT NULL,
FOREIGN KEY(tnum) REFERENCES teacher(tnum)
);
成绩表:
学号
课程号
成绩
CREATE TABLE score
(
snum VARCHAR(20) NOT NULL,
cnum VARCHAR(20) NOT NULL,
degree DECIMAL,
FOREIGN KEY(snum) REFERENCES student(snum),
FOREIGN KEY(cnum) REFERENCES course(cnum),
PRIMARY KEY(snum,cnum)
);
学生表:
INSERT INTO student VALUES('101','曾华','男','1977-09-01','95033');
INSERT INTO student VALUES('102','匡明','男','1975-10-02','95031');
INSERT INTO student VALUES('103','王丽','女','1976-01-23','95033');
INSERT INTO student VALUES('104','李军','男','1976-02-20','95033');
INSERT INTO student VALUES('105','王芳','女','1975-02-10','95031');
INSERT INTO student VALUES('106','陆军','男','1974-06-03','95031');
INSERT INTO student VALUES('107','王尼玛','男','1976-02-20','95033');
INSERT INTO student VALUES('108','张全蛋','男','1975-02-10','95031');
INSERT INTO student VALUES('109','赵铁柱','男','1974-06-03','95031');
教师表:
INSERT INTO teacher VALUES('804','李诚','男','1958-12-02','副教授','计算机系');
INSERT INTO teacher VALUES('856','张旭','男','1969-03-12','讲师','电子工程系');
INSERT INTO teacher VALUES('825','王萍','女','1972-05-05','助教','计算机系');
INSERT INTO teacher VALUES('831','刘冰','女','1977-08-14','助教','电子工程系');
课程表:
INSERT INTO course VALUES('3-105','计算机导论','825');
INSERT INTO course VALUES('3-245','操作系统','804');
INSERT INTO course VALUES('6-166','数字电路','856');
INSERT INTO course VALUES('9-888','高等数学','831');
成绩表:
INSERT INTO score VALUES('103','3-245','86');
INSERT INTO score VALUES('105','3-245','75');
INSERT INTO score VALUES('109','3-245','68');
INSERT INTO score VALUES('103','3-105','92');
INSERT INTO score VALUES('105','3-105','88');
INSERT INTO score VALUES('109','3-105','76');
INSERT INTO score VALUES('103','6-166','85');
INSERT INTO score VALUES('105','6-166','79');
INSERT INTO score VALUES('109','6-166','81');
SELECT * FROM student;
SELECT sname,ssex FROM student;
SELECT DISTINCT depart FROM teacher;
SELECT * FROM score WHERE degree BETWEEN 60 AND 80;
SELECT * FROM score WHERE degree>60 AND degree<80;
SELECT * FROM score WHERE degree IN(85,86,88);
SELECT * FROM student WHERE class='95031' OR ssex='女';
SELECT * FROM student ORDER BY class DESC;
SELECT * FROM score ORDER BY cnum ASC,degree DESC;
SELECT COUNT(*) FROM student WHERE class='95031';
SELECT snum,cnum FROM score WHERE degree=(SELECT MAX(degree) FROM score);
SELECT snum,cnum,degree FROM score ORDER BY degree DESC LIMIT 0,1;
(LIMIT x,y表示从x条数据开始,查询y条)SELECT AVG(degree) FROM score WHERE cnum=''3-105';
–某门课SELECT AVG(degree) FROM score GROUP BY cnum;
–GROUP BY分组SELECT cnum FROM score GROUP BY cnum HAVING COUNT(cnum)>=2 AND cnum LIKE '3%';
SELECT sname,cnum,degree FROM student,score
WHERE student.snum=score.snum;
SELECT sname,cname,degree FROM student,course,score
WHERE student.snum=score.snum AND course.cnum=score.cnum;
SELECT cnum,avg(degree) FROM score
WHERE snum IN(SELECT snum FROM student WHERE class='95031')
GROUP BY cnum;
SELECT * FROM score
WHERE cnum='3-105'
AND degree>(SELECT degree FROM score
WHERE snum='109' AND cnum='3-105');
SELECT snum,sname,sbirthday FROM student
WHERE YEAR(sbirthday) IN (SELECT YEAR(sbirthday) FROM student
WHERE snum IN(108,101));
--注意两个灵性的IN
SELECT degree,snum FROM score
WHERE cnum IN(SELECT cnum FROM course
WHERE tnum IN (SELECT tnum FROM teacher
WHERE tname='张旭'))
INSERT INTO score VALUES('107','3-105','80');--手动改下人数。。
SELECT tname FROM teacher WHERE tnum IN
(SELECT tnum FROM course WHERE cnum IN
(SELECT cnum FROM score GROUP BY cnum
HAVING count(*)>3));
--HAVING和GROUP BY配合使用,实现先分组再执行HAVING后条件
SELECT * FROM score WHERE cnum IN
(SELECT cnum FROM course WHERE tnum IN
(SELECT tnum FROM teacher WHERE depart='J=计算机系'));
SELECT tname,prof FROM teacher WHERE depart='计算机系'
AND prof NOT IN
(SELECT prof FROM teacher WHERE depart='电子工程系');
UNION--拼接两个表
SELECT tname,prof FROM teacher WHERE depart='电子工程系'
AND prof NOT IN
(SELECT prof FROM teacher WHERE depart='计算机系');
SELECT * FROM score WHERE cnum='3-105'
AND degree>ANY(SELECT * FROM score WHERE cnum='3-245')
ORDER BY degree DESC;
SELECT * FROM score WHERE cnum='3-105'
AND degree>ALL(SELECT * FROM score WHERE cnum='3-245')
ORDER BY degree DESC;
--加AS也可
SELECT tname name,tsex sex,tbirthday birthday FROM teacher
UNION
SELECT sname,ssex,sbirthday FROM student;
SELECT * FROM score a WHERE degree<
(SELECT AVG(degree) FROM score b
WHERE a.cnum=b.cnum);
--将表a某条待查的课程号作为条件,
--查询表b中所有该课程号的分数平均值,再与a进行分数比较
SELECT class FROM student WHERE
ssex='男' GROUP BY class
HAVING COUNT(*)>=2;
SELECT * FROM student WHERE sname
NOT LIKE'王%';
SELECT sname,YEAR(NOW())-YEAR(sbirthday) age FROM student;
SELECT MAX(sbirthday) '最大',MIN(sbirthday) '最小' FROM student;
SELECT * FROM student ORDER BY class DESC,sbirthday;
SELECT * FROM score
WHERE snum IN(SELECT snum FROM student WHERE ssex='男')
AND cnum=(SELECT cnum FROM course WHERE cname='计算机导论');
CREATE TABLE grade
(
low INT(3),
upp INT(3),
grade CHAR(1)
);
INSERT INTO grade VALUES(90,100,'A');
INSERT INTO grade VALUES(80,90,'B');
INSERT INTO grade VALUES(70,80,'C');
INSERT INTO grade VALUES(60,70,'D');
SELECT snum,cnum,grade FROM score,grade WHERE
degree BETWEEN low AND upp;
内连接
INNER JOIN 或者 JOIN
外连接
CREATE TABLE person
(
id INT,
name VARCHAR(20),
cardid INT
);
card表:
id
name
CREATE TABLE card
(
id INT,
name VARCHAR(20)
);
插入数据:
INSERT INTO card VALUES (1, '饭卡'), (2, '建行卡'), (3, '农行卡'), (4, '工商卡'), (5, '邮政卡');
INSERT INTO person VALUES (1, '张三', 1), (2, '李四', 3), (3, '王五', 6);
SELECT * FROM person INNER JOIN card ON person.cardid=card.id;
SELECT * FROM person LEFT JOIN card ON person.cardid=card.id;
SELECT * FROM person LEFT JOIN card ON person.cardid=card.id
UNION
SELECT * FROM person RIGHT JOIN card ON person.cardid=card.id;
事务是一个最小的不可分割的工作单元,事务能够保证一个业务的完整性。
比如银行转账:必须一方转一方收
SET autocommit=0;
COMMIT;
总结:
事务开启:
1. 修改默认提交 SET autocommit=0;
2. BEGIN;
或者 START TRANSACTION;
事务手动提交:COMMIT;
事务手动回滚:ROLLBACK;
SELECT @@GLOBAL.TRANSACTION_ISOLATION;
SELECT @@TRANSACTION_ISOLATION;
SET global transaction isolation level read uncommited;