最终是数据库操作和数据库设计
一、数据库背景
1.DB(存储在磁盘上,类似于文件夹)
2.DBMS(分为两部分,一部分是服务器端软件,开机自启动,一部分是客户端软件,可视化)
3.mysql可以安装在任何操作系统上,开源
4.sql 数据库结构化查询语言(所有数据库公用的)
5.数据表(存储数据的最小单位)
第一行放字段,下面放记录
6.操作系统与文件关联(需要深刻学习的,以及服务器端软件的研究)
7.服务启动,仓库通电,进行登录,开仓库门
8.操作界面
二、常用命令(在命令行内输入)
1.看所有数据库
show databases
2.进入用数据库
use 数据库名
3.看数据库里面的数据表
show tables
4.看其他数据库里面的数据表
可以用 use 来一遍
也可以 show tables from 数据库名
5.查询当前数据表在哪一个数据库
select database()
6.创建数据表
create table 数据表名( 字段名1 数据类型1,字段名2 数据类型2);
7.看表的结构
desc 数据表名
8.从数据表中查询记录
select * from 数据表名
9.向数据表中插入增加数据
insert into 数据表名 (字段1,字段2) values(数据1,数据2)
10.更新修改数据表中的记录
update 数据表名 set 字段名=数据 where 字段=数据
11.删除数据表中的内容
delete from 数据表名 where 字段=数据
12.查询mysql版本
select version()
*按上下键可以快速切换用过的命令
13.书写规范
按F12 格式化
从上到下执行,可以选定区域执行
不区分大小写
建议关键字大写,字段用小写
不区分字符字符串,单双引号一样
每一条命令建议用分号结束
每一条命令根据需要可以缩进和换行
关键字占一行
单行注释 #
多行注释 /* */
14.sql语言之dql和dml(数据查询,增加,删除,修改)
14.1查询SELECT
先进入相应的数据库 USE 数据库名
SELECT 字段1,字段2 FROM 数据表;
#可以查常量,表达式(100*98)(字段1*字段2),函数(得到的是函数的返回值)
#查询后得到是虚拟的表格
#用* 代替所有字段
14.1.1为字段起别名(AS 或空格)
字段 AS 字段别名
字段 字段别名,
# "字段别名",引起来可以消除特殊字符
#当作整体来用,显示的结果中英文转换用
#查询的字段相同时,用别名可区别,数据表的别名一样
14.1.2去重(除去重复的数据)
DISTINCT 字段名
14.1.3加号的作用
数值型数据运算 10+2
'123'+10,把字符转换为数值,转换失败则把字符型的认为是零
null+ 。。。,结果一定为null
# ifnull(字段,字段赋值)函数判断字段对应数据是否为null,如果是则赋值
#把字段内容连接在一起
concat(字段1,字段2),数据中有null时结果为null
例如把姓和名字结合
concat(firstname,lastname) as 别名 #### 可以当作一个字段用,即带函数的返回值为字段
#不能两个select一起
##17.常见函数
隐藏细节,提高代码的复用
17.1定义
17.2调用
select 函数名(参数)from 表
叫什么,
干什么
17.3
单行函数(对一行处理),返回一个值
做处理
字符函数
length("张三丰“),一个汉字三个字节(分字符集)utf8
contact(,,,,,,)
upper(字段),大写
lower(),小写
#函数可以当作另一个函数的参数
substr(”学习数据库“,3)截取,3是索引,从3开始截取,
#索引从1开始
substr(”学习数据库“,1,2)使用两个参数,第一个是索引,第二个是字符长度,注意是字符,不是字节
instr(”字符串处理函数“,“处理”),测子串在大串的第一次出现索引,如果找不到为零
trim(“ 字符串 ”)默认去除空格
trim(“a”,from “aaaaaaa字符串aaaaaaaaaaa字符aaaa”)去除左右两边的字符a
lpad(“字符串”,13,“*”)左边填充指定长度,总长度13
rpad()右填充
replace(“字符串中国中国在公共”,“中国”,"中华")替换
数学函数
round(1.65),四舍五入
round(1.567,2)保留小数两位
ceil(1.52)向上取整大于等于,1.00 返回的还是1
floor()
truncate(1.65,1)截断,不四舍五入 1.6
mod(10,+_3)取余 1,被除数为正结果为正,被除数为负结果为负
日期函数
now()返回当前系统日期+时间
curdate()返回当前系统日期不包含时间
select now()
curtime()
获取指定的年月日小时分钟秒
year(now())as 年
month(日期)
monthname()出现月份英文
day()
hour()
minute()
second()
str_to_date("1998-3-2","%Y-%c-%d")字符日期,第二个说明字符格式
%Y/y
%m
%c
%d
%H
%h
%i
%s
data_format(now(),%y年%m月%d日)
datediff(,)前日期减去后日期
其他函数
version()
database()当前数据库
user()当前用户
流程控制函数(当作新字段)
if()
select if(条件表达式,结果1,结果2)
# 等同于一个字段,有条件的输出值
case()
#类似于switch case
case 变量/表达式
when 常量1 then 语句1/值;
。。。
else 语句n;
end
#在select语句中case当作表达式
select salary 工资 ,department_id
case department_id # 不加分号,当作表达式
when 30 then salary*2
else salary
end as 新工资
from employee;
#类似于多个if(),处理非等值判断
case #后面不加表达式
when 条件1 then 语句1/值
else 语句n/值
end
# 代替if while
17.4
#对多行处理
分组函数,传进去一组值
做统计使用,统计函数,聚合函数,组函数一样
sum() avg()
max()min() count()计算个数
select sum(salary)from employee;
max(salary)
count(salary)#非空值个数
#一次取得多个字段 select 字段 ,字段
# 多次查询 select select
#sum avg对数值进行处理的,忽略null
#max min count,可以对字符日期处理,忽略null
#与关键字distinct搭配使用
sum(distinct salary)
#count()函数的详细介绍
count(salary)
count(*)#统计非空行
count(1)#先加了一列1,统计1的个数
#效率 innodb存储引擎 count(*)和count(1)差不多
myisam存储引擎 count(*)最快
#和分组函数同一起查询的字段有限制
sum(salary) employee_id不能一起查询,能和group by 一起
#按部门查询,把大表拆分成若干个小表,对每一个小表都进行查询
group by 字段 # 最少查询两个字段,即有一个by 后面的字段
select 。。。
from 。。。
where 。。。。
group by 。。。
order by 。。。。
#复杂分组查询
先分组查询后再进行查询(把题目进行分步)
select count(*) ,department_id
from employee
group by department_id
having count(*)>2# 对形成的临时表进行再次查询和筛选,类似于where
# 不能把count(*)>2放在where后,因为那是对employee查询
select manager_id,min(salary)
#分组前筛选,原始表
#分组后筛选,分组后的结果集
分组函数一定是放在having子句中
能分组前就分组前
having 里面能用别名
#按多个字段进行分组,没有顺序要求
group by department_id,job_id;
会有多的,一致的合成一个
14.1.4条件查询(查取列对应的部分行)
WHERE 条件
#条件表达式 >= < <>
#逻辑表达式 and or not,(可以嵌套)
#模糊查询
like
例如,包含字符 a
SELECT * FROM ... WHERE .... LIKE '%a%';
#通配符不能代表null
#% 是占位符(通配符),代表前后任意多个字符,可以零个字符
# _ 某一位置字符 '___a_____b'
#通配符当普通字符使用,需要转义\,即前面加反斜杠,或指定转义字符 ESCAPE $
between and
#区间选择,包含上下区间端点处,区间端点上小下大
in
# 在多个值间 , where 字段 in(数据1,数据2,数据3),
#in 里面的数据不能用通配符,只是单纯的判断是否对应
is null
#字段=null 不能这样写(等号不能判断null,但不能用is代替=),需要用is null
is not null
# select 。。。。 from 。。。。where 。。;,先from定位,后where筛选,最后select
#逐行判断条件是否成立
#在select语句末尾当作子句
#单表查询,多表查询
安全等于 <=>
#字段<=>null
14.2排序查询
#对结果进行排序
order by 字段/表达式/别名/函数 asc /desc
#默认是升序,即由低到高
# 可以自己创建新字段查询
#长度函数 length()
# 按多个字段排序。
例如,工资和编号,一定有人的工资一样,排序操作的先后根据排序字段的先后
# order by 子句,归属于查询主句,一般放在最后,但只有limit子句放在order by后面
# 乘用*
# 多个字段之间要用逗号
#对名字排序是对应字母
14.3多表连接查询
需要从多个表中查询信息
可以from 后接上多个表名,但会出现重复数据,会两个表的数据量相乘m*n
# 实际中也是可以用的,要想象出表合成时的情景
数据怎么放在一行,需要有效的连接条件,即两个表必须有公共字段
select name ,boyname from boys, beauty
where boyfriend_id=boys.id;(关键是连接条件)
# 当两个表有公共字段时需要用表名限定一下,可以为表起别名(区别为字段取别名)简化一下,但之后要用别名
# where有连接条件后,再加筛选则需要加and 关键字,可以加分组,可以加分组筛选,可以加排序
#二表连接三表连接 where 。。。=。。。
and 。。。=。。。
and。。。
group by。。。
order by 。。。
#sql92 sql99
#sql92里面, select 。。。 from。。。,。。。where。。。 and。。。
#sql99里面 select 。。。 from 。。。 jion。。。 on。。。join。。。on。。。 where。。。
#连接条件,筛选条件
#内连接:(inner join)# inner可以省略
#查询部分表
等值
# 连接用“=”
非等值
# 一次只能用一个select,即出来一个临时表
# 区间匹配,即判断
# where salary between lower and top;
自连接
#自己连接自己,例如有两列的数据关联
# 把一个表 多次名命,变成多个对象
外连接(left/right):
#查询一个表中有,另一个表中没有的,脑子里面可以进行一次替换
#分主从表,把从表中的数据替换的主表的部分数据,有的替换,没有null
# 左外,左边是主表
#右外,右边是主表
左外
#查询一个整体表
#需要搭配 where 。。。is null,内连接不能用
右外
全外(mysql不支持)
#两个表都有对方没有的
交叉连接(cross):
m*n
######
14.4子查询/内查询
#出现在其他语句中的select语句
select。。。。。from。。。where。。。。。in(where)
可以放在from后面
#支持表子查询
#即表的连接
select后面
#支持一列一行查询
#执行顺序(先from,后where,再select),脑补,动态生成数值
where/having后面
#标量(单行)子查询/列(多行)子查询/行子查询
#子查询都会放在括号内,放在条件的右侧,代表的是数据
#多行 in/not in (等于结果中的任何一个) any/some(和某一个值比较) all(和所有值比较),单行<>,=
#(salary ,id)=(select 。。。。)行子查询
#子查询区别子句
exists后面
#表子查询
#相关子查询
#exists()判断是否有值,可以用 in 代替
#########
#一列一行查询
#列子查询
#行子查询
#表子查询
分页查询
#网页一页显示不全,即把数据表中数据分段分批显示
limit 是分页的关键字,放在查询语句的最后面
limit offset,size
#offset起始索引,从0开始,size是行数
#要显示的页数page ,每页的size,则limit (page-1)*size,size
联合查询
#union关键字
#将多次对一个表或多个表查询结果合成一个结果
#在条件中用or可代替
#两个表没有相同列时用union
#union all 不去除重复项
14.5插入
方式一
insert into 表 (列名 ,。。。)values (值1,。。。)
#值应对应相应的数据类型
#照片用null
#可以为空的字段,表中字段可以不写
#“1998-08-27"
#可以为字段设计默认值,是设计表的时候设计的
#列的顺序是可以替换的
#列数和值的个数必须一致
#可以只说表名,但默认是所有列,但值的顺序必须与表中字段一致
#支持插入多行(),(),();
#支持子查询 insert into 表名 select 。。。。。 ##select代替value
方式二
insert into 表名 set 列名=值,列名=值
14.6修改
单表
update 表名 set 列名 =值 ,列名=值 where。。。;
多表
sql92
update 表名,表名 set 列=值 where 连接条件 and筛选条件
sql99
update 表名 join 表名 on 连接条件 set 列=值 where筛选条件
14.7删除
方式一
delete from 表名 where 筛选条件
#删除的一整行
单表删除,多表删除(先连接)
#delete删除行后再插入数据,自增长列从断点处开始,删5出现6
#delete删除有返回值,几行受影响,truncate 删除没有返回值
#delete删除可以回滚,truncate删除可以回滚(面试题)
#truncate 删除后从1开始
方式二
truncate
truncate table 表名;
#对整个表删除,清除所有数据
15.sql语言之ddl(对数据库和数据表的操作)
库的管理
表的管理
创建 create
修改 alter
删除 drop
15.1库的创建
create database 库名;
#在指定的文件夹里面创建一个文件夹
#加判断增加容错,create database if not exists 库名;
15.2库的修改
直接到服务器文件夹修改名称
可以更改库的字符集
alter database 库名 character set gbk/utf8
15.3库的删除
drop database if exists 库名;
15.4创建表
create table 表名 (字段名 类型 (约束),字段名 类型 (约束)。。。)
create table book(id int,bname varchar(20),price double,author varchar(20),publishdata datetime);
#字符与字节不同
15.5表的修改
修改列名,
alter table book change column publishdata pubtime datetime;
类型
alter table book modify column pubtime timestamp;
添加列
alter table book add column annual double;
删除列
alter table book drop column annual
修改表名
alter table book rename to books;
15.6表的删除
drop table if exists book;
#show tables
#在应用程序写sql语句,可能数据库与应用不在一个电脑上
15.7表的复制(like)
create table book like books
#仅复制表结构
create table book slect * from books
#复制数据和结构,也可以复制部分数据
15.8数据类型
#限制插入数据形式
15.8.1整型
int 4个字节(默认是有符号)
无符号(无负数)设置,字段 int unsigned
#无符号时,输入负数显示0
#超出范围警告,会赋值临界值
#int(6)zerofill 设置长度,6代表的是整数的位数000123
15.8.2小数
15.8.2.1浮点型
float 4个字节
float(5,2),#2的意思是小数点后保留两位,有四舍五入 #5代表整数位数+小数位数
#省略 5,2后,根据插入值确定精度
double 8个字节
15.8.2.2定点型
dec(m,d),默认d=0
15.8.3字符型
15.8.3.1较短的文本
char
#固定长度的字符,默认是一个字符
#char(m)最多字符数,一个汉字是一个字符
varchar
#可变长度的字符,varchar(m)
#char的效率高,性别用char
枚举enum
#为值设定选项
create table book(c enum(“a“,”b“,”c"));
15.8.3.2较长的文本
text
blob
15.8.4日期型
date
datetime 8个字节
time
year
timestamp
#时间与时区有关
15.9常见约束
#代表对数据的限制,保证数据可靠
15.9.1非空约束
not null
15.9.2默认约束
default
name varchar(20) default ”我“
15.9.3主键约束
primary key
#保证值具有唯一性,并且非空
15.9.4唯一约束
unique
#可以为空,要么不写,要么唯一
15.9.5检查约束(mysql不支持)
check
15.9.6外键约束(mysql不支持)
foreign key
foreign key () reference 表名()
#用于限制两个表之间的关系,用于保证从字段的值来自主字段的值
#创建和修改表时创建约束
#列级约束 (放在单个字段后),表级约束(放在所有字段的后面)
#外键约束不能做列级约束
#除了非空和默认,都支持表级约束
#constraint 约束别名 primary key(id)表约束
#primary key(id)
#主键和唯一的对比(面试)
#唯一允许的为空只能有一个空,一个表最多有一个主键,唯一可以有多个
#primary key(id,name)联合主键,
#unique(id,name)
外键一般用主键和唯一键
15.10自增
auto_increment
# id int primary key auto_increment,自增
#需要与key合用,一个表最多有一个标识列,只能是数值型
#手动插入设置起始值
#set auto_increment_increment=3设置步长
#修改时也可以
16.sql语言之tcl(控制类语言,dcl权限)
事务:一个或一组sql语句组成一个单元,这个执行单元要么全部执行,要么全部不执行
#转账金额的变化
#回滚:会到最初的状态
#存储引擎:数据的存储技术(方法)
#show engines 查看引擎
#delete与truncate在事务使用时的区别
16.1事务的创建
隐式事务:
insert update delete
显式事务
#开启和结束标记,自动提交功能禁用
#set autocommit=0(当前会话)
#set autocommit=0,start transaction开启事务
#sql语句(对表的处理)
#结束事务
#commit提交事务
#rollback回滚事务
#最后要么选提交要么选回滚
#访问相同数据
#需要设置隔离, repeatable read
16.2视图
虚拟存在的表(由查询结果组成的表,类似于子查询),和普通表一样使用
应用场景:
多个地方用到同样的查询结果
查询结果用sql语句写比较复杂
# 本质是对经常使用的sql语句进行封装,类似与函数
16.2.1创建视图
create view 视图名
as
查询语句
##重用sql语句
##不必知道细节
##提高数据安全性
16.2.2视图的修改
create or replace view 视图名
as
SQL语句
##或
alter view 视图名
as
SQL语句
16.2.3删除视图
drop view 视图名;
#类似与对表的处理
16.2.4查看视图结构
desc 视图名
show create view 视图名
#查看细节代码
16.2.5视图数据的更新
插入
#也可以用insert对视图插入数据
#但同时也对原始表插入了
更新
删除
#均对原始表更改,不安全,故需要对视图添加只读权限
#有一些视图是不能增删改的,分组函数,distinct having union,常量视图,包含子查询,join
#视图在物理空间中保存逻辑不保存数据
17.变量的介绍