本片内容考虑到初学者完全没有接触过,所以关键字同统一使用小写方便识别记忆,正常情况下关键字需要大写。
数据库(database) 保存有组织的数据容器(通常是一个文件或一组文件)。
表(table) 某种特定类型数据的结构化清单。
列(column) 表中的一个字段。所有表都是由一个或多个列组成的。
数据类型(datatype)所容许的数据的类型。每个表都有相应的数据类型,他限制(或容许)该列中存储的数据。
行(row) 表中的一个记录。
主键(primary key) 一列(或一组列),其值能够唯一区分表中的每一行。
SQL(发音为字母S-Q-L或sequel)是结构化查询语言(Structured Query Language)的缩写。SQL是一种专门用来与数据库通信的语言。
DBMS专用的SQL SQL不是一种专利语言,而且存在一个标准委员会,他们试图定义可供所有DBMS实现的SQL都不完
全相同。这里讲述的SQL是专门针对MySQL的,但是需要注意的是,SQL语法是有“方言”之分的。多数语法虽适用于其
他DSMS,但是也有部分语法只适用于MySQL,即前面说的“方言”。
数据库的特点:
1.持久化存储数据。其实数据库就是一个文件系统
2.方便存储和管理数据
3.使用了统一的方式操作数据库—SQL
讲完了SQL,我们就需要安装一个一个MySQL,当然还有甲骨文公司的Database 和 微软的 SQL Sever,但是我们只要掌握好MySQL就够用了。
1.手动
2.cmd–>services.msc 打开服务窗口
3.使用管理员打开cmd
net start mysql : 启动mysql的服务
net stop mysql : 关闭mysql的服务
启动MySQL服务后,再按照以下三个其中一个格式来登录MySQL。
mysql -uroot -p密码
mysql -hip -uroot -p连接目标的密码
mysql --host=ip --user=root --password=连接目标的密码
按照以下命令即可退出MySQL服务回到DOS初始界面。
exit
quit
1.SQL 语句可以单行或多行书写,以分号结尾。
2.可以使用空格和缩进来增强语句的可读性。
3.MySQL 数据库的 SQL 语句不区分大小写,关键字建议使用大写。
单行注释: -- 注释内容 或 # 注释内容(MySQL特有)
多行注释:/* 注释 */
(1)DDL(Date Definition Language)数据定义语言
用来定义数据库对象:数据库,表,列等。关键字:create,drop,alter等
(2)DML(Date Manipulation Language)数据操作语言
用来对数据库中表的数据进行增删改。关键字:insert,delete,update等
(3)DQL(Date Query Language)数据查询语言
用来查询数据库中表的记录(数据)。关键字:select,where等
(4)DCL(Date Control Language)数据控制语言(了解)
用来定义数据库的访问权限和安全级别,及创建用户。关键字:GRANT,REVOKE 等
5.1.1. C(Create):创建
创建数据库:
create database 数据库名称;
创建数据库,判断不存在,再创建:
create database if not exists 数据库名称;
创建数据库,并指定字符集:
create database 数据库名称 character set 字符集名;
5.1.2 R(Retrieve):查询
创建完数据库就要查询自己创建成功了,所以就要学一下查询的方法
查询所有数据库的名称:
show databases;
查询某个数据库的字符集:查询某个数据库的创建语句
show create database 数据库名称;
其中查询出来的所有表中,mysql、performance_schema为数据库自带的不建议动用,我们要使用再自己创建一个新的即可。
5.1.3 U(Update):修改
alter database 数据库名称 character set 字符集名称;
5.1.4 D(Delete):删除
删除数据库:
drop database 数据库名称;
判断数据库存在,存在再删除:
drop database if exists 数据库名称;
5.1.5 使用数据库
查询当前正在使用的数据库名称:
select database();
使用数据库:
use 数据库名称;
操作数据库都是准确地输入了就能得出结果的操作,很简单没有复杂的语法,二操作表就相比于操作数据库多了一些格式要求和条件语法。
首先我们要了解一下数据类型库,这样才能保证输入的数据类型没有差错。
1.int :整数类型
例:age int,
2.double :小数类型
例:score double(5,2)// 5表示五个有效数字,2表示保留两位小数
3.date:日期,只包含年月日。格式:yyyy-MM-dd
4.datetime:日期,包含年月日时分秒。格式: yyyy-MM-dd HH:mm:ss
5.timestamp:时间戳类型 包含年月日时分秒。格式:yyy-MM-dd HH:mm:ss
如果将来不给这个字段赋值,或赋值为null,则默认使用当前的系统时间,来自动赋值
6.varchar:字符串
例:name varchar(20):姓名最大20个字符
zhangsan 为八个字符 ; 张三 为两个字符。
1.语法:
create table 表名(
列名1 数据类型1,
列名2 数据类型2,
…
列名n 数据类型n
);
注意:最后一列,不需要加逗号(,)
create table student(
id int,, --主键
name varchar(32), --姓名,字符串类型,最大字符为32
age int, --年龄,整数类型
score double(4,1), --分数,小数类型,四个有效数字保留一位小数
brithday date, --生日,日期,格式为yyyy-MM-dd
insert_time timestamp --时间戳类型,可以知道该行最后的修改时间
);
create table 表名 like 被复制的表名; --复制表
show tables; --查询某个数据库中的所有表的名称
desc 表名; --查询表结构
alter table 表名 rename to 新的表名; --修改表名
alter table 表名 character set 字符集名称; --修改表的字符集
alter table 表名 add 列名 数据类型; --添加一列
alter table 表名 change 列名 新列别 新数据类型; --修改列名称 类型
alter table 表名 modify 列名 新数据类型; --只改变数据类型
alter table 表名 drop 列名; --删除列
drop table 表名; --删除表
drop table if exists 表名; --先判断表是否存在再删除表
我们首先需要知道怎么查询表,才能知道我们增删改的操作是否正确,所以我提前说一下查询一个表所有记录的操作。
select * from 表名; --查询该表所有记录。*可替换为列名,表示只查询某列或多列
语法:
insert into 表名(列名1,列名2,...列名n)values(值1,值2,...值n);
注意:
1. 列名和值要一一对应。
2. 如果表明后不定义列名,则默认给所有列添加值
insert into 表名 values(值1,值2,...值n);
3. 除数字类型,其他类型需要用引号(单双都可以)引起来。
例:
insert into student(id,name,age)VALUES(1,'张三',20);
insert into student VALUES(2,'李四',18,99.9,'2020-03-19',null);
语法:
delete from 表名【where 条件 】; --不要中括号
例:
DELETE from student where id = 1; --删除id=1的行
注意:
1.如果不加条件,则删除表中所有记录。
2.如果要删除所有记录
2.1 delete from 表名;-- 不推荐使用。有多少条记录就会执行多少次删除操作
2.2 TRUNCATE TABLE 表名; -- 推荐使用,效率更高;先删除表,然后在创建一张一样的表。
语法:
update 表名 set 列名1 = 值1,列名2 = 值2,...【where 条件】;
注意: 如果不添加任何条件,则会将表中所有记录全部修改。
update student set age=19 where id =2; --吧id为2的那行年龄改为19
这里我在结尾将会提供一个创建好的表为练习查询使用。
先展示一下表的内容
select 字段名1,字段名2... from 表名; --可用*来代替字段列表查询所有字段
例:
select name,address from student; --即可看到哪个同学来自哪个地方
select distinct 字段名1,字段名2... from 表名;
例:
select distinct name,math,english from student;
一般可以使用四则运算计算一些列的值。(一般只会进行数值型的计算)
注意 由于null参与的运算,计算结果都将为null,所以我们在计算列的时候我们需要将null值改为0;
ifnull(表达式1,表达式2); --表达式1:哪个字段需要判断是否为null
--表达式2:如果该字段为null后的替换值。
SELECT distinct name,math,english,math+IFNULL(english,0) from student; --这样英语的null就不会影响到总分的计算
select name as 别名,math 别名 from student3;
SELECT distinct name,math 数学,english 英语,math+IFNULL(english,0) as 总分 from student3;
只需要在查询语句后面加where子句后跟条件。
通常情况下会运用运算符来当做条件,接下来就介绍一下运算符。
以下是常用的运算符:
> 、< 、<= 、>= 、= 、<>
BETWEEN...AND
IN( 集合)
LIKE:模糊查询
占位符:
_:单个任意字符
%:多个任意字符
IS NULL
and 或 &&
or 或 ||
not 或 !
例:
SELECT * FROM student WHERE age > 20; -- 查询年龄大于20岁
SELECT * FROM student WHERE age >= 20; -- 查询年龄大于等于20岁
-- 查询年龄不等于20岁
SELECT * FROM student WHERE age != 20;
SELECT * FROM student WHERE age <> 20;
-- 查询年龄大于等于20 小于等于30
SELECT * FROM student WHERE age >= 20 && age <=30;
SELECT * FROM student WHERE age >= 20 AND age <=30;
SELECT * FROM student WHERE age BETWEEN 20 AND 30;
-- 查询年龄22岁,18岁,25岁的信息
SELECT * FROM student WHERE age = 22 OR age = 18 OR age = 25
SELECT * FROM student WHERE age IN (22,18,25);
-- 查询英语成绩为null
SELECT * FROM student WHERE english IS NULL; --null值不能使用 = (!=)判断
-- 查询英语成绩不为null
SELECT * FROM student WHERE english IS NOT NULL;
-- 查询姓马的有哪些? like
SELECT * FROM student WHERE NAME LIKE '马%';
-- 查询姓名第二个字是化的人
SELECT * FROM student WHERE NAME LIKE "_化%";
-- 查询姓名是3个字的人
SELECT * FROM student WHERE NAME LIKE '___';
-- 查询姓名中包含德的人
SELECT * FROM student WHERE NAME LIKE '%德%';
语法:
order by 子句
order by 排序字段1 排序方式1 ,排序字段2 排序方式2...;
排序方式:
ASC --升序,默认的。
DESC --降序。
注意 如果有多个排序条件,则当前边的条件值一样时,才会判断第二条件。
例:
select * from student3 order by math asc;
1. count:计算个数
1. 一般选择非空的列:主键
2. count(*)
2. max:计算最大值
3. min:计算最小值
4. sum:计算和
5. avg:计算平均值
例:
select avg(math) from student3; --计算math的平均值
注意:聚合函数的计算,排除null值。
解决方案:
1. 选择不包含非空的列进行计算
2. IFNULL函数
语法:
group by 分组字段;
注意:
分组之后查询的字段:分组字段、聚合函数
where 和 having 的区别?
2.1 where 在分组之前进行限定,如果不满足条件,则不参与分组。having在分组之后进行限定,如果不满足结果,则不会被查询出来
2.2 where 后不可以跟聚合函数,having可以进行聚合函数的判断。
-- 按照性别分组。分别查询男、女同学的平均分
SELECT sex , AVG(math) FROM student GROUP BY sex;
-- 按照性别分组。分别查询男、女同学的平均分,人数
SELECT sex , AVG(math),COUNT(id) FROM student GROUP BY sex;
-- 按照性别分组。分别查询男、女同学的平均分,人数 要求:分数低于70分的人,不参与分组
SELECT sex , AVG(math),COUNT(id) FROM student WHERE math > 70 GROUP BY sex;
-- 按照性别分组。分别查询男、女同学的平均分,人数 要求:分数低于70分的人,不参与分组,分组之后。人数要大于2个人
SELECT sex , AVG(math),COUNT(id) FROM student WHERE math > 70 GROUP BY sex HAVING COUNT(id) > 2;
SELECT sex , AVG(math),COUNT(id) 人数 FROM student WHERE math > 70 GROUP BY sex HAVING 人数 > 2;
语法:
limit 开始的索引,每页查询的条数;
**公式:**开始的索引 = (当前的页码 - 1) * 每页显示的条数 – 每页显示3条记录
例:
SELECT * FROM student LIMIT 0,3; -- 第1页
SELECT * FROM student LIMIT 3,3; -- 第2页
SELECT * FROM student LIMIT 6,3; -- 第3页
注意 limit 是一个MySQL"方言",即该语句只能在MySQL里面使用。
查询练习数据
CREATE TABLE student (
id int, -- 编号
name varchar(20), -- 姓名
age int, -- 年龄
sex varchar(5), -- 性别
address varchar(100), -- 地址
math int, -- 数学
english int -- 英语
);
INSERT INTO student3(id,NAME,age,sex,address,math,english) VALUES
(1,'马云',55,'男','杭州',66,78),
(2,'马化腾',45,'女','深圳',98,87),
(3,'马景涛',55,'男','香港',56,77),
(4,'柳岩',20,'女','湖南',76,65),
(5,'柳青',20,'男','湖南',86,NULL),
(6,'刘德华',57,'男','香港',99,99),
(7,'马德',22,'女','香港',99,99),
(8,'德玛西亚',18,'男','南京',56,65);