MYSQL 命令集
数据类型
MySQL支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型。
MySQL支持所有标准SQL数值数据类型。
这些类型包括严格数值数据类型(INTEGER、SMALLINT、DECIMAL和NUMERIC),以及近似数值数据类型(FLOAT、REAL和DOUBLE PRECISION)。
关键字INT是INTEGER的同义词,关键字DEC是DECIMAL的同义词。
BIT数据类型保存位字段值,并且支持MyISAM、MEMORY、InnoDB和BDB表。
作为SQL标准的扩展,MySQL也支持整数类型TINYINT、MEDIUMINT和BIGINT。下面的表显示了需要的每个整数类型的存储和范围。
类型 大小 范围(有符号) 范围(无符号) 用途
TINYINT 1 byte (-128,127) (0,255) 小整数值
SMALLINT 2 bytes (-32 768,32 767) (0,65 535) 大整数值
MEDIUMINT 3 bytes (-8 388 608,8 388 607) (0,16 777 215) 大整数值
INT或INTEGER 4 bytes (-2 147 483 648,2 147 483 647) (0,4 294 967 295) 大整数值
BIGINT 8 bytes (-9,223,372,036,854,775,808,9 223 372 036 854 775 807) (0,18 446 744 073 709 551 615) 极大整数值
FLOAT 4 bytes (-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) 0,(1.175 494 351 E-38,3.402 823 466 E+38) 单精度 浮点数值
DOUBLE 8 bytes (-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 双精度 浮点数值
DECIMAL 对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2 依赖于M和D的值 依赖于M和D的值 小数值
日期和时间类型
表示时间值的日期和时间类型为DATETIME、DATE、TIMESTAMP、TIME和YEAR。
每个时间类型有一个有效值范围和一个"零"值,当指定不合法的MySQL不能表示的值时使用"零"值。
TIMESTAMP类型有专有的自动更新特性,将在后面描述。
类型 大小 ( bytes) 范围 格式 用途
DATE 3 1000-01-01/9999-12-31 YYYY-MM-DD 日期值
TIME 3 ‘-838:59:59’/‘838:59:59’ HH:MM:SS 时间值或持续时间
YEAR 1 1901/2155 YYYY 年份值
DATETIME 8 1000-01-01 00:00:00/9999-12-31 23:59:59 YYYY-MM-DD HH:MM:SS 混合日期和时间值
TIMESTAMP 4 1970-01-01 00:00:00/2038结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07 YYYYMMDD HHMMSS 混合日期和时间值,时间戳
字符串类型
字符串类型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。该节描述了这些类型如何工作以及如何在查询中使用这些类型。
类型 大小 用途
CHAR 0-255 bytes 定长字符串
VARCHAR 0-65535 bytes 变长字符串
TINYBLOB 0-255 bytes 不超过 255 个字符的二进制字符串
TINYTEXT 0-255 bytes 短文本字符串
BLOB 0-65 535 bytes 二进制形式的长文本数据
TEXT 0-65 535 bytes 长文本数据
MEDIUMBLOB 0-16 777 215 bytes 二进制形式的中等长度文本数据
MEDIUMTEXT 0-16 777 215 bytes 中等长度文本数据
LONGBLOB 0-4 294 967 295 bytes 二进制形式的极大文本数据
LONGTEXT 0-4 294 967 295 bytes 极大文本数据
注意:
char(n) 和 varchar(n) 中括号中 n 代表字符的个数,并不代表字节个数,比如 CHAR(30) 就可以存储 30 个字符。
CHAR 和 VARCHAR 类型类似,但它们保存和检索的方式不同。它们的最大长度和是否尾部空格被保留等方面也不同。在存储或检索过程中不进行大小写转换。
BINARY 和 VARBINARY 类似于 CHAR 和 VARCHAR,不同的是它们包含二进制字符串而不要非二进制字符串。也就是说,它们包含字节字符串而不是字符字符串。这说明它们没有字符集,并且排序和比较基于列值字节的数值值。
BLOB 是一个二进制大对象,可以容纳可变数量的数据。有 4 种 BLOB 类型:TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB。它们区别在于可容纳存储范围不同。
有 4 种 TEXT 类型:TINYTEXT、TEXT、MEDIUMTEXT 和 LONGTEXT。对应的这 4 种 BLOB 类型,可存储的最大长度不同,可根据实际情况选择。
数据库操作
-
CREATE DATABASE 数据库名;
mysql> create database RUNOOB;
Query OK, 1 row affected (0.02 sec) -
drop database <数据库名>;
mysql> drop database RUNOOB;
Query OK, 0 rows affected (0.03 sec) -
SHOW DATABASES;
列出 MySQL 数据库管理系统的数据库列表。
mysql> show databases;
±-------------------+
| Database |
±-------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| test_case |
±-------------------+
5 rows in set (0.04 sec) -
USE 数据库名;
选择要操作的Mysql数据库,使用该命令后所有Mysql命令都只针对该数据库。
mysql> use test_case;
Database changed -
SHOW TABLE STATUS FROM db_name \G
mysql> SHOW TABLE STATUS FROM RUNOOB; # 显示数据库 RUNOOB 中所有表的信息> SHOW TABLE STATUS FROM RUNOOB; # 显示数据库 RUNOOB 中所有表的信息mysql> SHOW TABLE STATUS from RUNOOB LIKE 'runoob%'; # 表名以runoob开头的表的信息> SHOW TABLE STATUS from RUNOOB LIKE 'runoob%'; # 表名以runoob开头的表的信息 mysql> SHOW TABLE STATUS from RUNOOB LIKE 'runoob%'\G; # 加上 \G,查询结果按列打印> SHOW TABLE STATUS from RUNOOB LIKE 'runoob%'\G; # 加上 \G,查询结果按列打印
表基础操作
-
SHOW TABLES;
显示指定数据库的所有表,使用该命令前需要使用 use 命令来选择要操作的数据库。
mysql> show tables;
±--------------------+
| Tables_in_test_case |
±--------------------+
| stu |
| tempstudent |
| 员工信息表 |
| 学生 |
±--------------------+
4 rows in set (0.02 sec) -
SHOW COLUMNS FROM 数据表;
显示数据表的属性,属性类型,主键信息 ,是否为 NULL,默认值等其他信息 。
mysql> show columns from stu;
±------±------------±-----±----±--------±------+
| Field | Type | Null | Key | Default | Extra |
±------±------------±-----±----±--------±------+
| num | varchar(10) | YES | MUL | NULL | |
| nam | varchar(10) | YES | | NULL | |
| age | varchar(3) | YES | | NULL | |
±------±------------±-----±----±--------±------+
3 rows in set (0.02 sec) -
desc 数据表;
查看表结构
mysql> desc stu;
±------±------------±-----±----±--------±------+
| Field | Type | Null | Key | Default | Extra |
±------±------------±-----±----±--------±------+
| num | varchar(10) | YES | MUL | NULL | |
| nam | varchar(10) | YES | | NULL | |
| age | varchar(3) | YES | | NULL | |
±------±------------±-----±----±--------±------+
3 rows in set (0.00 sec) -
SHOW INDEX FROM 数据表;
显示数据表的详细索引信息,包括PRIMARY KEY(主键)。
mysql> show index from stu;
±------±-----------±---------±-------------±------------±----------±------------±---------±-------±-----±-----------±--------±--------------±--------±-----------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Visible | Expression |
±------±-----------±---------±-------------±------------±----------±------------±---------±-------±-----±-----------±--------±--------------±--------±-----------+
| stu | 1 | PK_sno | 1 | num | A | 0 | NULL | NULL | YES | BTREE | | | YES | NULL |
±------±-----------±---------±-------------±------------±----------±------------±---------±-------±-----±-----------±--------±--------------±--------±-----------+
1 row in set (0.02 sec) -
CREATE TABLE table_name (column_name column_type [约束条件], column_name2 column_type [约束条件]…);
创建表
CREATE TABLE IF NOT EXISTSrunoob_tbl
(
runoob_id
INT UNSIGNED AUTO_INCREMENT,
runoob_title
VARCHAR(100) NOT NULL,
runoob_author
VARCHAR(40) NOT NULL,
submission_date
DATE,
PRIMARY KEY (runoob_id
)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
mysql> use RUNOOB;
Database changed
mysql> CREATE TABLE runoob_tbl(
-> runoob_id INT NOT NULL AUTO_INCREMENT,
-> runoob_title VARCHAR(100) NOT NULL,
-> runoob_author VARCHAR(40) NOT NULL,
-> submission_date DATE,
-> PRIMARY KEY ( runoob_id )
-> )ENGINE=InnoDB DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.16 sec)- 如果你不想字段为 NULL 可以设置字段的属性为 NOT NULL, 在操作数据库时如果输入该字段的数据为NULL ,就会报错。
- AUTO_INCREMENT定义列为自增的属性,一般用于主键,数值会自动加1。
- PRIMARY KEY关键字用于定义列为主键。 您可以使用多列来定义主键,列间以逗号分隔。
- ENGINE 设置存储引擎,CHARSET 设置编码。
-
DROP TABLE table_name ;
DROP TABLE table_name1, table_name2…;
删除表
mysql> DROP TABLE runoob_tbl;
Query OK, 0 rows affected (0.8 sec) -
alter table 表名 add 属性 数据类型;
添加列(属性)
mysql> alter table stu add sex char(2);
Query OK, 0 rows affected (0.03 sec)
Records: 0 Duplicates: 0 Warnings: 0mysql> select * from stu; +------+---------+------+------+ | num | nam | age | sex | +------+---------+------+------+ | 2 | zhaoliu | 80 | NULL | +------+---------+------+------+ 1 row in set (0.00 sec)
-
alter table 表名 drop 属性名;
删除列(属性)
mysql> alter table stu drop sex;
Query OK, 0 rows affected (0.17 sec)
Records: 0 Duplicates: 0 Warnings: 0mysql> select * from stu; +------+---------+------+ | num | nam | age | +------+---------+------+ | 2 | zhaoliu | 80 | +------+---------+------+ 1 row in set (0.00 sec)
-
alter table 表名 modify 属性 数据类型;
modify不用来属性重命名,只能修改属性类型和约束
mysql> desc stu;
±------±------------±-----±----±--------±------+
| Field | Type | Null | Key | Default | Extra |
±------±------------±-----±----±--------±------+
| num | varchar(10) | YES | MUL | NULL | |
| nam | varchar(10) | YES | | NULL | |
| age | varchar(3) | YES | | NULL | |
±------±------------±-----±----±--------±------+
3 rows in set (0.00 sec)mysql> alter table stu modify age age2; ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'age2' at line 1 mysql> alter table stu modify age varchar(5) NOT NULL; Query OK, 0 rows affected (0.16 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> desc stu; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | num | varchar(10) | YES | MUL | NULL | | | nam | varchar(10) | YES | | NULL | | | age | varchar(5) | NO | | NULL | | +-------+-------------+------+-----+---------+-------+ 3 rows in set (0.00 sec)
-
alter table 表名 change 原属性名 新属性名 数据类型 [约束];
change能修改属性名, 同时也可以修改数据类型和约束
mysql> desc stu;
±------±------------±-----±----±--------±------+
| Field | Type | Null | Key | Default | Extra |
±------±------------±-----±----±--------±------+
| num | varchar(10) | YES | MUL | NULL | |
| nam | varchar(10) | YES | | NULL | |
| age | varchar(5) | NO | | NULL | |
±------±------------±-----±----±--------±------+
3 rows in set (0.00 sec)
mysql> alter table stu change nam name varchar(20) NOT NULL;
Query OK, 0 rows affected (0.18 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc stu;
±------±------------±-----±----±--------±------+
| Field | Type | Null | Key | Default | Extra |
±------±------------±-----±----±--------±------+
| num | varchar(10) | YES | MUL | NULL | |
| name | varchar(20) | NO | | NULL | |
| age | varchar(5) | NO | | NULL | |
±------±------------±-----±----±--------±------+
3 rows in set (0.00 sec)
约束
-
创建主键约束(唯一,非空, 不重复)
- 创表的时候创建主键约束
- 格式一 :
create table 表名(列名1 数据类型 primary key,
列名2…);
通用于 oracle 和 sqlserver 数据库 - 格式二:
create table 表名(
列名1 数据类型,
列名2 数据类型,
constraint 主键约束的名字 primary key(列名1)
); - 格式三:
create table 表名(
列名1 数据类型,
列名2 数据类型,
primary key(列名1)
);
- 格式一 :
- 对已经存在的表添加主键约束
- 格式一:
alter table t_user modify user_id int(10) primary key; - 格式二:
alter table t_user add primary key (user_id); - 格式三:
alter table t_user add constraint pk_id primary key(user_id);
通用于 oracle 和 sqlserver 数据库
- 格式一:
- 删除主键约束
alter table t_user drop primary key;
- 创表的时候创建主键约束
-
创建联合主键
当一个字段可能存在重复值,无法确定这条数据的唯一性时,再加上一个字,两个字段联合起来确定这条数据的唯一性 (唯一, 非空, 不重复)- 创表的时候创建联合主键
- 格式一:
create table 表名(
列名1 数据类型,
列名2 数据类型,
constraint 主键约束的名字 primary key(列名1, 列名1)
); - 格式三:
create table 表名(
列名1 数据类型,
列名2 数据类型,
primary key(列名1, 列名2)
);
- 格式一:
- 对已存在的表创建联合主键
- 格式一:
alter table 表名 add primary key (列名1, 列名2) - 格式二:
alter table 表名 constraint 主键约束的名字 primary key(列名1, 列名2)
- 格式一:
- 创表的时候创建联合主键
-
唯一约束(唯一, 不重复, 可以为空)
关键词: unique
指定的表的列或者列的组合不能重复, 保证数据的唯一性
不允许出现重复的值, 但可以出现多个NULL
同一个表可以有多个唯一约束,或者多个列组合的约束
如果不给唯一约束起名字吗就默认和列名相同
mysql会给唯一约束的列上默认创建一个唯一索引- 创建表时创建唯一约
- 格式一:
create table 表名(
列名1 数据类型,
列名2 数据类型,
constraint 唯一约束的名字 unique(列名1),
constraint 唯一约束的名字 unique(列名2),
); - 格式二:
create table 表名(
列名1 数据类型 unique,
列名2 数据类型 unique,
);
- 格式一:
- 已存在表添加唯一约束
alter table 表名 add unique (列名1…); - 删除唯一约束
alter table 表名 drop index 唯一约束的名字;
- 创建表时创建唯一约
-
域完整性
域完整性是对数据表中的字段属性的约束。
它是由确定表结构时所定义的字段的属性决定的。
限制数据类型, 缺省值, 规则,约束是否可以为空。
域完整性可以确保不会输入无效的值。- 默认约束
关键词: default
等默认约束修饰了某个列时,所修饰的列不填,也会给一个默认值。- 创表时添加默认约束。
create table t_user(user_age int(5) default 18) - 修改已有表结构
alter table t_user modify user_age int(5) default 0; - 删除默认约束
alter table t_user modify user_age int(5);
- 创表时添加默认约束。
- 非空约束
- 创表时添加非空约束
create table t_user( user_age int(5) not null); - 修改已有表结构添加非空约束
alter table t_user modify user_age int(5) not null; - 删除非空约束
alter table t_user modify user_age int(5)
- 创表时添加非空约束
- adf
- 默认约束
-
参照完整性
只值表与表之间的数据参照引用, 使用外键约束实现。外键约束
外键是构建一个表的两个字段或两个表的两个字段之间的参照关系。
表的外键必须在主表中能够找到。
当主表的记录被从表参照时,主表的记录将不允许删除。
如果要删除数据,需要先删除从表中依赖该记录的数据。
从表参照主表某个列, 要求主表的列必须有主键约束或者唯一约束。- 创建表时创建外键约束
主表:
create table 表名(
列名1 数据类型 primary key,
列名2 数据类型
);
从表:
create table 表名2(
列名1 数据类型,
列名2 数据类型,
constraint 外键约束名 foreign key (从表列名) references 主表表名 (列名1)
); - 给已存在表创建外键约束
alter table 从表表名 add constraint 外键约束名 foreign key (从表列名) references 主表表名 (列名1) ; - 删除外键约束
alter table 从表表名 drop foreign key 外键约束名;
- 创建表时创建外键约束
SQL语句(增删改查)
SQL是一种数据库查询和设计语言
使数据库可以通过命令的方式而非图形化界面的方式对表进行增删改查等操作。
SQL是一种独立的语言, 在开发语言中可以嵌入SQL语言对数据库进行操作。
DDL语言 数据库定义语言
create 创建数据表和数据库
alter 修改数据表
drop 删除表
DML语言 数据库操作语言
insert 插入(增) delete 删除(删) update 更新(改)
- insert 插入语句 插入的值和列要保持一一对应关系
格式一, 格式二为通用形式- 格式一:
insert into 表名(列名1, 列名2, 列名3…) values(值1, 值2, 值3…)
格式二: 不非空且没有值的字段 可用null代替这列的值, 不能省略
insert into 表名 values(值1, 值2, 值3…) ;
insert into 表名 values(值1, null, 值3…) ;
格式三: 一次插入多行
insert into 表名 values(值1, 值2, 值3…), (值1, 值2, 值3…), (值1, 值2, 值3…)…;
- 格式一:
- delete 删除语句 可以对表中的语句进行删除
delete from 表名; # 清空整张表 慎用
delete from 表名 where 条件; # 删除满足条件的数据 - update 更新语句 可以对表中的数据进行修改
update 表名 set 字段=值; # 修改整张表中该字段的值
update 表名 set 字段1=值1, 字段2=值2…; # 修改整张表中该字段的值
update 表名 set 字段1=值1, 字段2=值2… where 条件; # 值修改符合条件的行 - select 查询语句
- 基本格式
select select_list
from table_list
[where search_conditing]
[group by group_by_list]
[having search_conditing]
[order by order_list [asc|desc]]- 查询表中指定字段的数据
select 列表 from 表名; - 查询表中所有字段的数据
select * from 表名; - 查询数据去重
select distinct 列名 from表名; - 使用别名查询 根据需求对数据显示的标题进行修改。
select 列名 ‘别名’ from 表名;
select 学号 ‘NO’, 姓名 ‘name’, 性别 ‘sex’ from 学生信息;
select 列名 as ‘别名’ from 表名; - 查询时对查询的数据进行再次计算
select 编号, 学号, 成绩 as ‘调整前成绩’, 成绩-10 as ‘调整后成绩’ from 成绩表; - 一般查询不对全表进行查。只是从整个表中选出满足指定球条件的内容进行查询
select select_list from 表名 where search_conditions; - 比较运算法
, <, >=, <=, <>, !=,
- 逻辑运算符
and, or - 范围搜索条件
返回两个指定值之间的所有值。分为包括范伟和排除范围
between and 和 not between and
select 学号, 课程编号, 成绩
from 成绩表
where 成绩 between 70 and 80; 开始值和结束值包含在查询范围内
(where 成绩 not between 70 and 80;) - 列表所有条件
in 使用户可以选择与列表中的任意值匹配的行
select 学号, 班级编号, 姓名, 籍贯
from 学生信息
where 籍贯 in (‘北京’, ‘深圳’);
not in 使用户可以选择不在值列表中的行
select 学号, 班级编号, 姓名, 籍贯
from 学生信息
where 籍贯 not in (‘北京’, ‘深圳’); - 模糊查询
like 搜索于指定模式匹配的字符串,日期或时间值。
通配符 : % 表示匹配零个或多个字符
_ 表示匹配一个字符
select * from 学生信息 where 姓名 like ‘王%’;
not like - 空值(null)查询
空值 null 在数据库中代表不确定的值。
判断某个值是否为null值。不能使用比较运算符。
判断取值为空的语句格式: is null
盼判断取值为非空的语句格式: is not null
select 列名 from 表名 where 列名 is null;
is not null; - 聚合函数
SUM([DISTINCT] <列名>) 计算列值总和。
AVG([DISTINCT] <列名>) 计算列值平均值, 默认保留四位。
MAX([DISTINCT] <列名>) 求列值最大值。
MIN([DISTINCT] <列名>) 求列值最小值。
CPUNT([DISTINCT] <列名>) 统计本列值个数。
COUNT() 统计表中元组个数 (行数, 记录数)
上述函数中,除count()外,其他函数在计算过程中均忽略null值
select 聚合函数 from 表名; - 行数限定 limit
select 列1, 列2… from 表名 limit [start_num, ] end_num;
开始位置下标从0开始 - 分组 group by
用于结合聚合函数。根据一个或多个列对结果进行分组。
select column_name, aggregate_function(column_name)
from table_name
group by column_name;
例: 统计每个年级的学生总人数以及班级总数。
select 年级, sum(人数) ‘总人数’, count(*), ‘班级总数’ from 班级信息 group by 年级;
年级 总人数 班级总数
一 80 1
二 100 2 - having
通常与 group by 一起使用, 进行分组之后数据的条件过滤。
having语句可以包含聚合函数,但是where语句不可以。
select 列名 from 表名 group by 列名 having 条件(一般情况下都会使用聚合函数当做条件)
select 学号, sum(成绩) from 成绩表
group by 学号
having sum(成绩) < 600; - 排序 order by
用于指定结果集进行排序。默认升序 asc 降序 desc。
select 列名 from 表名 order by 列名 [desc];
根据两个列进行排序。先按列名1排序。列名1重复时按列名2排序。
select 列名 from 表名 order by 列名1 asc, 列名2 desc;
- 查询表中指定字段的数据
- 基本格式
MYSQL函数
Mysql中函数主要分为四大类
- 字符串函数
mysql中一个汉子占三个字节, 占一个字符; 一个字母占一个字节- length 可以返回字符串的字节长度
select sname, length(sname) from students; - char_length 可以返回字符串中字符的长度
select sname char_length(sname) from students; - mid 可以从某个位置获取某个长度的字符(不是字节)
select sname, mid(sname,2,1) from students;
2(第二个位置) 表示开始位置, 最小值是1
1(第三个位置) 表示支取的长度
- length 可以返回字符串的字节长度
- 数字函数
-
round 实现四舍五入
select round(23.4567, 2); 保留两位小数
select round(23.4567); 取整
select round(avg(列名), 2) from 表名; -
least 求最小的数字
select least(1,2,3,4,5); -
greatest 求最大的数字
select greatest(4,5,6,7);
mysql> select round(23.4567, 2);
±------------------+
| round(23.4567, 2) |
±------------------+
| 23.46 |
±------------------+
1 row in set (0.01 sec)mysql> select round(23.567); +---------------+ | round(23.567) | +---------------+ | 24 | +---------------+ 1 row in set (0.00 sec) mysql> select least(2,1,4,-3); +-----------------+ | least(2,1,4,-3) | +-----------------+ | -3 | +-----------------+ 1 row in set (0.01 sec) mysql> select greatest(2,3,1,5,4); +---------------------+ | greatest(2,3,1,5,4) | +---------------------+ | 5 | +---------------------+ 1 row in set (0.01 sec)
-
- 日期时间函数
-
now 获取数据库服务器当前时间(年月日时分秒)
select now(); -
current_date 获取数据库服务器当前日期(年月日)
select current_date(); -
current_time 获取数据库服务器当前时间(时分秒)
select current_time(); -
to_days 将日期转换成总天数()
select to_days(‘2008-08-08’); -
dayofyear 可以得该年已经过 多少天
select dayofyear(now()); -
week 可以返回当前的时日是第几周
select week(now());
mysql> select now();
±--------------------+
| now() |
±--------------------+
| 2021-06-05 11:47:49 |
±--------------------+
1 row in set (0.00 sec)mysql> select current_date(); +----------------+ | current_date() | +----------------+ | 2021-06-05 | +----------------+ 1 row in set (0.00 sec) mysql> select current_time(); +----------------+ | current_time() | +----------------+ | 11:48:03 | +----------------+ 1 row in set (0.00 sec) mysql> select to_days('2008-08-08'); +-----------------------+ | to_days('2008-08-08') | +-----------------------+ | 733627 | +-----------------------+ 1 row in set (0.00 sec) mysql> select dayofyear(now()); +------------------+ | dayofyear(now()) | +------------------+ | 156 | +------------------+ 1 row in set (0.00 sec) mysql> select week(now()); +-------------+ | week(now()) | +-------------+ | 22 | +-------------+ 1 row in set (0.00 sec)
-
- 控制流函数
-
if 有三个参数, 第一个参数为空, false, 输出第三个参数, 否则输出第二个参数
select if(布尔表达式, 参数2, 参数3);
select if(null, 参数2, 参数3); -
ifnull 有两个参数, 第一个参数为空输出第二个参数, 否则输出第一个(如果为布尔表达式, true输出1, false输出0)
select ifnull (null, 参数2);
select ifnull(参数1, 参数2);
mysql> select if(2>1, 0, 1);
±--------------+
| if(2>1, 0, 1) |
±--------------+
| 0 |
±--------------+
1 row in set (0.00 sec)mysql> select if(2<1, 0, 1); +---------------+ | if(2<1, 0, 1) | +---------------+ | 1 | +---------------+ 1 row in set (0.00 sec) mysql> select if(null, 0, 1); +----------------+ | if(null, 0, 1) | +----------------+ | 1 | +----------------+ 1 row in set (0.01 sec) mysql> select ifnull(null, 2); +-----------------+ | ifnull(null, 2) | +-----------------+ | 2 | +-----------------+ 1 row in set (0.00 sec) mysql> select ifnull(5, 2); +--------------+ | ifnull(5, 2) | +--------------+ | 5 | +--------------+ 1 row in set (0.00 sec)
-
表链接(多表查询)
- 内连接
-
格式
格式一:
select select_list from 表1, 表2 where 表1.列=表2.列;
格式二:
select select_list from 表1 [inner] join 表2 on 表1.列=表2.列;
表与表之间建立起关联的列的列名可以不一样, 但这两列的数据类型和内容必须保持一致。 -
一般inner join 或 join 来指定内连接 有分为 等值连接 和 非等值连接
select s.学号, s.姓名, c.班级编号, c.成绩
from 学生信息 as s inner join 成绩表 as c
on s.学号=c.学号
where c.成绩>60
order by c.成绩 desc; -
多表查询(>=3)
select 表1.列, 表2.列,表3.列,表4.列
from 表1, 表2, 表3, 表4
where 表1.列=表2.列 and 表2.列=表3.列 and 表3.列=表4.列;select from 表1 inner join 表2 on 表1.列=表2.列 inner join 表3 on 表2.列=表3.列 将表1, 表2关联成大表后再关联表3
- 先确定表的数量
- 确定列, 用到哪张表哪个列
- 确定表与表之前能够关联到的列
- 确定题上是否有额外的要求, 用and链接
…where 条件1 and 条件2 and 条件3;
…on 关联条件
-
- 外连接
外连接会返回from子句中提到的至少一个表视图中的所有行
外连接分为左 外连接 和 右外连接- 左外连接 left outer join
左外连接对连接条件中左表不加限制。
左外连接的查询结果中包含指定左表的所有行,而不仅仅是连接列所匹配的行。如果左表的某行在右表中没有找到匹配行,则结果集中的右表的相对应的位置为null。
select 表名.列
from 表1 left outer join 表2
on 表1.列=表2.列; - 右外连接 right outer join
左外连接对连接条件中右表不加限制. 显示右表的全部数据。左表对应行没有匹配到则显示null。
select 表名.列
from 表1 right outer join 表2
on 表1.列=表2.列;
- 左外连接 left outer join
- 子查询 (查询语句中嵌套查询语句。最大嵌套255个子查询)
子查询在其他查询结果的基础上提供了一种有效的方式, 来表示where子句的条件。
子查询可嵌套在 select, insert, update, delete语句中
子查询的 select查询总是使用圆括号包起来。- select 列名from 表名 where 列名 in (select 列 from 表名);
- 子查询嵌套子查询
查询计算机系学生选修了哪些课程?
select *
from student_course
where sno in (select sno from student where sdept=‘计算机系’);
条件是什么, 子查询就查什么 - insert语句 使用select子句可以将一个表或多个表, 视图中的值加到另一个表中。使用select子句还可以同时插入多行。
insert into 表名 select 查询语句;
insert [into] table_name[(column_list)] select select_list from table_name; - update 与 select
将计算机系全体学生的成绩加五分
update 学生成绩表 set 成绩=成绩+5
where 学号 in (select 学号 from 学生表 where 院系=‘计算机系’); - delect 与 selcet
delect from 表名where 列名 in (select查询语句);
删除计算机系学生的成绩
delete from 学生成绩表where 学号 in (select 学号 from 学生表 where 院系=‘计算机系’);
- 子查询嵌套子查询
- select 列名from 表名 where 列名 in (select 列 from 表名);
- 视图(虚标表)
基于某个查询结果的虚表, 方便用户对数据库的操作。- 创建视图 create view
create view 视图名 as select 语句;
注意:
视图作为一张虚表存在, 那么对时表的增删改查操作对视图同样成立。
视图既然是根据实表所得。那么对视图的增删改查操作也会影响时表。
drop对实表不会产生影响 - insert
insert into 视图名 values(…,…,); - update
update 视图名 set 列名=值 where 条件; - delete
drop from 视图名 where 条件; - 删除视图
drop view 视图名; - 修改视图结构
alter view 视图名 as select 语句
alter view view_班级信息 as select 人数, 班级编号 from 班级信息; - 索引
mysql的索引是对数据库中一个或多个列的值进行排序的结构。索引有助于更快的获取信息。
创建索引的作用:
1.加快数据检索.
2.保证数据的唯一性
3.实现表与表之间的参照完整性
4.在使用group by, order by子句进行查询时,利用索引可以减少排序和分组的时间。
- 创建视图 create view