数据库的基本概念
数据库(DataBase,DB):
指长期保存在计算机的存储设备上,按照一定规则组织起来,可以被各种用户或应用共享的数据集合。
数据库管理系统(DataBase Management System,DBMS):
指一种操作和管理数据库的大型软件,用于建立、使用和维护数据库,对数据库进行统一管理和控制,以保证数据库的安全性和完整性。用户通过数据库管理系统访问数据库中的数据。
数据库软件 应该为 数据库管理系统,数据库是 通过 数据库管理创建和操作
数据库:存储、维护和管理数据的结合
数据库与数据库管理系统的关系
常见的数据库
关系型数据库
MYSQL,Oracel,db2,Ms SQL
非关系型数据库
Redis,Hbase,mango
SQL概述
SQL:Structure Query Language。
SQL被美国国家标准局(ANSI)确定为关系型数据库语言的美国标准,后来被国际化标准组织(ISO)采纳为关系数据库语言的国际标准。
SQL是一门语言,操作关系型数据库的语言,使用SQL能够完成大部分的操作。
但是,有些数据库有一些特殊的操作,实现相同的功能,不同的数据库使用关键字(语句)不一样,这个称为 “方言”。
优点:
(1)不是某个特定数据库供应商专有的语言。几乎所有重要的数据库管理系统都支持SQL。
(2)简单易学,该语言的语句都是由描述性很强的英语单词组成,且这些单词的数目不多。
(3)高度非过程化,即用SQL操作数据库,只需指出“做什么”,无须指明“怎么做”,存取路径的选择和操作的执行由DBMS自动 完成。
SQL的分类
分类:是根据SQL语言操作的对象来分,有对数据库、表和表中的数据。
DDL(Data definition language):数据库定义语言,
用来定义数据库对象:数据库、表、列。
DML(Data manipulation language)数据库操作语言
用来定义数据库记录(数据),就是对操作数据
DCL(Data Control Language)数据控制语言
用来定义访问权限和安全级别。
DQL(Data Query Language) 数据查询语言
用来查询的语句,用来查询记录(数据)
DDL:操作数据库,表,列
使用的关键字主要有:create(创建),alter(修改),drop(删除)
创建一个数据库
#创建一个数据库
CREATE DATABASE mydb01;
#创建数据库指定字符集
CREATE DATABASE mydb02 CHARACTER SET gbk;
CREATE DATABASE mydb03 CHARACTER SET gbk COLLATE gbk_chinese_ci;
查询
#查询当前数据库服务器中所有的数据库
SHOW DATABASES;
#查看前面创建mydb02数据库的定义信息
SHOW CREATE DATABASE mydb02;
修改
#修改mydb02数据库的字符串
ALTER DATABASE mydb02 CHARACTER SET utf8;
删除
#删除数据库mydb03
DROP DATABASE mydb03;
其他指令
#使用或切换数据库
USE mydb02;
#查看当前使用的数据库
SELECT DATABASE();
DDL:操作数据表
创建一个表
创建之前要先使用数据库
语法:
Create table 表名(
字段1 字段类型,
字段2 字段类型,
…
)character set 字符集 collate 校对规则;
常用的数据类型:
Int:整型
Double:浮点型,
例如:double(5,2),最多5位,其中必须有2个小数
char:固定长度的字符串类型
char(10), “aaa”,占10位
varchar:可变长度字符串类型
varchar(10) “aaa”,占3位,
text文本类,字符串
blob:字节类型
date:日期类型,格式:yyyy-MM-dd
time:时间类型,格式hh:mm:ss
timestamp:时间戳类型:yyyy-MM-dd hh:mm:ss 会自动赋值
dateTime:日期时间类型: yyyy-MM-dd hh:mm:ss
#使用数据库
USE mydb01;
#创建一个表
CREATE TABLE USER(
id INT,
NAME VARCHAR(20),
PASSWORD CHAR(32),
birthday DATE
)
查看数据库的所有表
#查看数据库的所有表
SHOW TABLES;
查看表的字段信息
#查看表的字段信息
DESC USER;
添加一列
#添加一列
ALTER TABLE USER ADD image CHAR(60);
修改列的信息
#修改列的信息
ALTER TABLE USER MODIFY image VARCHAR(50);
删除列
在企业中,基本出现删除列的可能性是0 ,如果一个表中有数据了,删除列会导致数据丢失,不会轻易去删除数据
#删除列
ALTER TABLE USER DROP image;
修改表名字
#修改表名字
RENAME TABLE USER TO user_table;
修改列(字段)的名字
#修改字段的名字
ALTER TABLE user_table CHANGE NAME username VARCHAR(100);
显示表的创建细节
#显示表的创建细节
SHOW CREATE TABLE user_table;
#cmd命令窗口下看到的更直观
修改字符集
#修改字符集
ALTER TABLE user_table CHARACTER SET gbk;
删除表
#删除表
Drop table user_table;
DML:操作表的数据
DML的是对表中的数据进行 增 、删、改的操作,不要与DDL混淆了。
常用命令,insert(插入),update(更新),delete(删除)
注意细节:
在mysql中,字符串类型,日期类型都是用单引号括起来
空值表示:null
查询表中所有数据:select * from 表明
注意:select不是DML语言
插入操作:
语法:
nsert into 表名(列名1,列名2,。。。。)values (列值1,列值2)
列名与列的值 个数、类型、顺序必须一一对应:
理解为调用
列值1:实参,
列名1:形参
列值的长度不能超出定义的长度
如果插入的是空值:null
如果插入的记录中,值的个数,类型,顺序,和建表的时候保持一致,列名可以省略
Insert into 表名 values (列值1,列值2)
先建立一个表用来操作
#建立操作的表
CREATE TABLE emp(
id INT,
NAME VARCHAR(100),
gender VARCHAR(10),
birthday DATE,
salary FLOAT(10,2),
entry_date DATE,
RESUME TEXT
);
#查看建立是否成功
SHOW TABLES;
#插入数据
INSERT INTO emp(id,NAME,gender,birthday,salary,entry_date,RESUME)
VALUES (1,'zhangsan','male','1990-5-20','2018-1-4','1000','good man');
#查看数据是否插入
SELECT * FROM emp;
字符集错误:
字符集错误指数据库中的编码和你输入到数据库中的数据不匹配产生的错误,一般向数据库中插入中文时会出现该错误
解决方法:
一:查看数据库编码信息 使用以下命令
#查看数据库编码信息
SHOW VARIABLES LIKE 'character%';
二:修改字符串编码
临时修改,有效范围仅仅是本次会话,关闭再打开就不会生效了
#修改字符串编码
SET character_set_client = gbk;
SET character_set_results = gbk;
修改操作:update
语法:
Update 表名 Set 列名1 = 列1的值,列名2=列2的值 [where 列名=值]
中括号中的值可选,案例如下:
#将所有员工的薪水改成5000.0
UPDATE emp SET salary = 5000;
#将名字为‘zhangsan’的员工,薪水改为10000
UPDATE emp SET salary = 10000
WHERE NAME='zhangsan';
#将名字为‘ls’的员工薪水改成8000,性别改为male
UPDATE emp SET salary = 8000,gender = 'male'
WHERE NAME='ls';
#将名字为ls的员工薪水加1000
UPDATE emp SET salary =salary+1000
WHERE NAME = 'ls';
删除操作:delete
语法:
Delete from 表名 [where 列名=值]
#将名字为lisi的员工干掉
DELETE FROM emp WHERE NAME ='ls';
#删除表中所有记录
DELETE FROM emp;
#使用truncate删除表中的记录
TRUNCATE TABLE emp;
注意:
(1)delete删除表中的数据,表结果还存在,删除只有的数据可以找回。
(2)drop删除表,数据和表的结构都没了。
(3)truncate:删除,直接将表drop,然后在创建一个同样的新表,
这种删除数据的方式,数据不能找回,执行速度比delete快。
(4)在企业中,不会轻易去删除数据,往往使用标记为来实现。
额外存储一个布尔类型的字段,默认值true,如果需要delete的话,将该字段的值修改为false。
DQL:数据查询(很重要)
数据库执行DQL语句,不会对数据进行改变,而是让数据库发送结果集给客户端。
查询返回的结果集:是一张虚拟表
语法:
Select … from tableName where …group by …having ..order by … limit ….
Select
列名 //要查询的列的名称
from
表名 //要查询的表的名称
[ where … //行条件,满足那些条件的行,我才是需要的
group by … //对结果进行分组
having … //对分组之后的数据进行过滤,与where功能类似
order by …. //对结果进行排序,asc/desc
limit offset_start ,row_count ] //对结果限定 ,从offset_start,读取row_count行
注意:Where与hvaing的区别:
都是过滤,where是分组之前的过滤,having是分组之后的过滤
通过一个案例来理解:Where:找出一个班级中成绩大于90分的人。
having: 找出班级平均分大于80的班级,
按照班级分组得到班级的平均分,然后进行过滤。
建立一张表,并插入数据,以供操作:
#创建学生表
#mydb01.stu这种方式可以不用先使用数据库
#comment 使用该关键字可以在字段后添加解释,更方便去理解该字段的用途
#
CREATE TABLE mydb01.stu(
sid CHAR(6) COMMENT '学生学号',
sname CHAR(50) COMMENT '学生的名字',
age INT COMMENT '学生年龄',
grender VARCHAR(20) COMMENT'学生性别'
)
#插入数据
INSERT INTO stu VALUES('S_1001', 'liuYi', 35, 'male');
INSERT INTO stu VALUES('S_1002', 'chenEr', 15, 'female');
INSERT INTO stu VALUES('S_1003', 'zhangSan', 95, 'male');
INSERT INTO stu VALUES('S_1004', 'liSi', 65, 'female');
INSERT INTO stu VALUES('S_1005', 'wangWu', 55, 'male');
INSERT INTO stu VALUES('S_1006', 'zhaoLiu', 75, 'female');
INSERT INTO stu VALUES('S_1007', 'sunQi', 25, 'male');
INSERT INTO stu VALUES('S_1008', 'zhouBa', 45, 'female');
INSERT INTO stu VALUES('S_1009', 'wuJiu', 85, 'male');
INSERT INTO stu VALUES('S_1010', 'zhengShi', 5, 'female');
INSERT INTO stu VALUES('S_1011', 'xxx', NULL, NULL);
基础查询
#查询所有的列(方式一)
SELECT *
FROM stu;
#查询所有的列(方式二)效率更高
SELECT sid,sname,age,grender
FROM stu;
查询指定列
#查询指定列
SELECT age,grender
FROM stu;
条件查询
介绍
条件查询就是在查询的时候给出where子句,按照一定的要求查询数据。
在where子句中可以使用运算符及关键字。
(1)=、!=、<> 、<、<=、>、>=
(2)between … and ;
(3)in (set)
(4)and
(5)or
(6)not
查询性别是"女",并且年龄小于55的记录
#查询性别是"女",并且年龄小于55的记录
SELECT *
FROM stu
WHERE grender='female' AND age < 55;
查询学号为 S_1001 或者名字为"lisi"
#查询学号为S_1001 或者名字为"lisi"
SELECT *
FROM stu
WHERE sid='s_1001' OR sname = 'lisi';
查询学号为S_1001, S_1002,S_1003的记录
#查询学号为S_1001,S_1002,S_1003的记录
SELECT *
FROM stu
WHERE sid IN ('s_1001','s_1002','s_1003');
查询学号不是S_1001, S_1002,S_1003的记录
#查询学号不是S_1001,S_1002,S_1003的记录
SELECT *
FROM stu
WHERE sid NOT IN ('s_1001','s_1002','s_1003');
查询年龄为null的记录
#查询年龄为null的记录
SELECT *
FROM stu
WHERE age IS NULL;
查询年龄在20到40之间的学生记录
#查询年龄在20到40之间的学生记录
SELECT
*
FROM
stu
WHERE
age >= 20 AND age <=40;
#或者
SELECT
*
FROM
stu
WHERE
age BETWEEN 20 AND 40;
查询姓名不为null的学生记录
#查询姓名不为null的学生记录
SELECT
*
FROM
stu
WHERE
sname IS NOT NULL;
#或者
SELECT
*
FROM
stu
WHERE
NOT sname IS NULL;
查询性别非男的学生记录
#查询性别非男的学生记录
SELECT
*
FROM
stu
WHERE
grender != 'male';
#或者
SELECT
*
FROM
stu
WHERE
NOT grender = 'male';
#或者
SELECT
*
FROM
stu
WHERE
grender <> 'male';