数据库:DataBase;简称DB。用于存储和管理数据的仓库。
数据库的特点:
- 持久化存储数据的。其实DB就是一个文件系统。
- 方便存储和管理数据。
- 使用了统一的方式操作数据库–SQL。
数据库的种类:
- MySQL:开源免费的数据库,小型的数据库,已经被Oracle收购了MySQL6.x开始收费。
- Oracle:收费的大型数据库。
- DB2:IBM公司的数据库产品,收费的。常应用在银行系统中。
- SQLServer:MicroSoft公司收费的中型的数据库。C#、net等语言常使用。
- 等等…
MySQL
启动:
- 手动
- cmd -> services.msc 打开服务的窗口
- 使用管理员打开cmd: net start mysql 启动mysql的服务;net stop mysql 关闭mysql的服务。
登录:
- mysql -uroot -p密码
- mysql -h127.0.0.1(连接目标ip) -uroot -p密码
- –host-127.0.0.1 --user-root --password-密码
退出:
- exit
- quit
目录结构:
- MySQL安装目录(basedir):配置文件my.ini
- MySQL数据目录(datadir):数据库:文件夹;表:文件;数据:数据。
SQL
SQL结构化查询语言(Structured Query Language)
其实就是定义了操作所有关系型数据库的规则。每一种数据库操作的方式存在不一样的地方,称为“方言”。
SQL通用语法:
- SQL语句可以单行或多行书写,以分号结尾。
- 可以使用空格和缩进来增强语句的可读性。
- MySQL数据库的SQL语句不区分大小写,关键字建议使用大写。
- 三种注释:①单行注释:-- 注释内容 (要带空格)或 # 注释内容(mysql特有)②多行注释 / *注释 * /。
SQL分类
- DDL(Data Definition Language)数据定义语言:用来定义数据库对象:数据库、表、列等。关键字:create,drop,alter等。
- DML(Data Manipulation Language)数据操作语言:用来对数据库中表的数据进行增删改。关键字:insert,delete,update等。
- DQL(Data Query Language)数据查询语言:用来查询数据库中表的记录。关键字:select,where等。
- DCL(Data Control Language)数据控制语言:用来定义数据库的访问权限和安全级别,及创建用户。关键字:GRANT,REVOKE等。
DDL 操作数据库、表
1.操作数据库:CRUD
C(create)创建:
- ①
create database 数据库名称;
- ②先判断有无再创建:
create database if not exists 数据库名称
- ③先判断再指定字符集:
create database if not exists 数据库名称 character set gbk;
R(Retrieve)查询:
- ①查询所有数据库的名称
show databases;
- ②查询某个数据库的字符集(查询某个数据库的创建语句)
show create database 数据库名称。
U(Update)修改:
- 修改字符集:
alter database 数据库名称 character set utf8;
D(Delete)删除:
- ①
drop database 数据库名称;
- ②先判断有无再删除:
drop database if exists 数据库名称;
使用数据库:
- ①查询当前正在使用的数据库名称:
select database();
- ②使用数据库:
use 数据库名称
。
2.操作表:CRUD
C(create)创建:
- 创建表:
create table 表名称(列名1 数据类型1,列名2 数据类型2,...,列名n 数据类型n);
R(Retrieve)查询:
- ①查询某个数据库中所有表的名称:
show tables;
- ②查询表结构:
desc 表名称
。
U(Update)修改:
- ①修改表名:
alter table 表名 rename to 新名;
- ②修改表的字符集:
alter table 表名 character set 字符集名称(如utf8);
- ③添加一列:
alter table 表名 add 列名 数据类型;
- ④修改列名称、类型:
alter table 表名 change 列名 新列名 新数据类型;
或alter table 表名 modify 列名 新数据类型;
- ⑤删除列:
alter table 表名 drop 列名;
D(Delete)删除:
- ①
drop table 表名;
- ②
drop table if exists 表名;
常用数据类型:
- int整数类型,如age int,
- double小数类型,如score double(5,2)(共5位,保留2位,最大999.99)
- date日期,只包含年月日,yyyy-MM-dd
- datetime日期,包含年月日时分秒 yyyy-MM-dd HH:mm:ss
- timestamp日期,包含年月日时分秒 yyyy-MM-dd HH:mm:ss,若将来不给这个字段赋值,或赋值为null,则默认使用当前的系统时间,来自动赋值
- varchar,字符串,如name varchar(20);姓名对打20个字符,zhangsan8个字符,张三2个字符
DML 增删改表中的数据
增加数据
insert into 表名(列名1,列名2,...列名n) values(值1,值2,...值n);
- 列名和值需要一一对应。
- 如果表明后,不定义列名,则默认给所有列添加值:
insert into 表名 values(值1,值2,...值n);
- 除了数字类型,其他类型都需要用引号引用。
删除数据
delete from 表名 [where 条件]
- 如果不加条件,则删除表中所有记录。
truncate table 表名;
删除表,然后创建一个一模一样的空表。- 如果删除所有记录:①不推荐使用delete from 表名;因为有多少条记录就会被执行多少次删除操作;②推荐使用 truncate table 表名;效率高。
修改数据
update 表名 set 列名1=值1,列名2=值2,...列名n=值n [where 条件];
- 如果不加任何条件则会把表中所有记录全部修改。
DQL 查询语句
select * from 表名
语法
select 字段列表 from 表明列表 where 条件列表 group by 分组字段 having 分组后的条件 order by 排序 limit 分页限定
基础查询
- 如查询姓名及年龄:
SELECT NAME, age FROM students;
- 去除重复的结果集(SELECT DISTINCT),如:
SELECT DISTINCT id FROM students;
若有两个,则两个完全一样才能去除,如:SELECT DISTINCT id,NAME FROM students;
。 - 如果有math 和english分数,且要算它们之和:
SELECT name,math,english,math+english FROM students;
- 但有null的计算结果都为null,上面业务不合理,可用IFNULL,上面可改为:
IFNULL(math,0)+IFNULL(english,0)
- 后面可以起别名:
IFNULL(math,0)+IFNULL(english,0) AS 总分
(AS可省略)
条件查询
- where子句后跟条件
- 运算符>,<,>=,<=,=,!=,<>(也是不等于)
- 查询年龄大于等于20、小于等于30:①
WHERE age>=20&&age<=30;
②WHERE age>=20 AND age<=30;
③WHERE age BETWEEN 20 AND 30(包括20和30);
- 查询年龄22岁,19岁,25岁的信息:①
WHERE age=22 OR age=19 OR age=25;
②WHERE age IN (22,18,25);
- NULL只能用IS NULL或IS NOT NULL判断;
- LIKE 模糊查询:① _ :单个任意字符,如查询姓马的:
WHERE NAME LIKE "马%";
②%:多个任意字符,如查询第二个字为化的WHERE NAME LIKE "_化%" ;
查询名字三个字的人:WHERE NAME LIKE "___";
查询名字中包含马的人WHERE NAME LIKE "%马%";
排序查询
- order by 子句:order by 排序字段1 排序方式1,排序字段2 排序方式2…
- 例:
SELECT * FROM students ORDER BY score;
- ASC:升序,默认的。
- DESC:降序,如
SELECT * FROM students ORDER BY score DESC;
- 先按照score降序,一样的再按id升序:
SELECT * FROM students ORDER BY score DESC,id ASC;
聚合函数
- 将一列数据作为一个整体,进行纵向的计算。
- count:计算个数
- max:计算最大值
- min:计算最小值
- sum:计算和
- avg:计算平均值
- 如:
SELECT COUNT(NAME) FROM students;
- 聚合函数的计算,排除null值。解决方法:①选择不包含非空的列进行计算;②IFNULL函数。
分组查询
- group by 分组字段;
- 分组之后查询的字段:分组字段、聚合函数。
- 如:
SELECT sex,AVG(score),COUNT(NAME) FROM students GROUP BY sex;
- 加条件,要大于60分才参与分组:
SELECT sex,AVG(score),COUNT(NAME) FROM students WHERE score>60 GROUP BY sex;
- 再加条件,分组后人数需大于2的:
SELECT sex,AVG(score),COUNT(NAME) FROM students WHERE score>60 GROUP BY sex HAVING COUNT(id)>2;
- where和having的区别:① where再分组前进行限定,不符合则不参与分组;having在分组后限定,不符合条件则不会被查询出来。② where后不可以跟聚合函数,having可跟聚合函数。聚合函数后可以跟个别名。
分页查询
- limit 开始的索引,每页查询的条数
- 如每页显示2条,显示第一页的记录:
SELECT * FROM students LIMIT 0,2;
- 公式:开始的索引=(当前的页码-1)*每页显示的条数。
- limit是一个MySQL的“方言”。