数据库常用命令
一、客户端用命令窗口(用过管理员打开)启动与关闭服务命令
启动服务:
net start mysql57
关闭服务:
net stop mysql57
二、创建数据库
create database 库名;
三 、查看当前在哪个库里面
select databases();
修改数据库的名字
--创建新表
creat database newdb;
-- 执行语句
rename table newdb.字段 to olddb.字段;
四、进入库里面
use 库名;
五、判断是不是存在这个数据库否则创建数据库
create database if not exists 库名;
六、查看数数据库字符集并指定字符集gbk
-- 查看数据库字符集
show create database 库名;
-- 指定字符集
creat database 库名 default character set gbk;
七、 创建表
create table 表名(
字段名1 字段类型 约束条件1,约束条件2 说明,
字段名2 字段类型 约束条件1,约束条件2,说明,
字段名3 字段类型3 约束条件3 说明3
);
约束条件介绍
comment --说明解释
not null --不为空
default --默认值
unsigned --无符号(正数)
auto_increment --自增
zerofill --自动填充
unique key --唯一值
primary key --主键
数据类型(字段类型)
--整数型
类型 大小 范围(有符号) 范围(无符号unsigned) 用途
TINYINT 1 字节 (-128,127) (0,255) 小整数值
SMALLINT 2 字节 (-32768,32767) (0,65535) 大整数值
MEDIUMINT 3 字节 (-8388608,8388607) (0,16777215) 大整数值
INT 4 字节 (-2147483648,2147483647) (0,4294967295) 大整数值
BIGINT 8 字节 () (0,2的64次方减1) 极大整数值
--浮点型
FLOAT(m,d) 4 字节 单精度浮点型 备注:m代表总个数,d代表小数位个数
DOUBLE(m,d) 8 字节 双精度浮点型 备注:m代表总个数,d代表小数位个数
--定点型(常用)
DECIMAL(m,d) 依赖于M和D的值 备注:m代表总个数,d代表小数位个数
--字符串类型
类型 大小 用途
CHAR 0-255字节 定长字符串
VARCHAR 0-65535字节 变长字符串
TINYTEXT 0-255字节 短文本字符串
TEXT 0-65535字节 长文本数据
MEDIUMTEXT 0-16777215字节 中等长度文本数据
LONGTEXT 0-4294967295字节 极大文本数据
--char的优缺点:存取速度比varchar更快,但是比varchar更占用空间
--varchar的优缺点:比char省空间。但是存取速度没有char快
--一般用varchar因为varchar是变长对于一些数据类型可以自动补充
-- 时间型
数据类型 字节数 格式 备注
date 3 yyyy-MM-dd 存储日期
time 3 HH:mm:ss 时分秒
year 1 yyyy 年
datetime 8 yyyy-MM-dd HH:mm:ss 日期+时间
timestamp 4 yyyy-MM-dd HH:mm:ss 日期+时间(时间戳)
例题:创建一个基本的学生表
CREATE TABLE student (
id tinyint(5) auto_increment default null comment '学生学号',
name varchar(20) default null comment '学生姓名',
age tinyint default null comment '学生年龄',
class varchar(20) default null comment '学生班级',
sex char(5) not null comment '学生性别',
addr varchar()20 null comment '学生家庭地址'
unique key (id)
)engine=innodb charset=utf8;;
八、查看数据库中的所有表
show tables;
九、查看表结构:
desc 表名;
十、查看创建表的sql语句
show create table 表名;
十一、数据库必备知识-----表的维护与删除
修改表名
rename table oldtable to newtable;
给表添加一列
alter table 表名 add 列名 类型
-- alter table student add addr varchar(20);
修改表的类型
alter table 表名 modify 列名 新类型;
-- alter table student modify addr char(20);
修改列的名
alter table 表名 change 旧列名 新列名 类型;
-- alter table student change addr addrs char(20);
删除列
alter table 表名 change drop 列名;
修改字符集
alter table 表名 character set 字符集;
删除表
drop table 表名;
十二、表的新增
普通插入
insert into 表名(字段名) values (字段对应的值);
-- insert into student(addr,age) values('山东','18');
insert into 表名 values (所有字段对应的值)
-- 插入多个值
insert into 表名 (字段名) values (对应值1),(对应值2),(对应值3);
--一次性插入多个数据
蠕虫复制(将一张表的数据复制到另一张表中)
insert into 表1 select * from 表2;
--将表2复制到表1里面去
insert into 表名1(字段名1,字段名2) select 字段名1,字段名2 from 表名2;
-- 部分复制
建表复制
creat table 表1 as select 字段1,字段2 from 表名2
十三、表数据的修改以及删除
修改
update 表名 set 字段名=值 where 字段名=值
---将where后面的修改成前面的
删除
delete from 表名 where 字段名=值;
--删除字段
truncate table 表名;
--truncate 翻译为截断 == 删除
delete from 表名;
drop table 表名;
三者区别:
delele会把删除的操作记录给记录起来,以便数据回退,不会释放空间,而且不会删除定义。
truncate不会记录删除操作,会把表占用的空间恢复到最初,不会删除定义
drop会删除整张表,释放表占用的空间。
十四、关于表相关的查询语句(DQL)
where查询
简单查询
select *
from 表名;
精确查询
select * from 表名where 字段=值;
模糊查询
select * from employee where ename like '林%';
-- %A 代表查询逸A结尾的字符串;A%代表A开头的字符串
范围查询
select * from 表 where 字段 between 值1 and 值2
离散查询
select * from 表名 where 字段 in ('猴子','林俊杰','小红','小胡');
清除重复值
select distinct(job) from 表名;
-- distinct 去重
统计查询(聚合函数):
count(code)或者count(*)
select count(*) from employee;
select count(ename) from employee;
sum() 计算总和
select sum(sal) from employee;
max() 计算最大值
select * from employee where sal= (select max(sal) from employee);
avg() 计算平均值
select avg(sal) from employee;
min() 计算最低值
select * from employee where sal= (select min(sal) from employee);
concat函数: 起到连接作用
select concat(ename,' 是 ',job) as aaaa from employee;
group by分组查询
作用:把行 按 字段 分组
语法:group by 列1,列2…列N
适用场合:常用于统计场合,一般和聚合函数连用
select deptnu,count(*) from employee group by deptnu;
having条件查询
作用:对查询的结果进行筛选操作语法:having 条件 或者 having 聚合函数 条件
适用场合:一般跟在group by之后
order by排序查询
desc 降序默认升序select * from employee order by sal;-- 升序
limit限制查询
limit n,m n:代表起始条数值,不写默认为0;m代表:取出的条数exists型子查询
exists子查询,如果exists后的内层查询能查出数据,则返回 TRUE 表示存在;为空则返回 FLASE则不存在
select * from 表名 a where exists (select 1 from 表名2 where 条件);
-- 如果后面的表true则返回
左连接查询与右连接查询(外连接)
左连接关键字:left join 表名 on 条件 / left outer 表名 join on 条件
右连接关键字:right join 表名 on 条件/ right outer 表名 join on 条件
注:左连接,左边的表会全显示出来,右面的只会显示符合条件的。
右查询同理
内连接查询与联合查询
内连接:获取两个表中字段匹配关系的记录
主要语法:INNER JOIN 表名 ON 条件;
eg:想查出员工张飞的所在部门的地址
select a.addr from dept a inner join employee b on a.deptnu=b.deptnu and b.ename='张飞';
select a.addr from dept a,employee b where a.deptnu=b.deptnu and b.ename='张飞';
联合查询
... UNION ... (去除重复) 主要语法2:... UNION ALL ...(不去重复)
注意事项:
(1)两个select语句的查询结果的“字段数”必须一致;
(2)通常,也应该让两个查询语句的字段类型具有一致性;
(3)也可以联合更多的查询结果;
(4)用到order by排序时,需要加上limit(加上最大条数就行),需要对子句用括号括起来
对销售员的工资从低到高排序,而文员的工资从高到低排序
(select * from employee a where a.job = '销售员' order by a.sal limit 999999 )
union
(select * from employee b where b.job = '文员' order by b.sal desc limit 999999);