外键作用
外键作用
创建外键:
建表时指定外键约束
建表后修改
删除外键
删除外键,删除表
数据库数据管理
数据库意义:
数据储存
数据管理
管理书库数据方法:
通过SQLyog等管理工具管理数据库数据
通过DML语句管理数据库数据
DML语言
DML(数据操作语言)
用于操作数据库对象中包含的数据
包括:
INSERT(添加数据语句)
UPDATE(更新数据语句)
DELETE(删除数据语句)
MySQL的存储引擎
存储引擎的类型
MyISAM、InnoDB 、Memory、CSV等9种
MyISAM与InnoDB类型主要区别
//同样适用delete from清空数据后,重启数据库服务后,对于InnoDB的表,自增列从初
始值重新开始,而MyISAM类型的表,自增类型依然从上一个自增数据基础上开始
经验:
适用场合
使用MyISAM: 不需事务,空间小,以查询访问为主
使用InnoDB: 多删除、更新操作,安全性高,事务处理及并发控制
查看当前默认存储引擎
语法:
SHOW VARIABLES LIKE ‘storage_engine%’;
修改存储引擎
修改my.ini配置文件
设置表的存储引擎
语法:
CREATE TABLE 表名(
#省略代码
)ENGINE=存储引擎;
示例:
CREATE TABLE `myisam` (
id INT(4)
)ENGINE=MyISAM;
数据表的存储位置
MyISAM类型表文件
*.frm:表结构定义文件
*.MYD:数据文件
*.MYI:索引文件
InnoDB类型表文件
*.frm:表结构定义文件
ibdata1文件
注意:
存储位置
因操作系统而异,可查my.ini
datadir="C:/ProgramData/MySQL/MySQL Server 5.5/Data/"
innodb_data_home_dir="D:/MySQL Datafiles/"
DML语句——插入单条数据记录
语法:
INSERT INTO 表名 [(字段名列表)] VALUES (值列表);
注意:
字段名是可选的,如省略则依次插入所有字段
多个列表和多个值之间使用逗号分隔
值列表和字段名列表一一对应
如插入的是表中部分数据,字段名列表必填
示例:
INSERT INTO
`student`(`loginPwd`,`studentName`,`gradeId`,`phone`,`bornDate`)
VALUES('123','黄小平',1,'13956799999','1996-5-8');
DML语句——插入多条数据记录
语法:
INSERT INTO 新表(字段名列表)
VALUES(值列表1),(值列表2),……,(值列表n);
示例:
INSERT INTO `subject`(`subjectName`,`classHour`,`gradeID`)
VALUES('Logic Java',220,1),('HTML',160,1),('Java OOP',230,2);
经验:
为避免表结构发生变化引发的错误,建议插入数据时写明具体字段名!
//插入多条数据用,号隔开。插入多条数据是MYSQL独有的,其他数据库只能单条插入
DML语句——将查询结果插入新表
问题:编写SQL语句实现从学生表提取姓名、手机号两列数据存储到通讯录表中
示例:
CREATE TABLE `phoneList`(
SELECT `studentName`,`phone`
FROM `student`);
//如新表已存在,将会报错!
将查询结果插入新表
语法:
CREATE TABLE 新表(SELECT 字段1,字段2…… FROM 原表);
//如新表已存在,不能重复创建
示例:
编写SQL语句实现从学生表提取姓名、手机号两列数据存储到通讯录表中
CREATE TABLE `phoneList`(
SELECT `studentName`,`phone`
FROM `student`);
数据更新
更新数据记录
语法:
UPDATE 表名
SET 字段1=值1,字段2=值2,…,字段n=值n
[WHERE 条件];
示例:
UPDATE student SET sex = ‘女’;
UPDATE student SET address = ‘北京女子职业技术学校家政班’
WHERE address = ‘北京女子职业技术学校刺绣班’;
添加条件修改
UPDATE `result` SET studentResult=studentResult-5 WHERE studentResult>50;
数据删除
删除数据记录
语法:
DELETE FROM 表名 [WHERE条件];
TRUNCATE TABLE 表名;
//TRUNCATE语句删除后将重置自增列,表结构及其字段、约束、索引
保持不变,执行速度比DELETE语句快
示例:
DELETE FROM student WHERE studentName = ‘王宝宝’;
TRUNCATE TABLE student;
什么是查询;
查询机制简介
查询语法
语法:
SELECT <列名|表达式|函数|常量>
FROM <表名>
[WHERE <查询条件表达式>]
[ORDER BY <排序的列名>[ASC或DESC]];
示例:
SELECT `studentNo`,`studentName`,`phone`,`address`,`bornDate`
FROM `student`
WHERE `gradeId` = 1
ORDER BY `studentNo`;
//select语法顺序是固定的
逻辑操作符
比较操作符
// between and\ like \in \ null
// 全是模糊查询
示例:查询行李的同学学号和名字 #LIKE 结合使用的:%(0到任意个字符) _(一个字符)
SELECT studentno,studentresult FROM student WHERE studentname LIKE ‘李%’;
查询姓李的,但是名字只有一个字
SELECT studentno,studentresult FROM student WHERE studentname LIKE ‘李_’;
查询姓李的,但是名字有两个字
SELECT studentno,studentresult FROM student WHERE studentname LIKE ‘李__’;
查询名字里面带某个字,比如“文”
SELECT studentno,studentresult FROM student WHERE studentname LIKE ‘%文%’;
查询一个和两个字
SELECT studentno,studentresult FROM student WHERE studentname
LIKE ‘李_’ or ‘李__’;
两个查询连起来
SELECT studentno,studentresult FROM student WHERE studentname
LIKE ‘李_’;
UNION
SELECT studentno,studentresult FROM student WHERE studentname
LIKE ‘李__’;
#查询学员姓名中有“%”这个字的同学学号,姓名,转义符
SELECT s.studentNo,s.studentName FROM student s
WHERE s.studentName LIKE '%\%%';
SELECT s.studentNo,s.studentName FROM student s
WHERE s.studentName LIKE '%\_%';
#转义符\ 能不能使用我自己的转移符呢?(:)
SELECT s.studentNo,s.studentName FROM student s
WHERE s.studentName LIKE '%:%%' ESCAPE ':';
#连接查询
满足条件的查询(where)
示例:考试成绩95-100
SELECT studentno,studentresult FROM result
WHERE studentresult>=95 OR studentresult<=100;
模糊的查询
SELECT studentno,studentresult FROM result WHERE studentresult
BETWEEN 95 AND 100;
精确的查询
SELECT studentno,studentresult FROM result WHERE studentno=1000;
或者写成 &&
SELECT studentno,studentresult FROM result -
WHERE studentresult>=95 && studentresult<=100;
除了1000号同学
SELECT studentno,studentresult FROM result WHERE studentno!=1000;
SELECT studentno,studentresult FROM result WHERE NOT studentno=1000;
数据查询基础
示例:查询全部的行和列
SELECT * FROM `student`;
查询部分列
SELECT `studentNo`,`studentName`,`address`
FROM `student`
WHERE `address`=‘河南新乡’;
数据查询-列别名
使用AS命名列
示例:
SELECT `studentNo` AS 学生编号,`studentName` AS 学生姓名,
`address `AS 学生地址
FROM `student`
WHERE `address` <> '河南新乡‘;
//SELECT concat(‘姓名:’,studentname) AS 新姓名 FROM student; 查询结果去个新名字
//SELECT DISTINCT studentno FROM result; 去除重复项(distinct,默认all)
//select查询中可以使用表达式
SELECT @@auto_increment_increment
SELECT VERSION();
SELECT 100*3-1 计算结果;
数据查询-空行、常量
示例:
SELECT `studentName` FROM `student` WHERE `email` IS NULL;
原来有数据,但数据被清除的列如何查询?
使用常量列
示例:
SELECT `studentName` AS 姓名,`address` AS 地址,
’北京信息中心’ AS 学校名称
FROM `student`;
常用函数——聚合函数
//count 返回的是一个数字
#查询参加2016年2月17日考试的所有学员的最高分、最低分、平均分。
SELECT MAX(studentResult) AS 最高分,MIN(studentResult) AS 最低分,AVG(studentResult) AS 平均分 FROM result WHERE examDate = '2016-2-17';
常用函数——字符串函数
常用函数——时间日期函数
#按出生年份分组统计学生人数,将各组中人数达到2人的年份和人数显示出来
SELECT YEAR(borndate) AS 出生年份,COUNT(studentNo) AS 人数 FROM student GROUP BY YEAR(borndate) HAVING 人数>=2;
now() //当前时间
Select addate(now(),-5) //当前之后5天的时间
Select year(now()) //当前的年
常用函数——数学函数
ORDER BY子句
ORDER BY子句实现按一定顺序显示查询结果
把成绩都降低10%后加5分,再查询及格成绩,并按照成绩从高到低排序
示例:
SELECT `studentNo` AS 学生编号,(studentResult*0.9+5 ) AS 综合成绩
FROM `result`
WHERE (`studentResult`*0.9+5) >=60
ORDER BY studentResult DESC;
LIMIT子句
MySQL查询语句中使用LIMIT子句限制结果集
语法:
SELECT <字段名列表>
FROM <表名或视图>
[WHERE <查询条件>]
[GROUP BY <分组的字段名>] //HAVING跟WHERE一样 但是HAVING只能跟GROUP BY后
[ORDER BY <排序的列名>[ASC 或 DESC]]
[LIMIT [位置偏移量,]行数];
例:
#查询2016年2月17日考试前5名的学员的学号和分数
SELECT studentNo,studentResult FROM result ORDER BY studentResult DESC LIMIT 5;
#将所有女学生按年龄从大到小排序,从第2条记录开始显示6名女学生的姓名、年龄、出生日期、手机号信息
SELECT studentname,phone,borndate,address FROM student WHERE sex = '女' ORDER BY borndate LIMIT 2,6;
查询所有年级编号为1的学员信息,按学号升序排序
示例:
//LIMIT .. ,4 前面可以不写 显示条数必写
//LIMIT 0,5 #第一个数字代表从哪条记录开始
//LIMIT 5,5 #查询第二页 LIMIT 10,5 #查询第三页