Mysql数据库操作
1.SQL语句分类
(1)DDL(Data Definition Laguage):数据库定义语言,用来定义数据库对象,库
表,列等;
创建,删除,修改,库、表结构
(2)DML(Data Manipulation Language):数据库操作语言,用来定义数据库记录
(数据);
增,删,改,表记录
(3)DCL(Data Control Language):数据库控制语言,用来定义访问权限和安全级别
(4)DQL(Data Query Language):数据库查询语言,用来查询记录(数据)
2.数据库
(1)查看所有数据库
show databases;
(2)选择要操作的数据库
use 数据库名;
(3)创建数据库
create database [if not exists] 数据库名;
(4)删除数据库
drop database [if exists] 数据库名;
(5)修改数据库编码
alter database 数据库名 character set utf8;
3.表
(1)创建表:
create table [ if not exists] 表名(列名 列类型,列名 列类型,....);
(2)查看当前数据库中所有表名称:show tables;
(3)查看指定表的创建语句:show create table 表名;
(4)查看表结构:desc 表名;
(5)删除表:drop table 表名;
(6)修改表:前缀: alter table 表名
修改之添加列
alter table 表名 add(
列名 列类型,
列名 列类型,
列名 列类型,
..............
);
修改之修改列类型(如果被修改的列已存在数据,那么新的类型可能会影响到已存在数据)
alter table 表名 modify 列名 列类型;
修改之修改列名
alter table 表名 change 原列名 新列名 列类型;
修改之删除列
alter table 表名 drop 列名
修改表名称
alter table 原表名 raname to 新表名
(7)表的复制
只复制表的结构
create table 复制后的表名 like 被复制的表名;
复制表的结构+表的数据
create table 复制后的表名
select * from 被复制的表名;
4.DQL操作
(1)基本查询
A.字段(列)控制
a.查询所有列
select * from 表名;
b.查询指定列
select 列1 [,列2,... 列n] from 表名;
c.完全重复的记录只一次
当查询结果中的多行记录一模一样时,只显示一行。
select distinct * |列1 [,列2,....列n] from 表名;
d.列运算
1)数量类型的列可以作加,减,乘,除运算。
select sal*2 from emp;
2)字符串类型可以做连续运算
select concat('$',sal) from emp;
3)转换null值
又是需要把null值转换成其他值,例如com+100时,如果com列存在null值,那么null
+100还是null,为了避免这种情况,我们需把null转换成0,例如:
select ifnull(com,0)+100 from emp;
ifnull(com,0);如果com中存在null值,那么当成0来运算。
4)给列起别名
select 原列名 as 新列名 from 表名;
其中as可以省略。
(2)条件控制
A.条件查询
select语句使用where子句控制记录,例如:
select empno,ename,sal,com from where sal>1000 and comm is not null;
select empno,ename,sal from emp where sal betweeen 2000 and 3000;
select empno,ename,job from emp where job in ('经理','董事长');
B.模糊查询
当你想查询姓李,并且姓名一共两个字的员工时,这时使用模糊查询
select * from emp where ename like '李';
模糊查询需要使用运算符:like,其中_匹配一个任意字符,只匹配一个字符
如果我们查询姓李,名字多个字符时可以使用“%”;
select * from emp where ename like '张%';
其中%可以匹配0~n个任意字符
(3)排序
1)升序
select * from where emp order by sal asc;
sal按升序排列
其中asc可以省略
2)降序
select * from where emp order by com desc;
com按降序排列
desc不可以省略
3)使用多列作为排序条件
select * from where emp order by sal asc, com desc;
5.DML操作
(1)插入数据
insert into 表名(列名1,列名2,列名3,....)values(列值1,列值2,列值3,....);
insert into 表名 values(列值1,列值2,...);
没有给出要插入的列,那么表示插入所有列。
(2)修改数据
update 表名 set 列名1=列值1,列名2=列值2,...[where 条件];
条件可选,必须是一个boolean类型的值或表达式。
(3)删除数据
delete from 表名 [where 条件];
6DCL操作
(1)创建用户
create user 用户名@IP地址 identified by '密码';
用户只能在指定的IP地址上登录
create user 用户名@'%' identified by '密码';
用户可以在任意IP地址上登录
(2)给用户授权
grant 权限1,...,权限n on 数据库.* to 用户名@IP地址
grant all on 数据库.* to 用户名@IP地址
给用户分派指定数据库上的所有权限。
(3)撤销授权
revoke 权限1,...,权限n on 数据库.* from 用户名@IP地址
撤销指定用户在制定数据库上的指定权限
(4)查看权限
show grants for 用户名@IP地址
查看指定用户的权限
(5)删除用户
drop user 用户名@IP地址
6.聚合函数
聚合函数用来做某列的纵向运算。
1)count
select count(*) from emp;
就算emp表中所有列都不为null的记录的行数。
2)max
select max(sal) from emp;
查询最高工资
3)min
select min(sal) from emp;
查询最低工资
4)sum
select sum(sal) from emp;
查询工资和
5)avg
select avg(sal) from emp;
查询平均工资
7.分组查询
分组查询是把记录使用某一列进行分组,然后查询组信息
例如:查询所有部门的记录数
select deptno, count(*) from emp group by deptno;
使用deptno 分组,查询部门编号和每个部门的记录数
select job,max(sal) from emp group by job;
使用job分组,查询每种工作的最高工资
组条件
以部门分组,查询每组记录数,条件为记录数大于3
select deptno,count(*) from emp group by deptno having count(*)>3;
8 limit子句
limit用来限定查询结果的起始行,以及总行数。
例如: 查询起始行为第五行,一共查询3行记录
select * from emp limit 4,3;
其中4表示从第五行开始,其中3表示一共查询3行,即5,6,7行记录.
一般查询的关键字顺序为select, from ,where ,group by ,having, order by。
9.mysql编码问题
1)查看mysql数据库编码
show variables like 'char%';
2)编码解释
character_set_client: mysql使用该编码来解读客户端发送过来的无数据,例如该编码为
utf8,那么客户端发送过来的数据不是utf8,那么就出现乱码。
character_set_result :mysql会把数据转换成该编码后,再发送给客户端,例如该编码为utf8
,那么如果客户端不使用utf8解读,那么就会乱码。
3)控制台乱码
插入或修改时出现乱码
这是因为cmd下默认使用GBK,而character_set_client不是GBK原因,我们只需
让这两个编码相同即可,即设置character_set_client为GBK。
查询出的数据为乱码
这是因为character_set_result不是GBK,而cmd默认使用GBK原因,我们只需
让这两个编码相同即可,即设置character_set_client为GBK。
设置变量语句:
set character_set_client=gbk;
set character_set_result=gbk;
注意: 设置变量只对当前连接有效,当退出窗口后,再次登录mysql,还需要再次设置变量。
为了一次性更正,可以在my.ini中设置
default-character-set=gbk即可
4)指定默认编码
在my.ini配置文件中设置character-set-server=utf8即可