你的位置:首页 > 信息动态 > 新闻中心
信息动态
联系我们

mysql

2021-12-5 22:48:53

初步使用数据库

  1. 重启数据库

    service mysqld restart

  2. 、进入数据库,输入密码

    service mysqld restart

  3. 显示所有数据库

    show databases

  4. 创建数据库

    create database 数据库名

  5. 使用数据库

    use 数据库名

  6. 查看数据库所有的表

    show tables

  7. 删除数据库

    drop database 数据库名

  8. 显示表结构,查看数据库引擎

    desc 表名

    show create table 表名

  9. 查看当前使用的表属于那个数据库

    select dataabse ()

  10. 删除表

    drop table 表名

创建表

sql语句

create table 表名(

field datatype DEFAULT 默认值 COMMENT 注释,

字段名 类型,

primary key(字段名)

)

创建表时有三类信息必须明确写出:表名、字段名、字段类型 其他信息可以不明确写出,不写出时,使用默认设置

常见的数据类型

  1. 字符串类型(varchar)
    • 定长字符串:长度是在创建表时指定的。 比如邮政编码,是6位的字符。 如果向一个6位的定长字符串类型的字段,只插入2位字符, 则数据库默认会在2个字符末尾补4个空格,以补足6位。
    • 不定长字符串创建表时指定一个最大长度
  2. 数值类型
    • 整数
    • 小数
  3. 日期类型
  4. 二进制类型

默认值(DEFAULT )

  • 表中所有的字段都可以设置默认值
  • 默认值的数据类型必须与字段保持一致
  • 除主键字段外,建议其他所有字段都设置默认值
  • 提高使用性能;如果一个字段不赋值,那么这个字段就会被赋NULL值, 会影响使用性能

主键(primary key)

  • 一个表只能有一个主键;
  • 一个表中的所有行,主键字段的值不允许重复;主键的作用是保证数据的唯 一性和完整性;
  • 主键字段可以为多个,甚至是表中所有字段一起做主键;多个字段一起做主 键时,我们称为联合主键或重复主键;不过一般来说不会超过5个,否则会影 响操作性能;
  • 允许为NULL的字段不能做主键字段;主键不应包含动态变化的数据
  • 永远也不要更新主键的值

NULL

  • 表示一种“不知道”、“不确定”的状态
  • 每个字段,要么是NOT NULL,要么是可为NULL。创建表时,可以不指定, 默认情况下是可为NULL,也就是可以不包含值,尽量避免将字段设置为可为NULL。
  • 如何判断某个字段的值是否为NULL?

示例

create table teacher(teacher_id varchar(20) not null,

teacher_name varchar(50) not null default “”,

gender varchar(10) null,

primary key(teacher_id)

)comment ‘老师’;

image-20211106150626046

操纵表

  1. 更新表名:使用rename table关键字。

    rename table 旧表名 to 新表名;

  2. 更新字段名

    alter table 表名 change 旧字段名 新字段名 字段类型

  3. 更新字段类型

    alter table表名 modify 字段名 新字段类型;

  4. 删除字段默认值

    alter table 表名 alter column 字段名 drop default;

  5. 设置主键,可以设置多个字段为联合主键

    alter table 表名 add primary key (主键字段列表);

  6. 删除主键

    alter table 表名 drop primary key

  7. 新增字段

    alter table 表名 add column 新字段名 字段类型及其他属性

  8. 删除字段

    alter table 表名 drop column字段名;

  9. 清空表内容(表名和字段还在,等于先drop,再create表名)

    truncate table 表名

  10. 复制表结构

    create table 表2 like 表1

插入数据

  1. 插入整行字段:关键字INSERT INTO

    insert into表名 values (行数据,值的顺序与表中的字段顺序必须一致)

    insert into表名(字段列表) values (对应字段列表的数据)//没有给出的字段要可以为null

  2. 借助其他表数据插入

    insert into 表2 selelct * from 表1

  3. 克隆表(结构和数据都复制)

    selelct * into 表2 FROM 表1

    create table 表2 selelct * from 表1

查询数据

  1. 查询指定(所有)列

    select 字段列表 from 表名

    select * from 表名

  2. 将查询结果排序

    select 字段列表 from 表名 order by 字段1 ASC/DESC,字段2 ASC/DESC,…

  3. 限制返回结果

    • 返回回前几行

      select top 10 字段列表 from 表名;

      select 字段列表 from 表名 limit 10;

    • 返回中间几行(从第N行开始,返回M行记录,这里的第N行,是从0开始算起的))

      select 字段列表 from 表名 limit M offset N

      select 字段列表 from 表名 limit N,M

  4. 对字段数据去重

    select distinct 字段 from表名

过滤数据

  1. select 字段列表 from 表名 where 过滤条件;

    过滤条件一般由要过滤的字段、操作符、限定值三部分组成

  2. 操作符

    image-20211106173914497

  3. 使用通配符过滤数据:关键字like

    image-20211106174634778

    示例

    select * from student where student_name like “梁**%**”

    select * from student where student_name like “彭**_**晏”

    select * from student where student_name like “胡**[歌军]**”

  4. 组合WHERE子句

    image-20211106175517989

    示例

    所有姓梁的男同学

    select * from student where student_name like “梁%” and gender = ‘男’

    所有姓梁的同学或男同学

    select * from student where student_name like “梁%” or gender = ‘男’

创建新的输出字段

  1. 字段拼接:关键字concat

    image-20211106215926485image-20211106215954757

  2. CASE WHEN逻辑转换

    image-20211106222813281

    case when 条件表达式1 then 结果表达式1

    ​ when 条件表达式2 then 结果表达式2

    ​ …

    ​ 条件表达式N then 结果表达N

    else else结果表达式

    end

    from 表名

    • 没有else部分时,如果所有条件表达式都不满足,则返回NULL。 每一个case when都应该有else分支!!

函数

  1. 数值函数

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fFBMmdVp-1638715482054)(C:\Users\Lenovo\AppData\Roaming\Typora\typora-user-images\image-20211106225515004.png)]

  2. 文本函数

    image-20211106225542092image-20211106225617074

  3. 日期和时间函数

    image-20211106225651686image-20211106225704110

汇总统计及group by

  1. 聚集函数

    • 计数count(字段),不会忽略值为NULL的行
    • 和sum,忽略值为NULL的行
    • 最大值max,忽略值为NULL的行
    • 最小值min,忽略值为NULL的行
    • 平均值avg,忽略值为NULL的行
  2. 分组group by

    image-20211106230633476

    group by将NULL值的行,分到同一组计算统计值

  3. 过滤分组结果:having

    select 字段 from 表名 group by 分组字段 having 分组要达到的条件表达式;

  4. where和having的区别

    • where过滤行,再group by前执行
    • having过率分组,再group by后执行
  5. 排序分组结果(集合的无序性):关键字order by

    select 字段 from 表名 group by 分组字段 order by 字段(按哪个字段来排序) AES/DESC(排序方法);

  6. select子句顺序image-20211106235711914

select

​ 字段

from 表名

where 行过滤条件

group by 分组字段

having 分组要达到的条件表达式

order by 字段(按哪个字段来排序)AES/DESC(排序方法)

方便的子查询及EXISTS

示例

获取姓牛的老师教了哪些学生?

SELECT student_id,student_name FROM student

WHERE teacher_id IN ( SELECT teacher_id FROM teacher WHERE teacher_name like ‘牛%’);

SELECT student_id,student_name FROM student a

WHERE EXISTS ( SELECT 1 FROM teacher b WHERE a.teacher_id = b.teacher_id AND b.teacher_name like ‘牛%’ )

组合查询

union:合并结果集后去除重复记录

union all:合并结果集后不去除重复记录

image-20211107095435952

image-20211107095711427

  • 待合并的结果集的字段数量必须一致
  • union all 与union的执行优先级一致,谁在前谁先执行;
  • 不可以使用括号改变执行优先级

连表查询

关键字:on 连接条件

image-20211107104737726

  1. 交叉连接cross join ,实现笛卡儿积

    image-20211107105001069

  2. 内连接inner join(inner 可以省略)

    不加条件时相当于一个笛卡儿积

    image-20211107110021579

    image-20211107105440877

  3. 全外连接full out join,MySQL不支持

  4. 左外连接(只想要左表字段不为NULL的数据, 而不需左表字段为NULL的数据)

    image-20211107111902467

  5. 右外连接(只想要右表字段不为NULL的数据, 而不需右表字段为NULL的数据)

  6. 连表的执行步骤

    select * from student S

    left outer join teacher T

    on S.teacher_id = T.teacher_id

    where S.S.teacher_id = ‘S0001’;

    • 参与连接的两个表做笛卡尔积;
    • 根据ON后的连接条件筛选笛卡尔积的结果;
    • 补充左表(LEFT JOIN)或右表(RIGHT JOIN)不满足连接条件的 数据(INNER JOIN内关联时无此步骤)
    • 根据WHERE后的过滤条件筛选第三步的结果
  7. 外连接时,on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。而where条件是在临时表生成好后,再对临时表进行过滤的条件

    image-20211107123709722

  8. 多表连接,就是第一张表与后面的表依次连接,重复执行表连接的步骤

    select * from student S inner join teacher T on S.teacher_id = T.teacher_id

    inner join class C on S.class_id = C.class_id

    S表和T表做内连接的结果与C表做内连接

  9. 非唯一键连接

    select S.student_id,S.student_name, T.teacher_id,T.teacher_name

    from student S inner join teacher T on S.teacher_id = T.teacher_id

    如果teacher表有重复的数据,将返回重复的数据

更新和删除数据

  1. 更新全部数据

    update 表名 set 字段名=新值

  2. 更新部分数据,多字段

    update 表名 set 字段名1=新值1,字段名2=新值 … where 限定条件;

  3. 根据其他表更新数据

    update 表名 set 字段名=(子查询) where 限定条件;

  4. 删除全部数据

    delete from 表名

  5. 删除部分数据

    delete from 表名 where 限定条件;

  6. 根据其他表删除数据

    delete from 表名 where 子查询

约束

  1. 主键约束:唯一标识表中每一行的一个或多个字段(列)

    image-20211107144301218image-20211107144312409

  2. 外键约束:约定某一列的值必须出现在另一个表的主键中,就是拿别的表的主键当自己的外键

    image-20211107144403693image-20211107144435361

  3. 唯一约束:约定某一列或某几列的值在表中不重复

    image-20211107144503722

    image-20211107144521749

  4. 检查约束 :约定某一列的值必须满足指定的条件

    image-20211107144652867

  5. 非空约束:约定某一列的值不可为NULL

    image-20211107144723076

WHNp-1638715482102)][外链图片转存中…(img-MKb1H33j-1638715482103)]

  1. 外键约束:约定某一列的值必须出现在另一个表的主键中,就是拿别的表的主键当自己的外键

    [外链图片转存中…(img-odqstHs2-1638715482105)][外链图片转存中…(img-mufHlujK-1638715482106)]

  2. 唯一约束:约定某一列或某几列的值在表中不重复

    [外链图片转存中…(img-4E0jnoy5-1638715482108)]

    [外链图片转存中…(img-GT5Zi9cc-1638715482110)]

  3. 检查约束 :约定某一列的值必须满足指定的条件

    [外链图片转存中…(img-pCsLOqZS-1638715482111)]

  4. 非空约束:约定某一列的值不可为NULL

    [外链图片转存中…(img-Ud0kuKIH-1638715482113)]