一,什么是MySQL,市面上常见的数据库有哪些?
MySQL是目前最受欢迎开源的SQL数据库管理系统,数据库是长期存放在计算机内,有组织,可共享的大量数据的集合,是一个数据”仓库”
作用 : 保存,并能安全管理数据(如:增删改查等),减少冗余…
1、MySQL是开源免费的。
2、MySQL服务器是可靠的、易于使用的、快速的。
3、MySQL服务器工作在客户/服务器或嵌入系统中。
4、MySQL软件很多。
5、MySQL是一个关系数据库管理系统。
常见的数据库有mysql 、SQL Server、Oracle、Sybase、DB2等
二,如何创建一个数据库?
用管理员权限打开cmd,输入net start mysql 打开MySQL,然后打开SQLyog在询问里输入CREATE DATABASE [IF NOT EXISTS] 数据库名;创建表 CREATE TABLE [IF NOT EXISTS] `表名`(`字段名1` 列类型 [属性][索引][注释] )[表类型][表字符集][注释};
三,对数据库进行增删改查
1. 增 :INSERT INTO 表名[(字段1,字段2,字段3….)]
VALUES(`值1`,`值2`,`值3`)
字段或值之间用英文逗号隔开.
‘字段1,字段2…’该部分可省略 , 但添加的值务必与表结构,数据列,顺序相对应,且数量一致.
可同时插入多条数据 , values 后用英文逗号隔开.
2. 删:DELETE FROM 表名[WHERE condition];
注意:condition为筛选条件,如不指定则删除该表的所有列数据
TRUNCATE命令 TRUNCATE [TABLE] table_name;
用于完全清空表数据,但表结构,索引,约束等不变;
相同:都能删除数据,不删除表结构,但TRUNCATE速度更快
不同:使用TRUNCATE TABLE重新设置 AUTO_INCREMENT计数器 使用TRUNCATE TABLE不会对事务有影响
3.改:UPDATE(修改数据)
#语法:UPDATE 表名 SET column_name=value [,column_name2=value2,…] [WHERE condition];
#注意:column_name 为要改的数据列
value为修改后的数据
condition为筛选 条件,如果不指定的话,则修改该表的所有列是数据
where条件子句可以理解为,有条件的从表中筛选数据
4.查
4.1 SELECT语句(数据查询语言)
在数据库管理中使用最频繁最高的语句,也是数据库语言中最核心,最重要的语句
SELECT [ALL | DISTINCT]#distinct去除重复项,默认为all
[left | right | inner join table_name2] #连接查询
[WHERE …] #指定结果满足的条件
[GROUP BY …] #指定结果按照哪几个字段来分组
[HAVING] #过滤分组的记录必须满足的次要条件
[ORDER BY …] #指定查询记录按一个或多个条件排序
[LIMIT {[offset,]row_count | row_countOFFSET offset}];# 指定查询的记录从哪条至哪条
查询表中所有的数据列结果,采用“*”符号,比如
select*from student
但是这样效率低,不推荐使用
#查询所有的学生信息
select * from student
#查询指定列(学号,姓名)
select studentno,studentname from student;
4.2 as字句作用
可给数据列取一个新名字
可给表取一个新名字
可把经计算或总结的结果用一个新名称来代替
#这里是为列取别名(当然as关键字可以省略)
select studentno as 学号,studentname as 姓名 from student;
#使用as也可以为表取名
select studentno as 学号,studnetname as 姓名 from student as s;
#使用as,为查询结果取一个新名字
#cancat()函数拼接字符串
select concat(‘姓名:’,studentname) as 新姓名 from student;
4.3 distinctg关键字的使用
作用去掉select查询返回的记录结果中重复的记录(返回所有列的值都相同),只返回一条
#查看哪些同学参加了考试(学号)—去除重复项
select * from result;#查看考试成绩
select studentno from result;#查看哪些同学参加了考试
select distinct studentno from result;
#distinct去除重复项,默认是all
select version();#查询版本号
select 100*3-1 as 计算结果;#计算表达式
#学员考试成绩集体提分一分查看
select studentno,studentresult+1 as ‘提分后’ from result;
避免sql返回结果中包含 ’.’ ‘,’ ‘*’ 和括号等干扰开发程序语言
4.4 where条件语句
用于检索数据表中符合条件的记录
例如
#满足条件的查询(where)
select studentno,studentresult from result;
#查询考试成绩在95~100之间的
select studentno,studentresult
from result
where studentresult>=95 and studentresult<=100;
#其中and也可以写成&&select studentno,studentresult
from result
where studentresult>=95 && studentresult<=100;
#还可以这样表示
select studentno,studentresult
from result
where studentresult between95 and 100;
#除了1000号同学,要其他同学的成绩
select studentno,studentresult
from result
where studentno!=1000;
#使用 not
select studentno,studentresult
from result
where not studentno=1000;
4.5 模糊查询
比较操作符
操作符名称
语法
描述
is null
a is null
若操作符为null,则结果为真
is not null
a is not null
若操作符不为null,则结果为真
between
a between b and c
若a在b与c之间,则结果为真
like
a like b
m模式匹配,若a匹配b,则结果为真
in
a in (a1,a2,a3…)
若a等于a1,a2,a3中的某一个,则结果为真
相同数据类型的数据之间才能进比较
#模糊查询 like , in , null, between and
# LIKE
#like结合使用的通配符 :%(代表0到任意个字符) ; _ 代表一个字符
#查询姓李的同学的学号及姓名
SELECT studentno,studentname FROM student
WHERE studentname LIKE’李%’;
#查询姓李的同学,后面只有一个字的
SELECT studentno,studentname FROM student
WHERE studentname LIKE’李_’;
#查询姓李的同学,后面只有两个字的
SELECT studentno,studentname FROM student
WHERE studentname LIKE’李__’;
#查询姓名中含有 文 字的
SELECT studentno,studentname FROM student
WHERE studentname LIKE’%文%’;
#查询姓名中含有特殊字符的需要使用转义符号’\’
#自定义转义符关键字: ESCAPE ‘:’#=============================================# IN
#查询学号为1000,1001,1002的学生姓名
SELECT studentno,studentname FROM student
WHERE studentno IN (1000,1001,1002);
#查询地址在北京,南京,河南洛阳的学生
SELECT studentno,studentname,address FROM student
WHERE address IN (‘北京’,’南京’,’河南洛阳’);
#=============================================# NULL 空
#查询出生日期没有填写的同学
#不能直接写=NULL , 这是代表错误的 , 用 is nullSELECT studentname FROM student
WHERE BornDate IS NULL;
#查询出生日期填写的同学
SELECT studentname FROM student
WHERE BornDate IS NOT NULL;
#查询没有写家庭住址的同学(空字符串不等于null)
SELECT studentname FROM student
WHERE Address=” OR Address IS NULL;
4.6 连接查询
三种连接查询对比
名称
描述
INNER JOIN
查询两个表中的结果集中的交集,如果表中有至少一个匹配,则返回行
LEFT JOIN
以左表为基准,右边表来一一匹配,匹配不上的,返回左表的记录,右表以null填充,即使右表中没有匹配,也从左表中返回所有的行
RIGHT JOIN
以右表为基准,左边表来一一匹配,匹配不上的,返回右表的记录,左表以null填充,即使左表中没有匹配,也从右表中返回所有的行
#查询参加了考试的同学信息(学号,学生姓名,科目编号,分数)
SELECT*FROM student;
SELECT*FROM result;/*思路:
(1):分析需求,确定查询的列来源于两个类,student result,连接查询
(2):确定使用哪种连接查询?(内连接)*/#内连接
SELECT s.studentno,studentname,subjectno,StudentResult
FROM student s
INNER JOIN result r
ON r.studentno=s.studentno
# 右连接(也可实现)
SELECT s.studentno,studentname,subjectno,StudentResult
FROM student s
RIGHT JOIN result r
ON r.studentno=s.studentno
# 等值连接
SELECT s.studentno,studentname,subjectno,StudentResult
FROM student s , result r
WHERE r.studentno=s.studentno
# 左连接 (查询了所有同学,不考试的也会查出来)
SELECT s.studentno,studentname,subjectno,StudentResult
FROM student s
LEFT JOIN result r
ON r.studentno=s.studentno
#查一下缺考的同学(左连接应用场景)
SELECT s.studentno,studentname,subjectno,StudentResult
FROM student s
LEFT JOIN result r
ON r.studentno=s.studentno
WHERE StudentResult IS NULL
#思考题:查询参加了考试的同学信息(学号,学生姓名,科目名,分数)
SELECT s.studentno,studentname,subjectname,StudentResult
FROM student s
INNER JOIN result r
ON r.studentno=s.studentno
INNER JOIN `subject` sub
ON sub.subjectno= r.subjectno
4.7 排序(ORDER BY)
解释:order by 语句用于根据指定的列对结果集进行排序,默认按照asc升序记录进行排序,desc进行降序排序
#查询:学习数据库结构的同学的所有考试结果(学号,学生姓名,科目名称,成绩)
#按成绩降序排序
SELECT s.studentno,studentname,subjectname,StudentResult
FROM student s
INNER JOIN result r
ON r.studentno=s.studentno
INNER JOIN `subject` sub
ON r.subjectno=sub.subjectno
WHERE subjectname=’数据库结构-1’ORDER BY StudentResult DESC , studentno
4.8 分页
# 每页显示5条数据
SELECT s.studentno,studentname,subjectname,StudentResult
FROM student s
INNER JOIN result r
ON r.studentno=s.studentno
INNER JOIN `subject` sub
ON r.subjectno=sub.subjectno
WHERE subjectname=’数据库结构-1’ORDER BY StudentResult DESC , studentno
LIMIT0,5
4.9 子查询
嵌套查询可以由多个子查询组成,求解的过程是最里面的优先查询,一次向外。
#查询课程为 高等数学-2且分数不小于80分的学生的学号和姓名
#方法一:使用连接查询
SELECT s.studentno,studentname
FROM student s
INNER JOIN result r
ON s.`StudentNo`=r.`StudentNo`
INNER JOIN `subject` sub
ON sub.`SubjectNo`=r.`SubjectNo`
WHERE subjectname= ‘高等数学-2’ AND StudentResult>=80#方法二:使用连接查询+子查询
#分数不小于80分的学生的学号和姓名
SELECT r.studentno,studentname FROM student s
INNER JOIN result r ON s.`StudentNo`=r.`StudentNo`
WHERE StudentResult>=80#在上面SQL基础上,添加需求:课程为 高等数学-2SELECT r.studentno,studentname FROM student s
INNER JOIN result r ON s.`StudentNo`=r.`StudentNo`
WHERE StudentResult>=80 AND subjectno=(
SELECT subjectno FROM `subject`
WHERE subjectname= ‘高等数学-2’)
#方法三:使用子查询
#分步写简单sql语句,然后将其嵌套起来
SELECT studentno,studentname FROM student WHERE studentno IN(
SELECT studentno FROM result WHERE StudentResult>=80 AND subjectno=(
SELECT subjectno FROM `subject` WHERE subjectname= ‘高等数学-2’)
)
五:MySQL常用函数
# 数学函数 (这里只列出一些常用的)
SELECT ABS(-8); /*绝对值*/SELECT CEILING(9.4); /*向上取整*/SELECT FLOOR(9.4); /*向下取整*/SELECT RAND();/*随机数,返回一个0-1之间的随机数*/SELECT SIGN(0); /*符号函数: 负数返回-1,正数返回1,0返回0*/#字符串函数
SELECT CHAR_LENGTH(‘狂神说坚持就能成功’); /*返回字符串包含的字符数*/SELECT CONCAT(‘我’,’爱’,’程序’); /*合并字符串,参数可以有多个*/SELECT INSERT(‘我爱编程helloworld’,1,2,’超级热爱’); /*替换字符串,从某个位置开始替换某个长度*/SELECT LOWER(‘KuangShen’); /*小写*/SELECT UPPER(‘KuangShen’); /*大写*/SELECT LEFT(‘hello,world’,5); /*从左边截取*/SELECT RIGHT(‘hello,world’,5); /*从右边截取*/SELECT REPLACE(‘狂神说坚持就能成功’,’坚持’,’努力’); /*替换字符串*/SELECT SUBSTR(‘狂神说坚持就能成功’,4,6); /*截取字符串,开始和长度*/SELECT REVERSE(‘狂神说坚持就能成功’); /*反转*/#日期和时间函数
SELECT CURRENT_DATE();/*获取当前日期*/SELECT CURDATE();/*获取当前日期*/SELECT NOW();/*获取当前日期和时间*/SELECT LOCALTIME();/*获取当前日期和时间*/SELECT SYSDATE();/*获取当前日期和时间*/
/*获取年月日,时分秒*/SELECT YEAR(NOW());
SELECT MONTH(NOW());
SELECT DAY(NOW());
SELECT HOUR(NOW());
SELECT MINUTE(NOW());
SELECT SECOND(NOW());
#系统信息函数
SELECT VERSION();/*版本*/SELECT USER();/*用户*/# 查询姓李的同学,改成吴
SELECT REPLACE(studentname,’李’,’吴’) AS 新名字
FROM student WHERE studentname LIKE’李%’;
#聚合函数
#COUNT():返回满足SELECT条件的记录总和数,如SELECT COUNT(*)
#SUM():返回数字字段或表达式列作统计,返回一列的总和
#AVG():通常为数值字段或表达列作统计,返回一列的平均值
#MAX():可以为数值字段、字符字段或表达式列作统计,返回最大的值
#MIN():可以为数值字段、字符字段或表达式列作统计,返回最小的值
SELECT SUM(StudentResult) AS 总和 FROM result;
SELECT AVG(StudentResult) AS 平均分 FROM result;
SELECT MAX(StudentResult) AS 最高分 FROM result;
SELECT MIN(StudentResult) AS 最低分 FROM result;