数据库的概念以及sql通用语法
开启mysql服务器:win+R打开运行窗口,输入“services.msc”即可,推荐都自动开启。
登录和退出mysql
登录本机的数据库:mysql -uroot -p管理员密码
登录别人的数据库: mysql -h别人的ip地址 -uroot -p管理员密码
退出数据:exit或者quit
mysql数据目录
1 数据库:本质是文件夹,在开发中一个项目对应一个数据库。
数据库管理系统和数据库的区别?数据库管理系统指的是我们安装mysql软件。数据库指的是存放数据文件的文件夹
2 表:本质是一个文件
3 数据
SQL以及通用语法
sql:操作关系型数据库通用的语言。
通用的语法:
1 sql语句是以分号结尾,不区分大小写。
2 sql的注释:
单行注释: -- 空格
多行注释: /*注释内容*/
SQL分类
1) Data Definition Language (DDL 数据定义语言) 对数据库和表进行增删改查
2) Data Manipulation Language(DML 数据操纵语言),对表中的数据进行增删改
3) Data Query Language(DQL 数据查询语言),对表中的数据进行查询操作
4) Data Control Language(DCL 数据控制语言),对用户权限的设置
对数据库的增删改查(DDL)
创建数据库
语法:create database [if not exists] 数据库名称 [charater set utf8]; — []中的内容表示可选。
-- 创建一个db1数据库,使用默认的字符集
create database db1;
-- 创建一个db2数据库,使用gbk字符集
create database db22 character set gbk;
create database if not exists db2 character set gbk;
删除数据库
语法:drop database [if exists] 数据库名称; — []中的内容表示可选。
-- 删除db1数据库
drop database db1;
-- 删除db2数据库,如果存在就删除
drop database if exists db2;
其他操作
查看所有数据库:show databases;
使用数据库:use 数据库名称;
对数据库中表的增删改查(DDL)
创建表
语法:
create table [if not exists] 表名( -- []中的内容表示可选。
列1 数据类型,
列2 数据类型,
...
列n 数据类型
);
注意:最后一列不需要逗号,写了反而出错。
数据类型:
整型:int
浮点型:float(总位数,小数位数) 、 double(总位数,小数位数)
字符串类型:
char(长度):固定长度字符串,假设长度写的是8,不管存几个字符,那么在底层都是站8个字符的位置
varchar(长度):可变长度字符串,假设长度写的是8,字符串的实际长度多长,存进去就占几个字符。
时间类型:
date:年月日时间类型
datetime:年月日时分秒类型,如果不存值或者存null,那么值都是null。
timestampt:年月日时分秒类型,如果不存值或者存null,那么值是系统当前时间。
例如:
create table if not EXISTS student(
id int,
name VARCHAR(20),
age int,
score DOUBLE(5,2),
birthday date,
insert_time TIMESTAMP
);
删除表
语法:drop table [if exists] 表名;
-- 删除表
drop table if EXISTS student;
修改表
规律:alter table 表名 add/drop/change/modify/rename to
其中;
修改列名:alter table 表名 change 旧列名 新列名 新数据类型(长度);
修改数据类型:alter table 表名 modify 列名 新数据类型(长度);
数据库和表的总结
0 登陆数据库的两个异常:密码错误和mysql服务没有开启
1 创建数据库:create database ...
2 删除数据库:drop database ...
3 创建表:create table ...
4 删除表: drop table ...
对表中的数据增删改查(DML+DQL)
添加数据
语法:
给指定列添加一条数据:insert into 表名(列1,列2,...) values (值1,值2,...);
给所有列添加一条数据:insert into 表名 values (值1,值2,...);
一次性添加多条数据:insert into 表名 values (值1,值2,...),(值1,值2,...),(值1,值2,...),...;
例如:
-- 给指定列添加一条数据:添加 1号,张无忌,20岁
INSERT INTO stu(id,name,age) VALUES(1, '张无忌',20);
-- 给所有列添加一条数据:添加赵敏
INSERT INTO stu VALUES(2, '赵敏',18,80.5,'2001-2-21',null);
-- 一次性添加多条数据:添加张三崩,殷天正
INSERT INTO stu VALUES(3, '张三崩',88,100.0,'1921-2-21',null),(4, '殷天正',68,90.5,'1951-2-21',null);
注意:
1 添加的值要和列一一对应(顺序和类型一致,且不能超出指定长度)。
2 除了数字类型,其他类型的数据都需要使用引号引起来。推荐单引号。
删除数据
1、带条件删除
delete from 表名 where 条件;
2、不带条件删除(删除所有数据)
delete from 表名; --DML语句,将表中的数据一条一条的删除
删除所有数据还有另一种做法:TRUNCATE table 表名; -- DDL语句,将表删除,然后再创建一张一样的新表
修改数据
语法:
不带条件修改:update 表名 set 列名=值,列=值,...;
带条件修改:(大部分情况)update 表名 set 列名=值,列=值,... where 条件;
例如:
-- 将所有人的分数设置为100分
update stu set score=100;
-- 将所有人的分数在原来的基础上-10分
update stu set score=score-10;
-- 将赵敏的分数设置为92分,年龄设置为20
update stu set score=92,age=20 where name='赵敏';
查询数据
基础查询
-- 查询指定列数据
select 列1,列2,... from 表名;
-- 查询所有列数据
select * from 表名; -- *表示所有列,是一个通配符
-- 去重:distinct关键字
-- 查询所有的学生来自哪些城市。
select distinct address from student;
注意:只有两行数据完全一样才可以去重。
-- 计算
注意:任何数据和null做运算,结果都是null,使用ifnull函数将为null的列的值转换为0进行计算。
ifnull(列名,0):如果该列的值为null,那么将他的值用0替代参与运算。
-- 查询所有学生的总分
select name,math,english,math+IFNULL(english,0) from student;
-- 取别名: AS关键字可以省略
select name as 姓名,math as 数学,english as 英语,math+IFNULL(english,0) as 总分 from student;
select name 姓名,math 数学,english 英语,math+IFNULL(english,0) 总分 from student;
条件查询–基础的条件
语法:select * from 表名 where 条件;
比较运算符:> >= < <= = !=/<>
逻辑运算符:&&/and ||/or 推荐些英文单词
between 值1 and 值2 :在值1和值2之间,包含值1和值2
in(值1,值2,...):表示等于值1或者等于值2或者...
is null / is not null
-- 查询年龄大于20岁
select * from student where age>20;
-- 查询年龄等于20岁
select * from student where age=20;
-- 查询年龄不等于20岁
select * from student where age!=20;
select * from student where age <> 20;
-- 查询年龄小于等于20或者大于等于30
select * from student where age <=20 or age>=30;-- 推荐
select * from student where age <=20 || age>=30;
-- 查询年龄大于等于20并且小于等于30
select * from student where age >=20 and age <=30;-- 推荐
select * from student where age >=20 && age <=30;
-- 使用between ... and...
select * from student where age BETWEEN 20 and 30;
-- 查询年龄为22岁,18岁,25岁的信息
select * from student where age=22 or age=18 or age=25;
-- 使用in语句
select * from student where age in(22,18,25);
-- 查询年龄不是22岁,18岁,25岁的信息
select * from student where age not in(22,18,25);
-- 查询英语成绩为null
select * from student where english is null;
-- 查询英语成绩不为null
select * from student where english is not null;
单表查询
条件查询-模糊查询
语法:where 列名 like '带占位符的字符串’
占位符:
_ :表示1个字符的占位符
% :表示0或者多个字符的占位符。
例如:
-- 查询姓马的学生信息
SELECT * FROM student WHERE NAME LIKE '马%';
-- 查询包含德的学生信息
SELECT * FROM student WHERE NAME LIKE '%德%';
-- 查询包含德并且英语成绩大于等于90分的学生信息
SELECT * FROM student WHERE NAME LIKE '%德%' AND english >=90;
-- 查询姓名长度为3的学生信息
SELECT * FROM student WHERE NAME LIKE '___';
排序查询
语法:order by 列名1 asc/desc,列名2 asc/desc …
说明:排序查询是对结果进行排序,不是查询条件。先按照列1进行升序/降序排序,如果列1的值一样,那么就按照列2进行升序/降序排序。如果order by 列名后面不写asc/desc,那么默认是asc升序
-- 查询所有学生信息,按照数学成绩降序排序;
SELECT * FROM student ORDER BY math DESC;
-- 查询所有学生信息,按照数学成绩降序排序,如果数学成绩一样,那么按照英语成绩降序排序
SELECT * FROM student ORDER BY math DESC,english DESC;
-- 查询所有姓马的学生信息,并且按照数学成绩降序排序
SELECT * FROM student WHERE NAME LIKE '马%' ORDER BY math DESC;
聚合函数/统计函数
常见的聚合函数:sum(列名)、max(列名)、min(列名)、avg(列名)、count(列名)
说明:在count(列名)函数中,如果该列的值为null,则不算是一条数据,不统计。
-- 查询姓马的学生的数学成绩总和。
SELECT SUM(math) FROM student WHERE NAME LIKE '马%';
SELECT SUM(math) 数学总分 FROM student WHERE NAME LIKE '马%';
-- 查询数学成绩最高分和最低分
SELECT MAX(math),MIN(math) FROM student;
-- 统计姓马的学生的个数
SELECT COUNT(*) FROM student WHERE NAME LIKE '马%';
-- 统计姓马的学生的数学平均成绩
SELECT AVG(math) FROM student WHERE NAME LIKE '马%'
分组查询
语法:group by 列名 [having 条件]; []中的内容是可选的。**
-- 统计男生和女生的个数
SELECT sex,COUNT(*) FROM student GROUP BY sex;
SELECT * FROM student GROUP BY sex; -- 返回每组第一条数据,没有意义
-- 查询男生和女生的英语平均成绩
SELECT sex,AVG(english) FROM student GROUP BY sex;
-- having 筛选条件
-- 查询男生和女生的英语平均成绩,并且只展示平均成绩大于80分的
SELECT sex,AVG(english) FROM student GROUP BY sex HAVING AVG(english) > 80;
where 和having的区别?
1、where后面不能使用聚合函数,having后面可以使用聚合函数。
2、分组之前使用where,分组之后使用having。
3、本质区别:where是对原始表(我们在数据库中创建的表)中的数据进行过滤,having是对查询结果进行过滤。
注意:分组之后的结果集(select后面的内容) 只能是分组字段或者聚合函数。如果*,那么返回每组第一条数据,没有意义
分页查询
语法:limit 每页数据起始索引,每页条数;
-- 查询第一页3条学生信息
select * from student limit 0,3;
-- 查询第二页3条学生信息
select * from student limit 3,3;
-- 查询第三页3条学生信息
select * from student limit 6,3;
-- 查询第四页3条学生信息
select * from student limit 9,3;
查询总结
SQL的书写顺序:select * from 表名 [where 条件] [group by 列名] [having 条件] [order by 列名 asc/desc,列名 asc/desc,...] [limit 每页数据起始索引,每页条数];
关键字在mysql底层的解析书写:from...where...group by...select...having...order by...limit