-- 创建数据库
CREATE DATABASE IF NOT EXISTS schooldb CHARSET utf8
-- 删除数据库
DROP DATABASE IF EXISTS schooldb
-- 数据库一旦创建,名字不能修改
-- 修改数据库字符集
ALTER DATABASE schooldb CHARSET utf8
-- 创建表
CREATE TABLE student(
number INT,
NAME VARCHAR(6),
gander CHAR(1),
birthday DATE,
phone VARCHAR(11),
height DECIMAL(3,2),
reg_time DATETIME
)
-- 创建表
CREATE TABLE student(
number INT,
NAME VARCHAR(6),
gander CHAR(1),
birthday DATE,
phone VARCHAR(11),
height DECIMAL(3,2),
reg_time DATETIME
)
-- 创建表
CREATE TABLE student(
number INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(6) NOT NULL,
gander CHAR(1),
birthday DATE,
phone VARCHAR(11) NOT NULL UNIQUE,
height DECIMAL(3,2) CHECK(height<3),
reg_time DATETIME
)
-- 创建表
CREATE TABLE student(
number INT,
NAME VARCHAR(6),
gander CHAR(1),
birthday DATE,
phone VARCHAR(11),
height DECIMAL(3,2),
reg_time DATETIME
)
删除表
-- 删除表
DROP TABLE student
INSERT INTO epmloyee SET NAME='王五',gender='男',age=25,money=3000
INSERT INTO epmloyee SET NAME='李明',gender='男',age=23,money=2500
INSERT INTO epmloyee SET NAME='王二小',gender='男',age=23,money=2356
INSERT INTO epmloyee SET NAME='陈发',gender='男',age=22,money=3600
INSERT INTO epmloyee SET NAME='小明',gender='男',age=21,money=3100
INSERT INTO epmloyee SET NAME='苏琦',gender='男',age=24,money=2800
INSERT INTO epmloyee SET NAME='王丽',gender='女',age=19,money=1800
INSERT INTO epmloyee SET NAME='李芳',gender='女',age=18,money=1900
修改数据
-- 修改表 添加一个新的一列
ALTER TABLE epmloyee ADD deptid INT
外键约束
-- 外键约束
ALTER TABLE jieyue ADD CONSTRAINT fk_jieyue_people_peopleid FOREIGN KEY(peopleid)REFERENCES people(id)
ALTER TABLE jieyue ADD CONSTRAINT fk_jieyue_book_bookid FOREIGN KEY(bookid)REFERENCES book(id)
ALTER TABLE jieyue ADD CONSTRAINT fk_jieyue_guanliyuan_guanliyuanid FOREIGN KEY(guanliyuanid)REFERENCES guanliyuan(id)
-- leghth(列名) 以字节为单位
SELECT LENGTH(NAME),gender FROM student
-- CHAR_LENGTH(列名) 以字符为单位
SELECT CHAR_LENGTH(NAME),gender FROM student
-- concat(str1,str2...)链接多个字符串 as 别名
SELECT CONCAT(NAME,':',CHAR_LENGTH(NAME))AS NAME,gender FROM student
-- upper()转为大写 lower()转为小写
SELECT UPPER(NAME),LOWER(NAME)FROM student
-- substring(字符串,开始位置,截取长度) 开始位置从1开始
SELECT SUBSTRING(NAME,1,2)FROM student
-- instr(字符串,指定的字符) 返回指定字符首次出现的位置 找不到返回0
SELECT INSTR(NAME,'o')FROM student
-- trim(字符串) 默认是去掉字符串前后的空格
SELECT TRIM(NAME),NAME FROM student
-- trim(指定的字符串 from 字符串) 可以去掉前后指定的子串
SELECT TRIM('a' FROM NAME),NAME FROM student
-- 左填充 右填充到指定长度
SELECT LPAD(NAME,5,'a'),RPAD(NAME,5,'b')FROM student
-- replace(列,'old','new') 替换
SELECT REPLACE(NAME,'o','O')FROM student
-- 日期函数
-- NOW(),年月日 时分秒 系统当前时间
-- CURDATE(),年月日
-- CURTIME() 时分秒
SELECT NOW(),CURDATE(),CURTIME()FROM student
-- year(日期) 将日期格式化为年
SELECT YEAR(birthday),MONTH(birthday)FROM student
-- STR_TO_DATE('2004-3-3','%Y-%m-%d')将字符串日期 格式化为 日期类型
SELECT STR_TO_DATE('2004-3-3','%Y-%m-%d')FROM student
-- DATE FORMAT (birthday,'%Y-%m') 将日期格式化为指定的字符串
SELECT DATE_FORMAT(birthday,'%Y-%m')FROM student
-- DATEDIFE(CURDATE(),birthday) 计算两个日期之间的相差的天数
SELECT DATEDIFF(CURDATE(),birthday)FROM student
-- 分组函数 聚合函数(查询多行,返回一行) 统计函数
SELECT SUM(height) FROM student -- 求和
SELECT AVG(height) FROM student -- 平均值
SELECT MAX(height) FROM student -- 最大值
SELECT MIN(height) FROM student -- 最小值
SELECT COUNT(*) FROM student -- 统计个数
-- 条件查询
-- select * from 表名 where 条件
-- and 并且
SELECT * FROM student WHERE gender = '男'AND height>1.80
-- or 多个条件只需要满足一个即可
SELECT * FROM student WHERE gender = '男'OR height>1.80
SELECT * FROM student WHERE gender != '男'
SELECT * FROM student WHERE gender <> '女'
-- like'库%' 模糊匹配
SELECT * FROM student WHERE NAME LIKE '库%'
SELECT * FROM student WHERE height>=1.65 AND height<=1.98
-- BETWEEN 1.65 AND 1.98 两者之间
SELECT * FROM student WHERE height BETWEEN 1.65 AND 1.98
-- in(值1,值2,值n) 在给定的值中
SELECT * FROM student WHERE height IN(1.78,1.88,1.98)
SELECT * FROM student WHERE height NOT IN(1.78,1.88,1.98)
-- 查询身高为null值的数据
SELECT * FROM student WHERE height IS NULL
SELECT * FROM student WHERE height IS NOT NULL
-- 排序 order by 列 asc(升序) desc(降序)
SELECT * FROM student WHERE number>0 ORDER BY number ASC
SELECT * FROM student WHERE number>0 ORDER BY number DESC
SELECT * FROM student WHERE number>0 ORDER BY height ASC
SELECT * FROM student WHERE number>0 ORDER BY reg_time DESC
-- 数量限制 实现分页查询 limit 开始位置,每次查询数量
SELECT * FROM student WHERE number>0 ORDER BY number ASC LIMIT 0,3
SELECT * FROM student WHERE number>0 ORDER BY number ASC LIMIT 3,3
SELECT * FROM student WHERE number>0 ORDER BY number ASC LIMIT 6,3
1.第一范式(确保每列保持原子性)
第一范式是最基本的范式。如果数据库表中的所有字段值都是不可分解的原子值,就 说明该数据库表满足了第一范式。
2. 第二范式就是要有主键,要求其他字段都依赖于主键。
没有主键就没有唯一性,没有唯一性在集合中就定位不到这行记录,所以要主键。 • 其他字段为什么要依赖于主键?因为不依赖于主键,就找不到他们。更重要的是,
其他字段组成的这行记录和主键表示的是同一个东西,而主键是唯一的,它们只需要依 赖于主键,也就成了唯一的
3.第三范式,确保每列都和主键列直接相关,而不是间接相关,要求一个数据库表中不包含 已在其它表中包含的非主关键字信息
SELECT s.num,s.name sname,m.name mname,
GROUP_CONCAT(c.name) cname
FROM student s LEFT JOIN major m ON s.majorid=m.id
LEFT JOIN stu_course sc ON sc.stunumber=s.num
LEFT JOIN course c ON c.id=sc.courseid
GROUP BY s.name,m.name,s.num
-- 标量子查询
SELECT * FROM student WHERE num=(SELECT MAX(num)FROM student)
-- 表子查询
SELECT *FROM (SELECT NAME,num,reg_time rt FROM student)a WHERE a.name='李明'
-- 列子查询
SELECT *FROM student WHERE NAME IN(SELECT NAME FROM student WHERE NAME IN('李明','刘一科'))
-- 3.查询出每个部门工资最高的员工信息
SELECT *FROM
(SELECT deptid,MAX(money) m FROM epmloyee GROUP BY deptid) a
INNER JOIN epmloyee e ON a.deptid=e.deptid AND a.m=e.money
-- 外键约束
ALTER TABLE student ADD CONSTRAINT fk_student_major_majorid FOREIGN KEY(majorid)REFERENCES major(id)
约束名规则:
例:FK_ForeignTable_PrimaryTable_On_ForeignColumn
1、当主表中没有对应的记录时,不能将记录添加到从表
2、不能更改主表中的值而导致从表中的记录孤立
3、从表存在与主表对应的记录,不能从主表中删除该行
4、删除主表前,先删从表
DROP TABLE stu
CREATE TABLE major(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20)
)
-- 修改表 为表添加一个列 一对多 多对一
ALTER TABLE student ADD majorid INT
-- 外键 在一个表中外键是用来与另一个表的主键关联的
-- 主键 不能为空 唯一 检查
-- 外键有两种情况:
-- 1.不加外键约束
-- 可以任意的对表数据进行操作,即使两个表中的数据对应不上也没有关系
-- 2.添加外键约束
-- 添加外键约束后,两张表操作时,不能导致外键列和主键列对应关系不成立
ALTER TABLE student ADD CONSTRAINT fk_student_major_majorid FOREIGN KEY(majorid)REFERENCES major(id)
-- 删除外键约束
ALTER TABLE student DROP FOREIGN KEY fk_student_major_majorid
-- 学生选课 一个学生至少选择两个课程
-- 课程信息表 多对多关系
CREATE TABLE course(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20)
)
-- 添加一个学生选课表 学生和课程关系表 放一个学生学号外键,放一个课程外键
CREATE TABLE student_course(
stunumber INT,
courseid INT
)
ALTER TABLE student_course ADD CONSTRAINT fk_student_course_stunumber FOREIGN KEY(stunumber)REFERENCES student(number)
ALTER TABLE student_course ADD CONSTRAINT fk_student_course_courseid FOREIGN KEY(courseid)REFERENCES course(id)