5.1.2SQL语句实例

总目录:https://blog.csdn.net/qq_41106844/article/details/105553392

数据库子目录:https://blog.csdn.net/qq_41106844/article/details/105553331

 

 

 

Yuan先生的数据库基础:https://www.cnblogs.com/yuanchenqi/articles/6357507.html

登录

mysql -u用户名 -p

password:密码

 
20155953-bde6fa565d8e4039.png
 

数据库操作(DDL)

创建数据库

语法

create database [if not exists] db_name [default character set] [default collate]

create database语句创建指定的数据库

如果数据库已经存在并且没有声明if not exists程序就会报错,声明了if not exists则会取消创建该数据库,继续执行下面的语句。

db_name设置数据库名

default character set设置数据库的默认编码

default collate设置数据库的默认排序规则

 
20155953-79131634fcbd7780.png
一个完整的例子
 
20155953-d7fcb98ec2e0b874.png
一个简单的例子

查看数据库

语法

show databases;                                查看所有数据库

show create database db_name;       查看数据库的创建方式

 
20155953-0e4d3e8c695a4b08.png
查看所有数据库
 
20155953-991096009868e495.png
查看数据库的创建方式

 

修改数据库

语法

alter database  db_name [default character set] [default collate]

 
20155953-7cdb2f5b84a34a0a.png
例子

数据库更名操作   建议使用可视化工具。

 

删除数据库

语法

drop database [if exists] db_name;

 
20155953-5ce6ea266f90ef93.png
删除数据库

从删库到跑路。

进入/切换数据库

语法

use db_name;

 
20155953-25468c1895bbf594.png
进入数据库

查看当前数据库

语法

select database();

 
20155953-8488ebf9dbfc19f8.png
查看当前数据库

这个方法也可以在刚登入时用来查看所有数据库。

 

mysql数据类型

MySQL支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型。

 

数值类型

下面的表显示了需要的每个整数类型的存储和范围。

 
20155953-36eec6fa8053fe5b.png
 

 

日期/时间类型

表示时间值的日期和时间类型为DATETIME、DATE、TIMESTAMP、TIME和YEAR。

每个时间类型有一个有效值范围和一个"零"值,当指定不合法的MySQL不能表示的值时使用"零"值。

 
20155953-10188e14d9d42658.png
 

 

字符类型

字符串类型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。该节描述了这些类型如何工作以及如何在查询中使用这些类型。

 
20155953-ef2646c65a05a96e.png
 

CHAR和VARCHAR类型类似,但它们保存和检索的方式不同。它们的最大长度和是否尾部空格被保留等方面也不同。在存储或检索过程中不进行大小写转换。

BINARY和VARBINARY类类似于CHAR和VARCHAR,不同的是它们包含二进制字符串而不要非二进制字符串。也就是说,它们包含字节字符串而不是字符字符串。

BLOB是一个二进制大对象,可以容纳可变数量的数据。有4种BLOB类型:TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB。它们只是可容纳值的最大长度不同。

有4种TEXT类型:TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT。这些对应4种BLOB类型,有相同的最大长度和存储需求。

 

数据表操作

 

基础操作

创建表

语法

CREATE TABLE <表名> ([表定义选项])[表选项][分区选项];

 
20155953-1ddacb2e2c548086.png
创建一个职工表

约束:

      primary key (非空且唯一)  :能够唯一区分出当前记录的字段称为主键!

      unique:唯一索引

      not null:非空

      auto_increment 主键字段必须是数字类型。

      外键约束 foreign key  

 

查看表信息

    desc tab_name                             查看表结构

    show columns from tab_name      查看表结构

 
20155953-1008c0ead5300807.png
查看表结构

 show tables 查看当前数据库中的所有的表

 
20155953-ef45770ca0741edc.png
查看表

    show createtable tab_name    查看当前数据库表建表语句

 
20155953-fb1247cc03944598.png
 

 

修改表结构

增加字段

语法

alter table tab_name add[column] 列名 类型[完整性约束条件][first|after 字段名];

 
20155953-41c0c364772d276d.png
增加字段

增加多个字段

 
20155953-37331726a23ac972.png
 

修改列名

语法

alter table tab_name change [column] 列名 新列名 类型 [完整性约束条件][first|after 字段名];

将addr2改成addr3

 
20155953-543d7410a429f2cf.png
 

删除一列

语法

alter table tab_name drop [column] 列名;

删除掉employee中的addr列。

 
20155953-4074f873ef47cdae.png
 

修改表名

语法

rename table 表名 to 新表名;

 
20155953-c28395476021cb5e.png
修改表名

修改数据集

语法

alter table 表名 character set XX;

 
20155953-c7da1eb2995af01d.png
 

 

删除表

语法

drop table tab_name;

 
20155953-a18d7db0f41065ca.png
删除表

 

添加/删除主键

语法

alter table tab_name add primary key(字段名称,...)

alter table tab_name drop primary key;

如何真正删除主键

alter table tab_name modify id int;

auto_increment没了,但这样写主键依然存在,所以还要加上下面这句

alter table tab_name drop primary key;

仅仅用这句也无法直接删除主键

 

 

表纪录操作

语法

insert [into] tab_name (field1,filed2,.......) values (value1,value2,.......);

我们先建立一个学生表

 
20155953-6b6c3dad5ac8fa56.png
建表

然后第一种增加记录的方式。

 
20155953-43a84f594e7e011f.png
增加一条记录

也可以空一些字段

 
20155953-afacbbbe3d4fb1ef.png
省略字段

如果全字段追加,不需要有字段列表。

 
20155953-5dbdebc6fcf2a8c7.png
全字段追加

还可以一次追加多条记录。

 
20155953-4db186d8d9dbcf42.png
增加多条记录

还有set插入

 
20155953-c4d2ccdd4d7bb917.png
set

 

语法

delete from tab_name [where ....]

删除id为7的记录。

 
20155953-bb9e18ed1c48a16f.png
 

如果不跟where语句则删除整张表中的数据。

delete语句只能删除表中的内容,不能删除表本身,想要删除表,用drop。

TRUNCATE TABLE也可以删除表中的所有数据,词语句首先摧毁表,再新建表。此种方式删除的数据不能在事务中恢复。

 

语法

update tab_name set field1=value1,field2=value2,......[where 语句]

我们把id为6的这一行的name改为王红。

 
20155953-c9f998b14244bb40.png
 

同时age增加1。

 
20155953-ff5515de81079d58.png
 

 

单表查询

准备表与数据。

 
20155953-a02044c388eb5f7c.png
 

普通查询

语法

SELECT *|field1,filed2 ... FROM tab_name

                  WHERE 条件

                  GROUPBY field

                  HAVING 筛选

                  ORDERBY field

                  LIMIT 限制条数

查询表中所有学生的信息。

 
20155953-cb8c97012f10b6c5.png
 

查询表中所有学生的姓名和对应的英语成绩。

 
20155953-86f069ca346449ae.png
 

过滤表中重复数据。

 
20155953-a9208b37eb5cb369.png
 

select 也可以使用表达式,并且可以使用: 字段 as 别名或者:字段 别名

在所有学生分数上加10分特长分显示。

 
20155953-4406d2ddaea85995.png
 

统计每个学生的总分。

 
20155953-13fa4ff8d25c2097.png
 

使用别名表示学生总分。

 
20155953-da7a7d579251462e.png
 

 

条件查询

查询姓名为XXX的学生成绩

 
20155953-327947e16bf3626c.png
 

查询英语成绩大于90分的同学

 
20155953-c4515f46131f9b51.png
 

查询总分大于200分的所有同学

 
20155953-0258cd4cea611dc3.png
 

 

where字句中可以使用:比较运算符,通配符,逻辑运算符。

查询JS分数在 70-100之间的同学。

 
20155953-65239c78dd773258.png
 

查询Django分数为75,76,77的同学。

 
20155953-93f0a9160b41e367.png
 

查询所有姓王的学生成绩。

 
20155953-c2fa14de29992ee2.png
 

查询JS分>90,Django分>90的同学。

 
20155953-c181f6d8d19e34e2.png
 

查找没有分配班级的学生的姓名

 
20155953-5d41853f14acbcdd.png
 

 

排序查询

Order by 指定排序的列,排序的列即可是表中的列名,也可以是select 语句后指定的别名。

语法

select *|field1,field2... from tab_name order by field [Asc|Desc]

Asc 升序、Desc 降序,其中asc为默认值 。

ORDER BY 子句应位于SELECT语句的结尾。  

对JS成绩排序后输出。

 
20155953-af0ca7d63bc2818e.png
 

对总分排序按从高到低的顺序输出。

 
20155953-081cf6ed37926322.png
 

对姓王的学生年龄排序输出

 
20155953-bc3622c317342c09.png
 

 

分组查询

数据表建立

 
20155953-40e5c10c692231b6.png
 

对购物表按类名分组后显示每一组商品的价格总和。

 
20155953-435962ec6ba589f5.png
 

对购物表按类名分组后显示每一组商品价格总和超过150的商品。

 
20155953-af7c4dcb54af0aef.png
 

having 和 where两者都可以对查询结果进行进一步的过滤,差别有:

<1>where语句只能用在分组之前的筛选,having可以用在分组之后的筛选;

<2>使用where语句的地方都可以用having进行替换

<3>having中可以用聚合函数,where中就不行。

 

聚合函数

COUNT(列名):

统计一个班级共有多少学生?

 
20155953-e152fcc19793921f.png
 

统计JS成绩大于70的学生有多少个?

 
20155953-0f330c9fad81c24d.png
 

统计总分大于280的人数有多少?

 
20155953-ef886103a6358e64.png
 

注意:count(*)统计所有行; count(字段)不统计null值.

SUM(列名):

统计一个班级JS总成绩

 
20155953-cafb640db6b9437f.png
 

统计一个班级各科分别的总成绩

 
20155953-6849b5990027e94a.png
 

统计一个班级各科的成绩总和

 
20155953-83aad31b068ce551.png
 

统计一个班级JS成绩平均分

 
20155953-05743c3bb092e797.png
 

AVG(列名):

求一个班级JS平均分

 
20155953-502886a64769e202.png
 

求一个班级总分平均分

 
20155953-20577e8fe51353cb.png
 

 

MAX():

求班级最高分

 
20155953-d505aebea9020f13.png
 

 

MIN():

求班级最低分

 
20155953-f100cd474fa45284.png
 

 

where和having

Mysql在执行sql语句时的执行顺序:

from 

where 

select  (as)

group by 

having 

order by

 
20155953-da2ac85d70f1a864.png
 

limit

limit子句用于限制查询结果返回的数量,常用于分页查询

select * from tab_name limit i,n

i:为查询结果的索引值(默认从0开始),当i=0时可省略i

n:为查询结果返回的数量# i与n之间使用英文逗号","隔开

 
20155953-7673f11ba148036d.png
查找第一条记录
 
20155953-e646171198884b3c.png
查找第二条记录后五条

 

正则表达式

 
20155953-f51e652c411147ad.png

查找以yu开头的name

 
20155953-7c71d5b2dfe01c6d.png
 

查找以n结尾的name

 
20155953-d7139623f9b64369.png
 

查找带l的name

 
20155953-8be0f1155095cf76.png
 

 

多表查询

创建表

 
20155953-9d1b631b0aa9a0d9.png
 

连接查询

笛卡尔积查询

 
20155953-1bc86f49a0d16937.png
 

内连接

查询两张表中都有的关联数据,相当于利用条件从笛卡尔积结果中筛选出了正确的结果。

 
20155953-e189b1ef5b665ea2.png
 

外连接

左外连接

在内连接的基础上增加左边有右边没有的结果

 
20155953-4e5996b3aca14bfa.png
 

右外连接

在内连接的基础上增加右边有左边没有的结果

 
20155953-a5500d9cb5a14db3.png
 

全外连接

在内连接的基础上增加左边有右边没有的和右边有左边没有的结果

右连接 UNION 左连接

 
20155953-ec0260415fecc50b.png
 

复合条件连接查询

查询员工年龄大于等于25岁的部门

 
20155953-1c39258acc01ae24.png
 

以内连接的方式查询employee和department表,并且以age字段的升序方式显示

 
20155953-6d3d7d9dfc3af40a.png
 

 

子查询

子查询是将一个查询语句嵌套在另一个查询语句中。

内层查询语句的查询结果,可以为外层查询语句提供查询条件。

子查询中可以包含:IN、NOT IN、ANY、ALL、EXISTS 和 NOT EXISTS等关键字

还可以包含比较运算符:= 、 !=、> 、<等

带IN关键字的子查询

查询employee表,但dept_id必须在department表中出现过

 
20155953-3cac4f231fc7ea03.png
 

带比较运算符的子查询

查询员工年龄大于等于25岁的部门

 
20155953-f6967c19bd5cc71b.png
 

 

 

带EXISTS关键字的子查询

EXISTS关字键字表示存在。在使用EXISTS关键字时,内层查询语句不返回查询的记录,而是返回一个真假值。Ture或False,当返回Ture时,外层查询语句将进行查询;当返回值为False时,外层查询语句不进行查询

 

 
20155953-8667b59adc097a87.png
 

没有dept_id等于205的记录,返回为false,外层查询语句不进行查询,查询为空。

 

完整性约束之主键约束

<1> 一张表只能有一个主键

<2> 主键类型不一定非是整型

单字段主键

主键字段特点:非空且唯一

 
20155953-16f86d3681763ee0.png
 

多字段联合主键

 
20155953-7a79c148c1e058f6.png
 

 

完整性约束之外键约束

环境:每一个班主任会对应多个学生 , 而每个学生只能对应一个班主任

 
20155953-0b4a06400611c69f.png
教师表
 
20155953-2b792c1bcd2e6532.png
学生表

外键约束对子表的含义: 如果在父表中找不到候选键,则不允许在子表上进行insert/update

外键约束对父表的含义: 在父表上进行update/delete以更新或删除在子表中有一条或多条对应匹配行的候选键时父表的行为取决于在定义子表的外键时指定的on update/on delete子句

创建外键

子句语法

[CONSTRAINT <外键名>] FOREIGN KEY 字段名 [,字段名2,…]

REFERENCES <主表名> 主键列1 [,主键列2,…]

 
20155953-3f6044728acb4011.png
 

删除直接用drop。

 
20155953-897834e866a0f91d.png
 

ON语句

cascade方式

在父表上update/delete记录时,同步update/delete掉子表的匹配记录

外键的级联删除:如果父表中的记录被删除,则子表中对应的记录自动被删除

 

set null方式

在父表上update/delete记录时,将子表上匹配记录的列设为null

要注意子表的外键列不能为not null

 

Restrict方式

拒绝对父表进行删除更新操作

 

No action方式

在mysql中同Restrict,如果子表中有匹配的记录,则不允许对父表对应候选键进行update/delete操作

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

寒 暄

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值