2020-10-18

最终是数据库操作和数据库设计

一、数据库背景

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.变量的介绍

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,063评论 6 510
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,805评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,403评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,110评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,130评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,877评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,533评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,429评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,947评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,078评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,204评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,894评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,546评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,086评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,195评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,519评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,198评论 2 357