(一)MySQL基础

 

一.实操教程

基础介绍:https://www.runoob.com/mysql/mysql-tutorial.html

安装部署:https://www.cnblogs.com/Agent9527/p/13194128.html

命名规范:https://cloud.tencent.com/developer/article/1054482

1.创建数据库

create databases 库名;  # 所有mysql语句小写默认为大写,一定要小写时可加个双引号

普通用户创建

[root@host]# mysqladmin -u root -p create 库名
Enter password:******

2.切换数据库

use 库名;

 3.创建表

create table [if not exists] 表名
(
字段名1 数据类型 [列级完整性约束条件] [默认值],
[字段名2 数据类型 [列级完整性约束条件] [默认值]],
[... ...],
[表级完整性约束条件]
)[engine=引擎类型];

3.1 [ ]

  解释:根据情况选。

  " [ ] "为可选框

3.2 字段名

  解释:根据命名规范给列取名。

  由编译者自命名

3.3 数据类型

  解释:插入该列的元素为指定的类型

  数值类型【只列现学常见,不排除后续更新】

    int[(m)][unsigned][zerofill]:普通大小的整数。带符号范围(-2 147 483 648,2 147 483 647)无符号范围(0,4 294 967 295)。

    float(m,d):m表示最大长度,d表示小数位数。float(5,2) 浮点数最大长度为5位数,小数部分为2位。范围无符号0.0 ~99999.9有符号-99999.9~99999.9

  日期和时间类型  

    date:范围‘1000-01-01’到‘999-12-31’,MySQL以‘YYY-MM-DD’格式显示DATE值。

    datetime:日期和时间的组合。范围‘1000-01-01 00:00:00’到‘9999-12-31 23:59:59’,MySQL以‘YYY-MM-DD HH:SS’格式显示datetime值。

    time:时间类型,范围是‘-838:59:59’到‘838:59:59’。MySQL以‘HH:MM:SS’格式显示time值。

  字符串类型

    char[(m)]或character[(m)]:固定长度的字符数据类型,m的范围是0~255,用于保存文本信息。

    varchar(m):可变长的字符数据类型,m的范围是0~65 535。

3.4 列级完整性约束条件

  解释:制定一系列条件,在插入数据时是否满足该列的制定的条件。这就是约束条件

  primary key主键:每个表只能定义一个主键,主键值必须唯一标识表中的每一行,且不能为 NULL。注意:当主键是由多个字段组成时,不能直接在字段名后面声明主键约束。这用到联合主键:primary key(列1,列2)放表级完整性约束条件位置,所谓的联合主键,就是这个主键是由一张表中多个字段组成的。约束就是多行数据中字段1、字段2的值不能同时一样。

  unique候选键:能唯一标识表(关系)中行(元组)的列(属性)。AB(行)元素可重复(列)中元素不能重复。

  foreign key外键:用于多表外连接时的标识列,同时存在表1和表2中,它不是表1的主键,而是表2的主键,就可以说他是表1的外键。

  unsigned:禁用负值,用此类型可以增加数据长度

  auto_increment自增属性:每个表只能定义一个auto_increment,并且必须在该列定义主键或候选键约束。默认为1,当插入null数据或数值0时默认1、0+1。

  null:元素可以为空值。注意这里空串也属于一个有效的值。例:‘’ 中间无字符。

  not null: 该列元素值不能为空。不设默认null。

  default默认值:  指在向数据表中插入一行数据时没有给其中默认的一列赋值。那么该列就会默认为default指定的值。default '汉'。

3.5 引擎类型

  解释:存储引擎就是如何存储数据,如何为存储的数据建立索引和如何更新、查询数据等技术的实现方法。可参考https://www.cnblogs.com/yinjw/p/11831702.html学习

  命令:show engines; 可以查看系统支持的引擎类型和默认引擎。其中InnoDB是系统默认的引擎,支持事务处理,是事物型数据库的首选引擎。

4.查看表

4.1查看表名称

show tables [{form | in} 库名];  使用{form | in}可显示非当前数据库中的数据库表名称

4.2查看数据表基本结构

desc 表名;

4.3查看数据表详细结构

show create table 表名;

5.增-插入数据

5.2方法一、不指定数据字段

insert intovalues('数据1',null,'数据3','数据4'...);

5.3方法二、指定字段

insert into tbs(字段1,字段2,字段3,字段4) values('数据1','数据2','数据3','数据4');  # 指定字段主键必须是排第一

a.同时插入多条数据

insert into 表(字段1,字段2,字段3) values('数据1','数据2','数据3'),('二行数据1','数据2','数据3')...('n行数据1');

b.插入查询数据

insert into 表(字段2,字段2,字段3) select 字段1,字段2,字段3 from 表;

c.使用replace插入数据

replace into 表('主键字段1','字段2','字段3') values('数据1','数据2','数据3');   # 即使有主键约束也可以覆盖原来的数据,某个字段定义外码时会出错。

6.删数据

6.1删除特定数据

delete from 表名 where 字段名='指定数据';

6.2带子查询删除

delete from 库.表1 where 字段=(select 字段1 from 表2 where 字段2='程序设计');   # 当删除数据的表与设置删除条件的表不相同可以使用

6.3删除所有数据

delete from 库.表;    # 表仍存在 

a.使用truncate删除数据

truncate 库.表;    # 直接删除原来的表并重新创建一个新表,速度比delete快

7.改数据

a.修改特定数据记录

updateset 字段2='修改数据1',字段3='修改数据2', where 字段1='指定数据1';

b.修改所有数据记录

update 库.表 set 字段1=字段1*数值;    # 修改字段1的全部值;字段1类型必须是数值类型可进行+-*/

c.带子查询的修改

update 库.表1 set 字段1='0' where 字段2=(select 字段2 from 表2 where='指定条件');    # 字段1满足字段2的条件时设为 0

8.查数据

总查询结构

select [all | distinct | distinctrow] 字段1 [as] 字段1别名,[字段2]    # 查 [所有、去重、去重] 指定字段1 指定字段2
from 表1或视图1,[表2或视图2]    # 从表1或视图1,表2或视图2
[where<条件表达式>]    # 设置筛选条件
[ group by 字段1 [having<条件表达式>] ]    # 指定字段1分组,having分组结果设置筛选
[ order by 字段2 [asc | desc] ]   # 根据字段2升序降序 
[ limit [m,] n ]    # 从第m+1行开始显示,共显示n行

a.单表查询

a1.select 指定字段

select 字段1,字段2,字段3...n字段 from 表名;

a2.select 去重后的字段

select distinct 字段1,[字段2],...[n字段] from 表名;

a3.select 所有字段

select * from 表名;

a4.select 经过计算的值

select 字段1,字段2,'新增字段3', year(now()-year(1998-11-13))
from 表名;    # 新增字段3中在表中是不存在的,now()获取当前日期+时间减去当前的年月时间。再用()括号按年取得到年龄

a5.select 字段的别名

注意:另外字段不能出现where中

select 字段1 as 1,字段2 2 from 表名;  # 将字段as取为更短更通俗的名称as可选可不选

a6.where 比较大小的查询

比较:>、<、>=、<=、=、[ !=、<> ]、!>、!<、NOT+含比较运算符的公式例:"NOT 字段 = " 与 "字段!=" 是一样的。

select 字段1,字段2
from 表名
where 字段1>=22;    # 查字段1大于等于22的值

a7.where 带between...and关键字的范围查询

select 字段1,字段2
from 表名
where 字段2 [not] between 2 and 10; # 无not参数,值在范围[2,10]闭区间内;有not参数,那么这个值不在[2,10]闭区间内

a8.where 带in关键字的集合查询

select *
from 表名
where 字段2 [not] in('北京','天津','上海');    # 查字段2里边包含北京、天津、上海的数据。用了not那么就是不包含的意思

a9.where 带like关键字的字符串匹配查询

模糊搜索:%:包括0以及任意长度的字符。另外不能匹配空值null  _:代表任意单个字符

要查询的元素本身包含%_:需要用到escape换码字符。例如:信息系统_分析与设计

select 字段1,字段2
fromwhere 字段1 [not] like '王%';    # 查询字段1中含"王"的数据
where 字段1 [not] like '%#_%' escaps '#';  # 将#后面的"_"转换为普通字符

a10.where 正则表达式

select 字段1,字段2
from 表名
where 字段1 [not] [regexp|rlike] '正则表达式';    # 匹配字段1含系统等价于 like '%正则表达式%' 

<字符串>:匹配包含指定字符串的文本。例 'fa',匹配:fan,afa,faad。拓展" | " : 例'fa|fb|fc',匹配:fadi,sfbxs,dsfca

[ ]:匹配[ ]中的任何一个字符。例 '[ab]',匹配:bay,big,app

[^]:匹配不在[ ]中的任何一个字符。例 '[^ab]',匹配:desk,coll,six

^:匹配文本的开始字符。例 '^b',匹配:bed,bridge,book

$:匹配文本的结尾字符。例 'er $',匹配:driver,worker,farmer

.:匹配任意单个字符。例 'b.t',better,bit,bite

*:匹配0个或多个 * 前面指定的字符。例 'f*n',匹配:fn,fan,begin

+:匹配+前面的字符1次或多次。例'ba+',匹配:bat,baa,battle,bala

{n}:匹配前面的字符至少n次。例'b{2}',匹配:bb,bbbb,bbbbbbb

a11.where 带 is null 关键字的空值查询

select * fromwhere 字段 is null;  # 查看字段为NULL的数据

a12.where 带andor的多条件查询

select 字段1,字段2,字段3
fromwhere (字段1 >or 字段1 < 值) and 字段3==值;

a13.对查询结果进行ASC | DESC 排序

order by 字段1 [ asd | desc ]:对查询结果集中记录,按指定字段1升降序

select *
fromorder by 字段1 [ ASC |DESC ];  # 升降序

a14.限制查询结果的数量

select 字段1,字段2,字段3
fromorder 字段1
limit n,m;  # 从第n+1行开始显示;m表示显示的行数

b.聚合函数查询

select 函数 from 表;

函数说明

注意:distinct为去重,all为默认值

count([ distinct | all ] * ) : 统计数据表中的行数

count([ distinct | all ] <列> ) : 统计数据表的一列中值的个数

max([ distinct | all ] <列> ) : 求数据表的一列值中的最大值

min([ distinct | all ] <列> ) : 求数据表的一列值中的最小值

sum([ distinct | all ] <列> ) : 计算数据表的一列值中的总和

avg([ distinct | all ] <列> ) : 计算数据表的一列值中的平均值

c.分组+聚合查询

说明:把指定的A列中相同元素进行分组;求B列count\sum\min\avg...值

select 字段1,函数1(字段2),函数2(字段3)
from 表1
group by 字段1  # 分组
having [ 函数1(字段2) | 函数2(字段3) ] 操作符 值;  # 筛选操作符:><==!=<=>=

d.连接查询

说明:查询涉及到两以上,称之为“连接查询”

d1.交叉查询

交叉查询又称“笛卡儿积”。原理:返回的记录行数等于两张表行数的乘积,其连接结果会产生一些没有意义的记录

[select * from 表1 join 表2]或[select * from 表1,表2];

d2.内连接

内连接[inner join]...[on]:在交叉连接基础上设置条件过滤一些没有意义的数据。

select 表1.字段1,表2.字段4,表3.字段6
from 表1 [inner join] 表2 [inner join] 表3
on 表1.字段1=表2.字段1 and 表2.字段2=表3.字段2
and 字段4="值";

或 用","连接

select 表1.字段1,表2.字段4,表3.字段6
from 表1,表2,表3
where 表1.字段1=表2.字段1 and 表2.字段2=表3.字段2
and 字段4="值";

1.等值连接

根据相同元素的AB列将表1、2相连。当比较运算符“ = ”时表示等值连接,使用其他运算符为非等值连接

select * from 表1 inner jion 表2 on 表1.字段1=表2.字段1;

2.自连接

说明:某个表对自身进行连接称为 “自连接”

注意:使用自连接时需要为表指定多个不同的别名,对所有查询的字段得用引用的表名限定,否则select操作会失败

需求:我要查与这门课程分数相同的其他课程信息。根据表b指定课程作为条件,去查询表a中连接相同的分数

select a.*
from 表1 a join 表1 b
on a.字段1=b.字段1  # 连接列 
where b.字段2=课程;  # 条件必须在b表中指定条件查询

或用 “,

select a.*
from 表1 a,表1 b
where a.字段1=b.字段1
and b.字段2=课程;

3.自然连接

注意:只有两表列名相同的同时才可以使用,否则返回的是笛卡尔积

select a.字段1,a.字段1
from 表1 a natural join 表1 a;

d3.外连接

说明:外连接分为左外连接、右外连接,也称左连接;右连接

1.左连接

说明:返回左边的基表所有记录,并用这些记录与右边参考表中的记录进行匹配,如果左表在右表中没有匹配的记录,那么就和右边的“万能行”进行连接,即右表对应的字段值为空值NULL

select *
from 左表 a left join 右表 b
on a.字段1=b.字段2;

2.右连接

说明:与左连接相反

select *
from 左表 a right join 右表 b
on a.字段1=b.字段2;

e.子查询

a.带IN的子查询

b.带比较运算符的子查询

c.带EXISTS关键字的子查询

f.联合查询

 

posted @ 2020-12-13 19:30  九五二七_唐伯虎  阅读(168)  评论(0编辑  收藏  举报