1、SQL
结构化查询语言,语法简单、功能强大、使用灵活,主要用于关系型数据库中;
SQL语言不区分大小写;
SQL语言结尾必加;
2、Mysql数据库(Red Hat 7版本)
开启/关闭服务器都需要使用root用户;
开启Mysql服务器:systemctl start mariadb
关闭Mysql服务器:
连接数据库和退出数据库最好使用普通用户:
3、数据库的操作(针对Mysql)
(1)、创建数据库:create database test;
创建utf-8(支持中文的)数据库 :create database test character set utf8;(此时下面数据库中就可对中文进行支持);
(2)、查看数据库:show databases;
显示创建数据库的信息:show create database test;
(3)、修改数据库:alter database test character set utf8;
不能修改数据库的名字;
(4)、删除数据库:drop database test;
4、对表的操作
SQL中的数据类型(主要针对Mysql):
数值型 |
说明 |
bit |
位(可以指定一位) |
int |
整型 |
double/float |
浮点数 |
字符型 |
说明 |
char(n) |
不可变字符,n是多少就申请多少空间 |
varchar(n) |
可变字符,根据实际情况申请空间大小 |
text |
大文本、大字符串 |
时间型 |
说明 |
date |
日期,如:'1995-10-10' |
time |
时间,如:'12.23.34' |
datetime |
日期时间,如:'1995-10-10 12.23.34' |
timeStamp |
时间戳,自动赋值为当前日期时间 |
创建表之前,必须说明使用的是哪个数据库:use test;
创建表:create table student(id int, name varchar(20)); //括号中的为表的字段;
(1)、表中增加元素:
insert into student(id, name) values(3, 'maxi');
(2)、删除一张表:drop table student;
删除表中的数据:delete from student where id = 1;(将id为1的这一行数据将删除)
(3)、修改一张表:
修改表名字:rename table student to worker;
增加一个字段:alter table student add column height double;
修改一个字段:alter table student modify column height float;
删除一个字段:alter table student drop column height;
修改表的字符集:alter table student character set gbk;
修改表中的元素:update student set id = id + 1; //给每个学生的id都加了1;
update student set id = 2 where name = 'maxi';
(4)、查看表:show tables;
查看指定表的属性:desc student;
查看表的字段信息:select * from student; //也可查看某个字段的信息,对*做做文章即可;
5、select语句
具体的select操作如下图:
下面的一样:
查询分数范围内的成绩:
select * from student where english>90;
select * from student where english+chinese+math>250;
查询英语分数在 85-95之间的同学:
select * from student where english>=85 and english<=95;
select * from student where english between 85 and 95;
查询数学分数为84,90,91的同学:
select * from student where math=84 or math=90 or math=91;
select * from student where math in(84,90,91);
查询所有姓马的学生成绩:
select * from student where name like '马%' (like和=在这里是等价的);
%:代表任意长度(长度可以是0)的字符串;
_:代表任意单个字符;
distinct:出现的话,用来消除重复的行;
like:查找指定的与字符串匹配的元组;
escape'\':换码字符,其后出现的\之后不再具有通配符的含义;
查询数学分>85,语文分>90的同学:
select * from student where math>85 and chinese>90;
排序:order by <列名> asc(升序) desc(降序)
对数学成绩排序升序(默认为升序)输出:
对总分排序后输出,然后再按从高到低的顺序输出:
统计一个班级共有多少学生?
select count(*) from student;
统计数学成绩大于90的学生有多少个?
select count(*) from student where math>90;
统计总分大于250的人数有多少?
select count(*) from student where math+chinese+english>250;
统计一个班级数学总成绩?
select sum(math) from student;
统计一个班级语文、英语、数学各科的总成绩?
select sum(math), sum(chinese), sum(english) from student;
统计一个班级语文、英语、数学的成绩总和?
select sum(math+chinese+english)from student;
select sum(math)+sum(chinese)+sum(english) from student;
求一个班级数学平均分?
select avg(math) from student;
求一个班级总分平均分?
select avg(math+chinese+english) from student;
select avg(math)+avg(chinese)+avg(english) from student;
求班级最高分和最低分?
select max(math+chinese+english),min(math+chinese+english) from student;
基于空值的查询:
空值(NULL)在数据库中有特殊含义,它表示不确定的值;为空的判断只能用 is NULL / is not NULL;
6、学生表分组(group by)
select *(根据查询的情况) from student group by <列>;
group by:将查询到的结果按指定的列进行分组,即将指定列相同的元组为同一个组;
思想(这是一个经典案例):
(1)、的加一列,alter table student add classid int;
(2)、在根据id进行分组:update student set classid = 1 where id between 1 and 3;
update student set classid = 2 where id between 4 and 6;
此时的情况为:
上面根据classid就已经分为了2个班了;
(3)、在根据classid进行分班,和求其班级平均分:
select classid 班级编号, avg(chinese+english+math) 班级平均分 from student group by classid;
总结:在分组上,Mysql做的不是很好,一个人可以代表一个组;
:select name, classid 班级编号, avg(chinese+english+math) 班级平均分 from student group by classid;
7、时间、日期相关函数
(1)、查询日期、时间:select now() from dual;
select date_add(now(), interval -1 day) 昨天, now() 今天, date_add(now(), interval +1 day) 明天;
结果:
select date_add(now(), interval -1 year) 去年, now() 今年, date_add(now(), interval +1 year) 明年;
结果:
8、多表查询
举个简单例子:有student和work2张表;
select student.* work.* from student, work while student.year = work.year;
9、mysql的备份
备份数据库:mysqldump -u root -p test > 1.sql
如下图:
数据库恢复:mysqldump -u root -p test < 1.sql