MySQL语法

(一)
- 注意事项:
1:大小写:不严格区分大小写,默认大写为程序代码,小写为程序员写的代码
2:语句结束符:每个语句都以;或者\g结束
3:类型:强制数据类型,任何数据都有自己的数据类型

  • 库操作
    1.显示所有的库:show databases;
    2.创建库:create database [if not exists] db_name,重复创建会报错, 可以加上if not exists;
    3.删除库:drop database [if exists] db_name, 如果不知道数据库是否存在,记得加if exists;
    4.进入数据库:use db_name;

  • 表操作
    1.显示所有的表:show tables;
    2.创建表:create table [if not exists] tb_name (create definition…/字段值1,类型1,字段值2,类型2.。。), 重复创建会报错, 可以加上if not exists;
    3.显示创建表的信息:show create table tb_name;
    4.删除表:drop table tb_name;

  • 插入数据
    1.指定字段插入: INSERT INTO tb_name(field_name) VALUES (field_values);
    2.全字段插入: INSERT INTO tb_name VALUES (all_values);
    3.多行插入: INSERT INTO tb_name(field_name) VALUES (value_1), (value_2), …;

  • 查询数据
    1.指定字段查询:SELECT field_names FROM tb_name;
    2.全字段查询: SELECT * FROM tb_name;
    3.带条件的查询: SELECT field_names FROM tb_name WHERE conditions;

  • 修改数据
    1.修改所有数据:UPDATE tb_name SET field_1=value_1
    2.修改多个: UPDATE tb_name SET field_1=value_1, field_2=value_2 …;
    3.修改满足条件的数据: UPDATE tb_name SET field_1=value_1 WHERE conditions;

*注意:一定要写where条件,不然会修改表中全部数据

  • 删除数据
    1.删除表中所有数据:DELETE FROM tb_name;
    2.删除表中满足条件的数据: DELETE FROM tb_name WHERE conditions;

注意:一定要写where条件,不然会删除表中全部数据

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
(二)

- List item

  • order by`

 SELECT columns FROM tb_name ORDER BY col [asc/desc] ;

正序:asc(默认)
倒序:desc

  • limit
SELECT columns FROM tb_name  LIMIT start, count ;

LIMIT count;
LIMIT start, count; 从start+1行开始算起,count条记录

  • distinct(去重)

 SELECT DISTINCT FROM tb_name;
  • 模糊查询 like %
  • 任意多个字符: %
  • 任意一个字符: _
  • 范围查询
  1. 连续范围: BETWEEN a AND b
    a <= value <= b
  2. 间隔返回: IN
    a in (10, 20, 30 […])

在这里插入图片描述

  • 常用聚合函数
    1:统计个数:COUNT(column)
    2:求和:SUM(column)
    3.最大值:MAX(column)
    4.平均值:AVG(column)
    5.最小值:MIN(column)
    6.列出字段全部值:GROUP_CONCAT(column)

group_concat(column) :就是根据column组合成一个单元格,
select group_concat(name order by age) as name; 根据age排序将名字组合成一个单元格,
可用substring_index来拿取第几个数据,以逗号分隔的第一个:
select SUBSTRING_INDEX(GROUP_CONCAT(stuName ORDER BY score ASC),’,’,1),

  • 分组查询(group by)
    1.Select 字段 from 表 group by 字段;
    2.Select 字段,count() from 表 group by 字段
    eg.SELECT species, COUNT(
    ) FROM pet GROUP BY species;
  • 聚合筛选(having)
    1.Select 字段1 from 表名 group by 字段1,字段2 having 字段2>=80;
    对于内容的限制
    2.SELECT columns FROM tb_name LIMIT start, count ;
    对于行数的限制

假如说
一个查询语句中同时包含了别名(as),聚合函数, where, having,
那么他们的执行顺序: where->聚合函数和别名->having

  • 子查询

  • 将一个查询的结果留下来用于下一次查询 ( select 中嵌套 select )
    *嵌套的子查询必须始终出现在圆括号内

例子:
#求出学生的平均年龄
select avg(age) from students;
#查找出大于平均年龄的数据
select * from student where age > 19.7273;
#将求出的平均年龄的SQL语句用于查找大于平均年龄的语句中
select * from students where age > (select avg(age) from students);

  • 连接查询

1.内连接(inner join)->无条件内连接:

  • 无条件内连接,又名交叉连接/笛卡尔连接
  • 第一张表种的每一项会和另一张表的每一项依次组合

Mysql> select * from student [inner] join scoren,

左右两个表全部数据依条匹配。
a->,a->B,a->C…

- 有条件内连接:

  • 在无条件内链接的基础上,加上一个on子句
  • 当连接的时候,筛选出那些有实际意义的记录来进行组合
 Mysql> select * from student inner join scoren
         -> on dept_id = id;

2.外连接( {left | right} join )

  • 左外连接: (以左表为基准)
    两张表做连接的时候,在连接条件不匹配的时候
    留下左表中的数据,而右表中的数据以NULL填充
 mysql>  select * from  student  left join  department
         ->  on dept_id= d_id;
  • 右外连接: (以右表为基准)
    对两张表做连接的时候,在连接条件不匹配的时候
    留下右表中的数据,而左表中的数据以NULL填充
 mysql>   select * from  student right join department
         ->   on dept_id= d_id;

(三)

- 表结构修改(alter)
1.修改表名:alter table 表名 rename to 新表名;
2.修改字段名:alter table tb_name change name new_name data_type;
3.修改字段类型:ALTER TABLE tb_name MODIFY field_name data_type;
4.添加字段:ALTER TABLE tb_name ADD [COLUMN] field_name data_type;
5.删除字段:ALTER TABLE tb_name DROP [COLUMN] field_name;

- 约束条件
约束是一种限制,通过对表中的数据做出限制,来确保表中数据的完整性,唯一性

在这里插入图片描述

- 默认约束(default)

CREATE TABLE tb(
    id int default ‘a’ ,
    name varchar(20)
);

插入数据的时候,如果没有明确为字段赋值,则自动赋予默认值,
在没有设置默认值的情况下,默认值为NULL

- 非空约束(not null)

CREATE TABLE tb(
    id int not null,
    name varchar(20)
);

限制一个字段的值不能为空,Insert的时候必须为该字段赋值,空字符不等于NULL

- 唯一约束(unique key)

CREATE TABLE tb(
    id int unique key,
    name varchar(20)
);

限制一个字段的值不重复,该字段的数据不能出现重复的,确保字段中值的唯一

- 主键约束(primary key)

CREATE TABLE tb(
    id int primary key,
    name varchar(20)
);

通常每张表都需要一个主键来体现唯一性,每张表里面只能有一个主键
主键 = 非空 + 唯一

主键可以约束多列,比如:
比如一个学生表,里面有班级,学号,姓名等字段,而每个班的学号又是独自编排的,回那就可以把班级和学号联合起来作为一个主键。例如:3班的11号,这样就可以唯一地标识一个学生。
这些列的每一行没有重复的组合

- 自增长约束(auto_increment)

CREATE TABLE tb(
    id int auto_increment,
    name varchar(20)
);

自动编号,和主键组合使用,一个表里面只能有一个自增长,auto_increment 要求用在主键上,乱序插入的数字会自动排序

- 外键约束(foreign key)
保持数据的一致性,我有的你一定有, 你没有的, 我绝对没有

  1. B表中的id_b字段,只能添加 id_a中已有的数据。
  2. A表中id_a 被参照的数据, 不能被修改和删除
CREATE TABLE a(
    id_a int primary key,
    name varchar(20)
);

CREATE TABLE b(
    id_b int primary key,
    name varchar(20),
    foreign key (id_b) references a(id_a)
);

- 表关系

一对一表
一对多表
多对多表

以下为选课系统例子:

在这里插入图片描述

- 一对一关系(学生详情)
举例,学生表中有学号、姓名、学院,但学生还有些比如电话,家庭住址等比较私密的信息,这些信息不会放在学生表当中,会新建一个学生的详细信息表来存放。
这时的学生表和学生的详细信息表两者的关系就是一对一的关系,因为一个学生只有一条详细信息。用主键加主键的方式来实现这种关系。

#建立详细学生表:
create table student_details(
    id int primary key,
    sex varchar(20) not null,
    age  int,
    address varchar(20) comment '家庭住址',
    parents varchar(20),
    home_num varchar(20),
    foreign key (id) references student(s_id)
);

一对一 :
用外键的方式,
把两个表的主键关联

- 一对多关系(学生所在学院)

举例,通常情况下,学校中一个学院可以有很多的学生,而一个学生只属于某一个学院。
学院与学生之间的关系就是一对多的关系,通过外键关联来实现这种关系。
##创建学院表
create table department( 
   d_id int primary key auto_increment,      # 学院id
   d_name varchar(20) not null    	                # 学院名
);

##创建学生表
create table student(
   s_id int primary key auto_increment,      # 学生id
   s_name varchar(20) not null,                     # 学生名字
   dept_id int not null,		               #  所属学院 id
    foreign key(dept_id) references department(d_id)   #外键
);

insert into department values(1,'外语学院'),(2,'计算机学院');
insert into student values(1,'佳能',2),(2,'lucky',1);

- 多对多关系(学生选课)

举例,学生要报名选修课,一个学生可以报名多门课程,一个课程有很多的学生报名,那么学生表和课程表两者就形成了多对多关系。
对于多对多关系,需要创建中间表实现。
#建立课程表:
create table cours(
    cours_id int primary key auto_increment,
    cours_name varchar(20) not null 
);

Create table student(s_id int primary key auto_increment,s_name varchar(20) not null);

insert into student values(1,'qiye'),(2,'gg');

# 选课表  (中间表)
create table  middle(
    s_id int,       	 #用来记录学生id
    cours_id int,  	 #用来记录 课程id
    primary key(s_id,cours_id),                # 联合主键 
    foreign key(s_id) references student(s_id),       #  关联学生id
    foreign key(cours_id) references cours(cours_id)  # 关联 课程id
);

insert into cours values (1, ’python编程’),  (2, ’大学英语’),  (3, ‘音乐鉴赏’);

insert into `select` values(1,3);   表示学号为一的同学选择了音乐鉴赏这门课程

  • insert into select values(1,3);
    (s_id,cours_id);
    s_id->student(s_id)
    cours_id->cours(cours_id)

关于主键和外键的一点说明:

给表格设置了外键后,以为select打开后可以直接显示2个表的关联,但是并没有,显示时还是需要添加where/having筛选条件,外键只是2个表的内部约束关系,数据一致性,不会直接显示出来,体现在以下几个方面:
1:从表增加修改涉及到外键值,增加的外键值不是主表的主键值便阻止增加,修改的新值不是主表的主键值便阻止修改
2:主表删除行/修改主键值,其主键值/旧值在从表里存在便阻止删除(要想删除/修改,必须先删除/修改从表的相关行);

从表设置了外键关联到主表的主键,从表隶属于主表,主表若想删除主键或者修改成别的主键值,若此主键值在从表存在,删除了就没有了一致性,所以需要先从从表上删除此外键值,才能删除主表的此主键值;同理修改的新的主键值是否从表已经存在,若无,得先修改从表的外键值,再来操作主表,才能体现一致性。
同理从表的操作。

- 此练习有助于理解区分设置外键后多个表之间的关系:
把本章节表关系的几张表建立出来,
1.然后插入数据,
2.然后都查询出来,
3.然后删除表,

建立3个表,学院表,课程表,学生表,
请看下图的操作顺序,顺序颠倒的话就会报错(外键原理)。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值