本文是课上资料的总结非原创没有转载地址
1 数据库(database):存储数据的仓库。
2 数据库管理系统(DBMS DataBase Manager System): MySQL Oracle SQL Server DB2
3 MySQL安装、卸载
4 SQL语句:
DDL 数据定义语言 创建库,创建表 create database create table
DML 数据操纵语言 添加 删除 更新 insert delete udpate
DQL 数据查询语言 select
DCL 数据控制语言, 用户的创建 权限分配。
5 DQL
简单查询 select * from emp;
条件查询 where 运算符 = != <> > >= < <= in between and and or not + - * / %
模糊查询 like 通配符 _表示一个字符 %表示任意多个字符
字段控制 distinct 去重 合并 别名
排序 order by
聚合函数 count sum max min avg
分组查询 group by having
limit 限制查询
书写顺序select 列表 from 表 【where--->group by--->having--->order by--->limit】
执行顺序 from 表 where--->group by--->having-->select--->order by--->limit
CREATE TABLE student(
id INT PRIMARY KEY,
name VARCHAR(50)
);
CREATE TABLE student(
id INT,
name VARCHAR(50),
PRIMARY KEY(id)
);
CREATE TABLE student(
classid INT,
stuid INT,
name VARCHAR(50),
PRIMARY KEY(classid,stuid)
);
CREATE TABLE student(
id INT,
name VARCHAR(50)
);
ALTER TABLE student ADD PRIMARY KEY (id);
CREATE TABLE student(
id int primary key,
name varchar(50) unique
);
CREATE TABLE student(
id int primary key auto_increment,
name varchar(50)
) auto_increment=100;
INSERT INTO student(name) values(‘tom’);
类型 | 大小 | 范围(有符号) | 范围(无符号) | 用途 |
---|---|---|---|---|
TINYINT | 1字节 | (-128,127) | (0,255) | 小整数值 |
SMALLINT | 2字节 | (-32768,32767) | (0,65535) | 大整数值 |
MEDIUMINT | 3字节 | (-8388608,8388607) | (0,16777215) | 大整数值 |
INT或INTEGER | 4字节 | (-2147483648,2147483647) | (0,4294967295) | 大整数值 |
BIGINT | 8字节 | (-9233372036854775808,9223372036854775807) | (0,18446744073709551615) | 极大整数值 |
FLOAT | 4字节 | 查看帮助文档 | 查看帮助文档 | 单精度浮点数值 |
DOUBLE | 8字节 | 查看帮助文档 | 查看帮助文档 | 双精度浮点数值 |
DOUBLE(M,D) | 8个字节,M表示长度,D表示小数位数 | 同上,受M和D的约束DUBLE(5,2)-999.99-999.99 | 同上,受M和D的约束 | 双精度浮点数值 |
DECIMAL(M,D) | 对DECIMAL(M,D),如果M>D,为M+2否则为D+2 | 依赖于M和D的值,M最大值为65 | 依赖于M和D的值,M最大值为65 | 小数值 |
类型 | 大小(字节) | 范围 | 格式 | 用途 |
---|---|---|---|---|
DATE | 3 | 1000-01-01/9999-12-31 | YYYY-MM-DD | 日期值 |
TIME | 3 | ‘-838:59:59’/‘838:59:59’ | HH:MM:SS | 时间值或持续时间 |
YEAR | 1 | 1901/2155 | YYYY | 年份值 |
DATETIME | 8 | 1000-01-01 00:00:00/9999-12-31 23:59:59 | YYYY-MM-DD HH:MM:SS | 混合日期和时间值 |
TIMESTAMP | 4 | 1970-01-0100:00:00/2038结束时间是第2147483647秒,北京时间2038-1-19 11:14:07,格林尼治时间2038年1月19日凌晨03:14:07 | YYYYMMDD HHMMSS | 混合日期和时间值,时间戳 |
类型 | 大小 | 用途 |
---|---|---|
CHAR | 0-255字符 | 定长字符串 char(10) 10个字符 |
VARCHAR | 0-65535字符 | 变长字符串 varchar(10) 10个字符 |
TINYBLOB | 0-255字节 | 不超过 255 个字符的二进制字符串 |
TINYTEXT | 0-255字节 | 短文本字符串 |
BLOB(binary large object) | 0-65 535字节 | 二进制形式数据 |
TEXT | 0-65 535字节 | 长文本数据 |
MEDIUMBLOB | 0-16 777 215字节 | 二进制形式的中等长度数据 |
MEDIUMTEXT | 0-16 777 215字节 | 中等长度文本数据 |
LONGBLOB | 0-4 294 967 295字节 | 二进制形式的极大数据 |
LONGTEXT | 0-4 294 967 295字节 | 极大文本数据 |
CREATE TABLE student(
Id int primary key,
Name varchar(50) not null,
Sex varchar(10)
);
INSERT INTO student values(1,’tom’,null);
CREATE TABLE student(
Id int primary key,
Name varchar(50) not null,
Sex varchar(10) default '男'
);
insert intostudent1 values(1,'tom','女');
insert intostudent1 values(2,'jerry',default);
FOREIGN KEY
# 学生表(主表)
CREATE TABLE student(
sid INT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
sex VARCHAR(10) DEFAULT '男'
);
成绩表(从表)
# 成绩表(从表)
CREATE TABLE score(
id INT,
score INT,
sid INT,
CONSTRAINT [fk_score_sid] FOREIGN KEY(sid) REFERENCES student(sid)
)
-- 外键列的数据类型一定要与主键的类型一致
注意:fk_score_sid是外键名;
外键名:为定义的外键约束的名称,一个表中不能有相同名称的外键;字段名表示子表需要添加外健约束的字段列;主表名即被子表外键所依赖的表的名称;主键列表示主表中定义的主键列或者列组合。
ALTER TABLE score ADD CONSTRAINT fk_stu_score FOREIGN KEY(sid) REFERENCES student(sid);
注意:其中fk_stu_score是索引名
多表查询有如下几种:
关键字 | 描述 |
---|---|
UNION | 去除重复记录 例如: SELECT * FROM table1 UNION SELECT * FROM table2; |
UNION ALL | 不去除重复记录 例如: SELECT * FROM table1 UNION ALL SELECT * FROM table2; |
SELECT * FROM t1 UNION SELECT * FROM t2;
SELECT * FROM t1 UNION ALL SELECT * FROM t2;
SELECT * FROM t1,t2;
CREATE TABLE emp(
empno int,
ename varchar(50),
job varchar(50),
mgr int,
hiredate date,
sal decimal(7,2),
comm decimal(7,2),
deptno int
);
#添加数据SQL语句省略
dept表
CREATE TABLE dept(
deptno int,
dname varchar(14),
loc varchar(13)
);
#添加数据SQL语句省略
select * from emp,dept;
SELECT * FROM emp,dept WHERE emp.deptno=dept.deptno;
上面查询结果会把两张表的所有列都查询出来,也许你不需要那么多列,这时就可以指定要查询的列了。
SELECT emp.ename,emp.sal,emp.comm,dept.dname
FROM emp,dept
WHERE emp.deptno=dept.deptno;
SELECT *
FROM emp e
INNER JOIN dept d
ON e.deptno=d.deptno;
# 注意:on后面 主外键关系
注意:# 注意:on后面 主外键关系
SELECT * FROM emp e
LEFT OUTER JOIN dept d
ON e.deptno=d.deptno;
SELECT * FROM emp e
RIGHT OUTER JOIN dept d
ON e.deptno=d.deptno;
连接不限于两张表,连接查询也可以是三张、四张,甚至N张表的连接查询。通常连接查询不可能需要整个笛卡尔积,而只是需要其中一部分,那么这时就需要使用条件来去除不需要的记录。这个条件大多数情况下都是使用主外键关系去除。
# 第一步:查询JONES的工资
SELECT sal FROM emp WHERE ename='JONES';
# 第二步:查询高于JONES工资的员工
SELECT * FROM emp WHERE sal > (第一步结果);
# 结果:
SELECT * FROM emp WHERE sal > (SELECT sal FROM emp WHERE ename='JONES');
# 第一步:查询SCOTT的部门编号
SELECT deptno FROM emp WHERE ename='SCOTT';
# 第二步:查询部门编号等于SCOTT的部门编号的员工
SELECT * FROM emp WHERE deptno = (SELECT deptno FROM emp WHERE ename='SCOTT');
SELECT * FROMemp WHERE sal>(SELECT MAX(sal)FROM emp WHERE deptno=30);
# 第一步:查询30部门所有人工资
SELECT sal FROM emp WHERE deptno=30;
# 第二步:查询高于30部门所有人工资的员工信息
SELECT * FROM emp WHERE sal > ALL (第一步)
# 结果:
SELECT * FROM emp WHERE sal > ALL (SELECT sal FROM emp WHERE deptno=30)
SELECT ename,job,hiredate FROM (SELECT ename,job,hiredate FROM emp WHERE hiredate>'1987-1-1') AS temp;
导出数据库表
mysqldump -uroot -p 数据库名 > school.sql
导入数据库表
mysql -u root -p
mysql>use 数据库
然后使用source命令,后面参数为脚本文件(如这里用到的.sql)
mysql>source d:/dbname.sql
1 先备份,右击数据库选择备份---> 备份数据库,转储到sql
2 导入,右击选择 "执行SQL脚本"
CREATE USER `zhangsan` IDENTIFIED BY '123';
CREATE USER `zhangsan`@`localhost` IDENTIFIED BY '123';
CREATE USER `zhangsan`@`%` IDENTIFIED BY '123';
GRANT ALL ON school.* TO `zhangsan`;
REVOKE ALL ON school.* FROM `zhangsan`;
DROP USER `zhangsan`;
某网站商城数据库表结构如下:
# 创建用户表
create table user(
userId int primary key auto_increment,
username varchar(20) not null,
password varchar(18) not null,
address varchar(100),
phone varchar(11)
);
#一对多的实现
#创建分类表
create table category(
cid varchar(32) PRIMARY KEY ,
cname varchar(100) not null #分类名称
);
# 商品表
CREATE TABLE `products` (
`pid` varchar(32) PRIMARY KEY,
`name` VARCHAR(40) ,
`price` DOUBLE(7,2),
category_id varchar(32),
constraint foreign key(category_id) references category(cid)
);
#多对多的实现
#订单表
create table `orders`(
`oid` varchar(32) PRIMARY KEY ,
`totalprice` double(12,2), #总计
`userId` int,
constraint foreign key(userId) references user(userId) #外键
);
# 订单项表
create table orderitem(
oid varchar(32), #订单id
pid varchar(32), #商品id
num int , #购买商品数量
primary key(oid,pid), #主键
foreign key(oid) references orders(oid),
foreign key(pid) references products(pid)
);
#初始化数据
#用户表添加数据
INSERT INTO USER(username,PASSWORD,address,phone) VALUES('张三','123','北京昌平沙河','13812345678');
INSERT INTO USER(username,PASSWORD,address,phone) VALUES('王五','5678','北京海淀','13812345141');
INSERT INTO USER(username,PASSWORD,address,phone) VALUES('赵六','123','北京朝阳','13812340987');
INSERT INTO USER(username,PASSWORD,address,phone) VALUES('田七','123','北京大兴','13812345687');
#给分类表初始化数据
insert into category values('c001','电器');
insert into category values('c002','服饰');
insert into category values('c003','化妆品');
insert into category values('c004','书籍');
#给商品表初始化数据
insert into products(pid,name,price,category_id) values('p001','联想',5000,'c001');
insert into products(pid,name,price,category_id) values('p002','海尔',3000,'c001');
insert into products(pid,name,price,category_id) values('p003','雷神',5000,'c001');
insert into products(pid,name,price,category_id) values('p004','JACK JONES',800,'c002');
insert into products(pid,name,price,category_id) values('p005','真维斯',200,'c002');
insert into products(pid,name,price,category_id) values('p006','花花公子',440,'c002');
insert into products(pid,name,price,category_id) values('p007','劲霸',2000,'c002');
insert into products(pid,name,price,category_id) values('p008','香奈儿',800,'c003');
insert into products(pid,name,price,category_id) values('p009','相宜本草',200,'c003');
insert into products(pid,name,price,category_id) values('p010','梅明子',200,null);
#添加订单
insert into orders values('o6100',18000.50,1);
insert into orders values('o6101',7200.35,1);
insert into orders values('o6102',600.00,2);
insert into orders values('o6103',1300.26,4);
#订单详情表
insert into orderitem values('o6100','p001',1),('o6100','p002',1),('o6101','p003',1);
# 查询所有用户的订单。
SELECT o.oid,o.totalprice, u.userId,u.username,u.phone FROM orders o INNER JOIN user u ON o.userId=u.userId;
# 查询用户id为1的所有订单详情。
SELECT o.oid,o.totalprice, u.userId,u.username,u.phone ,oi.pid
FROM orders o INNER JOIN user u ON o.userId=u.userId
INNER JOIN orderitem oi ON o.oid=oi.oid
WHERE u.userId=1;
# 查看用户为张三的订单。
SELECT * FROM orders WHERE userId=(SELECT userId FROM user WHERE username='张三');
# 查询出订单的价格大于800的所有用户信息。
SELECT * FROM user WHERE userId IN (
SELECT DISTINCT userId FROM orders WHERE totalprice>800
);
# 查询所有订单信息,每页显示5条数据。
SELECT * FROM orders LIMIT 0,5;
函数声明 | 功能描述 |
---|---|
LENGTH (string ) | string长度,字节的长度 |
CONCAT (string2 [,… ]) | 连接字串 |
INSTR (string ,substring ) | 返回substring首次在string中出现的位置,不存在返回0 |
LCASE (string2 ) | 转换成小写 |
UCASE (string2 ) | 转换成大写 |
LPAD (string ,length ,pad ) | 重复用pad加在string开头,直到字串长度为length |
RPAD (string ,length ,pad) | 在str后用pad补充,直到长度为length |
LTRIM (string ) | 去除前端空格 |
RTRIM (string ) | 去除后端空格 |
STRCMP (string1 ,string2) | 逐字符比较两字串大小, |
SUBSTRING (str , position [,length ]) | 从str的position开始,取length个字符 |
函数声明 | 功能描述 |
---|---|
ABS (number2 ) | 绝对值 |
BIN (decimal_number) | 十进制转二进制 |
CEILING (number2 ) | 向上取整 |
FLOOR (number2 ) | 向下取整 |
FORMAT (number,decimal_places ) | 保留小数位数 |
HEX (DecimalNumber) | 转十六进制 |
POWER (number ,power ) | 求指数 |
RAND([seed]) | 随机数 |
ROUND (number [,decimals ]) | 四舍五入,decimals为小数位数] 注:返回类型并非均为整数 |
函数声明 | 功能描述 |
---|---|
NOW() |
当前时间 |
CURRENT_DATE ( ) | 当前日期 |
CURRENT_TIME ( ) | 当前时间 |
CURRENT_TIMESTAMP ( ) | 当前时间戳和now()语义相同 |
ADDDATE(‘2019-04-15’,2) | 加2天 |
DATEDIFF (date1 ,date2 ) |
两个日期差天数 |
TIMEDIFF (datetime1 ,datetime2 ) |
两个时间差 |
TIME_TO_SEC(time) | 时间转秒数 |
YEAR (datetime ) | 年份 |
DAY (date ) | 返回日期的天 |
HOUR(datetime) | 小时 |
DAYOFWEEK (date ) | 星期(1-7) ,1为星期天 |
#创建表 account
create table account(id int,name varchar(20),money double(10,2));
#事务操作
begin;
insert into account(id,name,money) values(1,'李晨',20000);
insert into account(id,name,money) values(1,'李晨',20000);
#提交事务
commit;
#查询数据
select * from account;
begin;
insert into account(id,name,money) values(1,'大郎',50000);
insert into account(id,name,money) values(1,'金莲',50000);
#提交事务
rollback;
#再次查询数据
select * from account;
数据库结构
创建四张表 分别存储 学生信息 课程信息 分数 讲师信息表 存储相应数据
学生信息表 Student
字段名 字段类型 字段约束 含义
Sno varchar(3) Not null 学员编号
Sname varchar(4) Not null 学员姓名
Ssex varchar(2) Not null 性别
Sbirthday Datetime 生日
Classnum varchar(5) 班级号
CREATE TABLE student
(
SNO varchar(3) NOT NULL,
SNAME varchar(4) NOT NULL,
SSEX varchar(2) NOT NULL,
SBIRTHDAY DATETIME,
CLASS varchar(5)
);
课程信息表 course
字段名 字段类型 字段约束 含义
Cno varchar(5) Not null 课程编号
Cname varchar(10) Not null 课程名称
Tno varchar(10) Not null 授课老师编号
CREATE TABLE course
(
CNO VARCHAR(5) NOT NULL,
CNAME VARCHAR(10) NOT NULL,
TNO VARCHAR(10) NOT NULL
);
成绩表score
字段名 字段类型 字段约束 含义
Sno Varchar(3) Not null 学员编号
Cno Varchar(5) Not null 课程编号
Degree Double(3,1) Not null 分数
CREATE TABLE score
(
SNO varchar(3) NOT NULL,
CNO varchar(5) NOT NULL,
DEGREE Double(3,1) NOT NULL
);
讲师表teacher
字段名 字段类型 字段约束 含义
Tno varchar(3) Not null 讲师编号
Tname varchar(4) Not null 讲师姓名
Tsex varchar(2) Not null 讲师性别
Tbirthday Datetime Not null 出生日期
Prof varchar(6) 等级
Depart varchar(10) 所属院系
CREATE TABLE teacher
(
TNO varchar(3) NOT NULL,
TNAME varchar(4) NOT NULL,
TSEX varchar(2) NOT NULL,
TBIRTHDAY DATETIME NOT NULL,
PROF varchar(6),
DEPART varchar(10) NOT NULL
);
向表中存储数据
INSERT INTO student (SNO,SNAME,SSEX,SBIRTHDAY,CLASS) VALUES (108 ,'曾华' ,'男' ,1977-09-01,95033);
INSERT INTO student (SNO,SNAME,SSEX,SBIRTHDAY,CLASS) VALUES (105 ,'匡明' ,'男' ,1975-10-02,95031);
INSERT INTO student (SNO,SNAME,SSEX,SBIRTHDAY,CLASS) VALUES (107 ,'王丽' ,'女' ,1976-01-23,95033);
INSERT INTO student (SNO,SNAME,SSEX,SBIRTHDAY,CLASS) VALUES (101 ,'李军' ,'男' ,1976-02-20,95033);
INSERT INTO student (SNO,SNAME,SSEX,SBIRTHDAY,CLASS) VALUES (109 ,'王芳' ,'女' ,1975-02-10,95031);
INSERT INTO student (SNO,SNAME,SSEX,SBIRTHDAY,CLASS) VALUES (103 ,'陆君' ,'男' ,1974-06-03,95031);
INSERT INTO course(CNO,CNAME,TNO)VALUES ('3-105' ,'计算机导论',825)
INSERT INTO course(CNO,CNAME,TNO)VALUES ('3-245' ,'操作系统' ,804);
INSERT INTO course(CNO,CNAME,TNO)VALUES ('6-166' ,'数据电路' ,856);
INSERT INTO course(CNO,CNAME,TNO)VALUES ('9-888' ,'高等数学' ,100);
INSERT INTO score(SNO,CNO,DEGREE)VALUES (103,'3-245',86);
INSERT INTO score(SNO,CNO,DEGREE)VALUES (105,'3-245',75);
INSERT INTO score(SNO,CNO,DEGREE)VALUES (109,'3-245',68);
INSERT INTO score(SNO,CNO,DEGREE)VALUES (103,'3-105',92);
INSERT INTO score(SNO,CNO,DEGREE)VALUES (105,'3-105',88);
INSERT INTO score(SNO,CNO,DEGREE)VALUES (109,'3-105',76);
INSERT INTO score(SNO,CNO,DEGREE)VALUES (101,'3-105',64);
INSERT INTO score(SNO,CNO,DEGREE)VALUES (107,'3-105',91);
INSERT INTO score(SNO,CNO,DEGREE)VALUES (108,'3-105',78);
INSERT INTO score(SNO,CNO,DEGREE)VALUES (101,'6-166',85);
INSERT INTO score(SNO,CNO,DEGREE)VALUES (107,'6-106',79);
INSERT INTO score(SNO,CNO,DEGREE)VALUES (108,'6-166',81);
INSERT INTO teacher(TNO,TNAME,TSEX,TBIRTHDAY,PROF,DEPART)
VALUES (804,'李诚','男','1958-12-02','副教授','计算机系');
INSERT INTO teacher(TNO,TNAME,TSEX,TBIRTHDAY,PROF,DEPART)
VALUES (856,'张旭','男','1969-03-12','讲师','电子工程系');
INSERT INTO teacher(TNO,TNAME,TSEX,TBIRTHDAY,PROF,DEPART)
VALUES (825,'王萍','女','1972-05-05','助教','计算机系');
INSERT INTO teacher(TNO,TNAME,TSEX,TBIRTHDAY,PROF,DEPART)
VALUES (831,'刘冰','女','1977-08-14','助教','电子工程系');
1、 查询Student表中的所有记录的Sname、Ssex和Class列。
2、 查询教师所有的单位即不重复的Depart列。
3、 查询Student表的所有记录。
4、 查询Score表中成绩在60到80之间的所有记录。
5、 查询Score表中成绩为85,86或88的记录。
6、 查询Student表中“95031”班或性别为“女”的同学记录。
7、 以Class降序查询Student表的所有记录。
8、 以Cno升序、Degree降序查询Score表的所有记录。
9、 查询“95031”班的学生人数。
10、查询Score表中的最高分的学生学号和课程号。
11、查询‘3-105’号课程的平均分。
12、查询Score表中至少有5名学生选修的并以3开头的课程的平均分数。
13、查询最低分大于70,最高分小于90的Sno列。
14、查询所有学生的Sname、Cno和Degree列。
15、查询所有学生的Sno、Cname和Degree列。
有三张表,学生表S,课程C,学生课程表SC,学生可以选修多门课程,一门课程可以被多个学生选修,通过SC 表关联。
1)写出建表语句;
2)写出SQL 语句,查询选修了所有选修课程的学生;
3)写出SQL 语句,查询选修了至少5 门以上的课程的学生。
注脚的解释 ↩︎