数据库(基础)
基本概念
oracle:甲骨文
DB2:IBM
SQL Server:微软
Sybase:赛尔斯
Mysql:甲骨文
数据库:关系型数据库管理系统(DBMS\RDBMS)
区别表记录和表结构
RDBMS:n个仓库+管理员
数据库(仓库):n个table
table:表结构:定义表的列名
表记录: 一行一行的记录
question:
(1)常见的数据库有什么
(2)数据库软件是什么系统?
(3)表记录和表结构的区别?
(4)简述RDBMS和数据库、表、表记录的关系
mysql的中的程序和相关命令
mysqld:服务器程序,看服务器开没开
mysql:连接服务器
my.ini:配置文件,默认端口3306
.frm结尾的为数据库的表
服务器的开启:net start mysql
关闭:net stop mysql
退出:quit 或exit
登录:mysql -uroot -p123 -h(接ip地址如:localhost)
question:
(1)mysql数据库服务器的开启的命令行是什么?
(2)关闭数据库服务器的命令?
(3)退出
(4)登录mysql数据库
SQL(Structured Query Language):结构化查询语言
要点:
(1)不区分大小写,建议关键字大写
(2)分号结尾
DDL(Data Definition Language):数据定义语言,用来定义数据库对象:库、表、列等
(数据库或表的结构操作)
DML(Data Manipulation Language):数据操作语言,用来定义数据库记录(数据)(对表的记录进行更新(增、删、改))
DQL(Data Query Language)(严格来说,属于DML的一部分):对表的记录的查询,查询记录(难点)
DCL(Data Control Language):数据控制语言,用来定义访问权限和安全级别(用户创建和授权)
(1)SQL叫什么?
(2)SQL分为哪几类?各有什么不同?
DDL
数据库的操作
-
查询所有数据库: show databases;
-
选择(切换)数据库:use 数据库名;
-
创建数据库:create database[if not exists] 数据库名[charset = utf8];
注意数据库名填写位置
([]的内容表示选填,方括号不加)
-
删除数据库:drop database 数据库名;
-
修改数据库编码:alter database 数据库名 character set utf8(没有-)
注意是character而不是charset
- 对数据库的操作都有关键字database(s),除了使用use
(1)查询数据库中的所有表语句是什么?
(2)切换选择数据库的语句是什么?
(3)创建数据库的语句是什么?
(4)删除数据库的语句是什么?
(5)修改数据库的编码的语句是什么?
数据类型
int:整型
double:浮点型 double(5,2)表示有5位,其中的5为中有两位为小数,最大值为999.99
decimal:浮点类型,用来表示钱,对十进制比较精确,不会出现精度缺失的问题。
char:固定长度字符串类型:char(255),数据长度不足指定长度,则会补足指定长度
varchar:可变长度字符串类型:varchar(65535),zhangshan,需要一个字节来专门存储字符的长度
text(独有):字符串类型:
blob:字节类型
date:日期类型 yyyy-mm-dd
time:时间类型hh:mm:ss
timestamp:时间戳类型 yyyy-mm-dd hh:mm:ss
(1)double(5,2)表示什么?
(2)decimal通常用来表示什么?
(3)char和varchar的区别?哪个的空间存储密度高?
(4)字节类型是什么?
(5)date和time和timestamp
操作表
创建表
create table 【if no exists】表名(圆括号
列名 类型,(逗号不是分号)
列名 类型,
……
列名 类型(没有逗号)
)
修改表的名字
ALTER TABLE sutdent RENAME TO student;
展示当前数据库中的所有表:
show tables;
查询表结构:
DESC(英文:describe描述) 表名;
删除表
drop table 表名;
修改表:
(1)增加列
alter table 表名 add(
列名 类型,(逗号不是分号)
列名 类型,
……
列名 类型(没有逗号)
);
(2)修改列类型
alter table 表名 modify 列名 类型;
不能向add一样多项操作
- 修改时如果不带完整性约束条件,原有的约束条件将丢失,如果想保留修改时就得带上完整性约束条件
(3)删除列(不需要写类型,因为数据库的列名是不会重复的,列名便可以唯一确定)
alter table 表名 drop 列名 ;
不能向add一样多项操作
- 创建表的操作的语句是什么?
- 修改表的名字的语句是什么?
- 展示当前数据库的所有表的语句是什么?
- 查询表结构的语句是什么?
- 删除表的语句是什么?
- 增加一列的语句是什么?
- 修改列的类型的语句是什么?
- 删除列的语句是什么?
DML:
DQL: 查询表记录select * from 表名;(用来看操作是否成功)
在数据库中所有的字符串类型,必须使用单引,不能使用双引!
插入操作:
(1)insert into stu(列1,列2,列3)values(值1,‘值2’,值3);//未写的列默认值为null,
eg:
INSERT INTO student(id,NAME,address,score) VALUES(1,‘黄xx’,‘深圳’,‘90’);
(2)insert into stu values(值1,‘值2’,值3);
values为复数,顺序与创建表时的顺序一致,可读性低,不建议
eg:
INSERT INTO student VALUES (2,‘蚂蚁’,‘山东’,80);
修改记录
UPDATE 表名 SET 列名1=列值1,列名2=列值2,… [WHERE 条件]
条件(条件可选的):
条件必须是一个boolean类型的值或表达式:
eg:UPDATE t_person SET gender=‘男’,age=age+1 WHERE sid=‘1’;
运算符:=、!=、<>(和不等于等价表示大于小于)、>、<、>=、<=、BETWEEN…AND、 IN(…)、 IS NULL、 NOT、 OR、AND
set 与=等号使用,跟 Java 中的=不一样,跟Java中的==相同; gender=‘男’中的等号跟Java中的赋值相同。
BETWEEN…AND在…
之间,现在把年龄全都展开,把这张三设置成38岁,把赵六设置成48岁:
用 IN(…) 语法把张三和李四的年龄改成36:
eg: update student set age = 36 where name in (‘张山’、李四);
只要条件 age=null 出现,返回值就是 false, 无论哪一列都是 false。 永远不要用它,想用它可以 age is null:
删除记录
delete 表名【where】
eg:
DELETE FROM student WHERE score =10 AND NAME = ‘蚂蚁’;
插入记录的语句是什么?两种
修改记录的语句是什么?
between…and,in的使用
DCL(了解)
- 创建用户
create user 用户名@ip地址(全部ip‘%’) identified by ‘密码’
- 给用户授权(撤销)
grant(revoke) 权限一,二… on 数据库.* from 用户名@ip地址;
- 查询权限
show grant for 用户名@IP地址
- 删除用户
drop user 用户名@IP地址
DQL
查表
:select *from 表名
- 查询表中特定列:select 列1【列2,列3】from 表名;
eg:SELECT * FROM student;
SELECT id,address FROM student;
-
去除完全重复行:select distinct *from 表名;
select distinct 列1【列2】from 表名
列运算:select *,ename*1.5(把无法做加减乘除的量当做0) from 表名;
eg:SELECT * ,score*10 FROM student;
- 替换null的值:ifnull(列名,替换值):
SELECT id,NAME,address,IFNULL(score,0)FROM student;
- mysql中不能用+号连接,mysql中字符串的连接用concat(字符1,字符2,‘自定义字符’)from 表;
给列其别名 as,其中as可以省略
SELECT id AS 狗牌,NAME 狗名 FROM student;
经典坑人题:
SELECT id NAME,address,score FROM student;
该语句有没有错?
没错,可能会让人误以为少了逗号,实际上是取了别名
(1)查表的语句是什么
(2)查表显示不重复行的语句是什么?
(3)替换null的值的语句怎么写?
(4)mysql中字符串的连接怎么写?
条件查询
查询控制:
select * from 表名 where 条件
eg:
SELECT *FROM student WHERE score IS NOT NULL;
条件查询的语句怎么写?
模糊查询
select *from 表名 where 列名 like ‘__’;
SELECT *FROM student WHERE NAME LIKE ‘黄__’;
多少个-就表示后面的有多少个字符(相当于几个空,填空题)
不知道多少个字符的用“%”(匹配0-N个字符)
eg:SELECT *FROM student WHERE NAME LIKE ‘%黄%’;(包含黄字都都行,包括前后)
模糊查询的语句怎么写?
排序
select * from 表名 order by 列名;(默认升序)
SELECT *FROM student ORDER BY score 【排序类型】;
SELECT *FROM student ORDER BY score ASC;
SELECT *FROM student ORDER BY score DESC;
若排序列存在相同值引入第二列进行排序(多列排序):
select *from 表名 order by 列1 排序类型,列2,排序类型;
eg:
SELECT *FROM student ORDER BY score ASC ,address DESC;
排序的查询怎么写?
聚合函数
(纵向)
count:计算记录中不为null的总数
count(*或者数字(1、2、3)效果一样):查询有多少条记录(记录中的值不全为null的全都算1条记录)
SELECT COUNT(*) AS num FROM student;
count(列名):该列中不为null的所有总数
eg:SELECT COUNT(score) FROM student;
sum(列名):计算总和
eg:SELECT SUM(score)FROM student;
max(列名):
SELECT MAX(score) FROM student;
min(列名):
SELECT MIN(score) FROM student;
avg(列名):
SELECT AVG(score) FROM student;
整合:
SELECT MAX(score) 最大值 , MIN(score) 最小值, AVG(score) 平均值 FROM student;
常见的聚合函数有哪些?
分组查询:
group by
分组查询后能获得的都是组信息(共性),而组信息的为聚合函数,或者组类别。
SELECT score,MAX(score) //只能为group by后的列名或者聚合函数,其他列名不可 FROM student GROUP BY score;
分组条件查询:分组前条件where ,分组后having
SELECT score,AVG(score),MAX(id) FROM student WHERE score>18 (分组前)GROUP BY score having (分组后条件聚合函数);
语句顺序和程序执行顺序:
select
from
where
group by
having
order by
(1)分组查询的语句是什么?eg:student表中,分数大于18且按分数进行分组,分组后,组的平均值大于20的组的得分、平均值、最大值显示出来
(2)select 、from、 where、 group by、 having、 order by的顺序是什么
limit方言
limit 0,5,表示从序号为0(第一行)的行开始取,取5行,不到就取有的值
题:
一页的记录数为10,查询第3页的记录
limit 20,10 ;
公式:(当前页-1)*每页记录数,每页记录数
limit 0,5是什么意思?