mysal 数据库基本操作
1,库相关
创建数据库
create database 库名;
查看有哪些数据库
show databases;
结构性删除数据库
drop database 库名;
查看数据库基本信息(字符集)
show create database 库名;
更改数据库字符集
alter database 库名 character set 字符集;
切换(进入)数据库
use 库名;
查看当前所在的数据库
select database();
2,表的基本命令
创建表
create table 表名 (字段 字段类型,字段 字段类型); 或 create table 表名 (字段 字段类型 表约束,字段 字段类型); create table 表名 (字段 字段类型,字段 字段类型,表约束(指定字段));
查看有那些表
show tables;
查看表的基本信息
show create table 表名;
查看表的字段信息
desc 表名;
修改字段名
alter table 表名 change 旧字段名 新字段名 字段类型; #修改之后可能会使表的某些字段信息发生改变 desc一下对比一下
修改字段数据类型
alter table 表名 modify 字段名 字段类型;
增加字段
alter table 表名 add 字段名 字段类型;
删除字段
alter table 表名 drop 字段名;
删除表
drop table 表名;
插入数据
insert into 表名 (字段,字段) values(值,值); #注意字段类型
同时插入多条数据
insert into 表名 (字段,字段)values(值,值)(值,值);
更新数据
update 表名 set 字段名=值,字段名=值 wehere 字段=值; # where 末尾 为指定条件 相当于指定修改哪一行的数据
更新全部数据
update 表名 set 字段=值;
查询表所有数据
select * from 表名;
查询指定字段
select 字段,字段 from 表名; #必须以逗号分隔 否则只能查出最后一个字段 #select可以用于书写常数 用于标记 命令如下 #select 字段,'值' from 表名;
查询结果中过滤重复数据
select distinct 字段名 from 表名;
算数运算符查询
例句 select 字段,age+5 from 表名; 查询十年后的年龄
删除数据
delete from 表名 where 字段=值; # where 末尾 相当于指定删除某一行 DROP TABLE IF EXISTS 表名; #IF EXISTS 子句用于在尝试删除表之前检查表是否存在 表存在 则将执行删除操作 表不存在 则不会出现错误
删除全部数据
delete from 表名;
TRUNCATE和DETELE的区别 TRUNCATE和DETELE都能实现删除表中的所有数据的功能,但两者也是有区别的:
DELETE语句后可跟WHERE子句,可通过指定WHERE子句中的条件表达式只删除满足条件的部分记录;但是,TRUNCATE语句只能用于删除表中的所有记录。
使用TRUNCATE语句删除表中的数据后,再次向表中添加记录时自动增加字段的默认初始值重新由1开始;使用DELETE语句删除表中所有记录后,再次向表中添加记录时自动增加字段的值为删除时该字段的最大值加1
DELETE语句是DML语句,TRUNCATE语句通常被认为是DDL语句
3,表约束
PRIMARY KEY 主键约束用于唯一标识对应的记录
FOREIGN KEY 外键约束
NOT NULL 非空约束
UNIQUE 唯一性约束
DEFAULT 默认值约束,用于设置字段的默认值
设置主键
创建时设置 参考表创建
非空约束
创建时设置 参考表创建
默认值约束
创建时设置 参考表创建 约束后跟 默认值便可
唯一性约束
创建时设置 参考表创建
外键约束
ALTER TABLE 从表名 ADD CONSTRAINT 外键名 FOREIGN KEY (从表字段名) REFERENCES 主表名 (字段名);
#外键约束字段类型必须一致否则无法成功
#注意主从两表数据一致性问题 通常从表外键为主表主键
删除外键
ALTER TABLE 表名 DROP FOREIGN KEY 外键名;
4,函数
只有SELECT子句和HAVING子句 ORDER BY子句中能够使用聚合函数
在WHERE子句中使用聚合函数是错误的
统一语法 select 函数(字段) from 表名;
count()
统计表中数据的行数或者统计指定列其值不为空的数据个数
例句 select count() from 表名;
max()
计算指定列的最大值 指定列是字符串类型则会使用字符串拍寻运算
例句 select max(age) from 表名; 查询年纪最大的
min()
计算指定列最小值
sum()
计算指定列的数值和 指定列类型不是数值类型则计算结果会为零
select sum(字段) from 表名;
avg()
计算指定列的平均值
拓展
时间函数
SELECT NOW();查询会返回当前日期和时间 SELECT DAY (NOW());查询会返回当前日期是这个月的第几天 SELECT DATE (NOW());查询会返回当前日期,不包括时间部分 SELECT TIME (NOW());查询会返回当前时间,不包括日期部分 SELECT YEAR (NOW());查询会返回当前年份 SELECT MONTH (NOW());查询会返回当前月份 SELECT CURRENT_DATE();查询与 SELECT DATE(NOW()); 的效果是一样的,都是返回当前日期,不包括时间部分 SELECT CURRENT_TIME();查询与 SELECT TIME(NOW()); 的效果是一样的,都是返回当前时间,不包括日期部分 SELECT CURRENT_TIMESTAMP();查询与 SELECT NOW(); 的效果是一样的,都是返回当前日期和时间 SELECT ADDTIME('14:23:12','01:02:01');查询会将两个时间相加,返回一个时间值 SELECT DATE_ADD(NOW(),INTERVAL 1 DAY);查询会将当前日期加上一个指定的时间间隔(1 天),返回新的日期值 SELECT DATE_ADD(NOW(),INTERVAL 1 MONTH);查询会将当前日期加上一个指定的时间间隔(1 个月),返回新的日期值 SELECT DATE_SUB(NOW(),INTERVAL 1 DAY);查询会将当前日期减去一个指定的时间间隔(1 天),返回新的日期值 SELECT DATE_SUB(NOW(),INTERVAL 1 MONTH);查询会将当前日期减去一个指定的时间间隔(1 个月),返回新的日期值 SELECT DATEDIFF('2019-07-22','2019-05-05');查询会计算两个日期之间的天数差
字符串函数
--连接函数 CONCAT 函数用于将两个或多个字符串连接在一起 SELECT CONCAT () --INSTR 函数用于返回子字符串在字符串中第一次出现的位置 SELECT INSTR (); 例句select instr ('字段','值'); 查看该值在字符串中第一次出现的位置 --统计长度 LENGTH 函数用于返回字符串的长度 SELECT LENGTH();
数字函数
-- 绝对值 SELECT ABS(-136); -- 向下取整 SELECT FLOOR(3.14); -- 向上取整 SELECT CEILING(3.14);
#拓展 有些()内的值可以加上' '防止出错
5,条件查询
条件查询关系运算符
= 等于
<> 不等于
!= 不等于
< 小于
>大于
<= 小于等于
>=大于等于
select * from 表名 where 字段>值; • 查询表里所有大于指定值的值
IN关键字查询
select * from 表名 where 字段 in ('值','值'); • 查询表里所有指定的值 • in前面加 not 为取反
BETWEEN AND 范围查询
select * from 表名 where 字段 between 值 and 值; • 查询两值之间的信息 • between前加not 为取反
STUDENT 空值查询
select * from 表名 where 字段 is null; • 查询为空的值 • null前加not 为取反
AND和 关键字查询
多个条件之间加 and 可以多条件查询
OR或 关键字查询
多个条件之间加 or 为或查询
LIKE匹配查询
select * from 表名 where 字段 like '值'; • 查询匹配该值的数据
通配符
%
%用于匹配任意长度的字符串 字符串“ab%”匹配以字符ab开始任意长度的字符串
'%值'匹配以值结尾的数据
_
_ 下划线通配符只匹配单个字符 如果要匹配多个字符 需要连续使用多个下划线通配符
LIMIT限制查询结果的数量
SELECT * FROM 表名 ORDER BY 字段 ASC LIMIT 3; #以升序查询表中符合条件的三条数据 SELECT * FROM 表名 ORDER BY 字段 DESC LIMIT 5; #以降序查询表中符合条件的五条数据
升降序
SELECT * FROM 表名 ORDER BY 字段 ASC; 升序 SELECT * FROM 表名 ORDER BY 字段 DESC; 降序
GEOUP BY 分组查询
select 函数,字段名 from 表名 group by 字段名; #例 select count(*),gender from student group by gender; 统计各数值数量 结果如下
select 函数,字段名 from 表名 where 字段>数值 group by 字段; #查询字段大于数值的记录 结果如下
拓展 having 后跟函数进行判断也可以进行筛选查询记录
6,别名设置
表的别名
select * from 表名 as 表的别名 where 条件;
字段别名
select 字段 as 字段别名,字段 as 字段别名 from 表名 where 条件;
7,表的关联关系
关联查询
数据必须具有关联性
select * from 表名a where 字段a=(select 字段b from 表名b where 条件); #该命令查询 查询表a里所有符合条件的 字段a=(查询表b中符合条件的字段b)
关联删除数据
delete from 表名a where 字段a=(select 字段b from 表名b where 条件);
8,多表联查
表之间必须具有一定的关联性
交叉连接
select * from 表a CROSS JOIN 表b;
内连接查询
显示满足所有条件的记录
select 表1.字段1,表2.字段2,表2.字段3 from inner join 表2 on 表1.字段1=表2.字段3; #以表1字段1和表2字段3作为连接 显示表1字段1 表2字段2 表2字段3
外连接查询
显示一个表的所有数据和另一个表的符合条件的数据
SELECT 查询字段1,查询字段2, ... FROM 表1 LEFT | RIGHT [OUTER] JOIN 表2 ON 表1.关系字段=表2.关系字段 WHERE 条件
左连接(重在记录 而不只是字段)
LEFT [OUTER] JOIN 左(外)连接:返回包括左表中的所有记录和右表中符合连接条件的记录
select 表1.字段1,表2.字段2,表2,字段3 from 左表名 left outer join 表名 on 表1.字段1=表2.字段3; #会显示左表的所有记录和符合条件的记录 无值会显示空 #select 后面跟的是显示字段 左右连接侧重的是记录 on 后面跟的是连接条件(表之间的共性)
右链接
select 表1.字段1,表2.字段2,表2.字段3 from 表名 right outer join 右表名 on 表1.字段1=表2.字段3;
9,子查询
在执行查询时,首先会执行子查询中的语句,再将返回的结果作为外层查询的过滤条件
select * from 表名a where 字段a=(select 字段b from 表名b where 条件); #该命令查询 查询表a里所有符合条件的 字段a=(查询表b中符合条件的字段b)
带运算符的子查询
带exists关键字的子查询
exists关键字后面的参数可以是任意一个子查询 当返回结果为真时 才会执行
带any关键字的子查询
表示满足任意一个条件就返回一个结果作为外层查询条件
如 子查询中有一个满足的 就会返回所有需要显示的字段和记录
带all关键字的子查询
表示查询的结果需要满足所有内查询的条件才会返回结果
如 查询大于子查询结果的 会显示出所有大于的