MySQL数据库的使用
TRUNCATE TABLE a;
重置主键自增计数器(id从0开始递增): ALTER TABLE a AUTO_INCREMENT = 1;
ALTER TABLE a ADD CONSTRAINT unique_dN UNIQUE (dN);
删除 UNIQUE 约束: ALTER TABLE a DROP INDEX unique_dN;
SET GLOBAL max_connections = 500;
SHOW VARIABLES LIKE 'max_connections';
-- 把 modeldownload 表里 id 字段删除,然后重新生成 id 字段从0开始自增
-- 在 Navicat 里面使用 sql 语句:查询 -> 新建查询
ALTER TABLE modeldownload DROP id;
ALTER TABLE modeldownload ADD COLUMN id INT AUTO_INCREMENT PRIMARY KEY FIRST;
1.简单使用:
1.1:找到MySQL服务:计算机(右键)——管理——服务和应用程序——服务——MySQL(右键可停用或启用;默认自动启用)
1.2:cmd启动/停止:net stop 服务名称 / net start 服务名称)
1.3:客户端登陆MySQl数据库:mysql -uroot -p密码(可以先输mysql -uroot -p 再会车输入密码,这样密码将不显示)
1.4:退出:exit
2.常用命令(注意:varchar后面要带默认值):
查看mysql数据库中有哪些数据库: show databases;
创建数据库:create database 数据库名;
删除数据:drop database 数据库名;
使用某个数据库:use 数据库名;
查看当前数据库所有表:show tables;
查看表中所有数据:select * from 表名;
导入文件数据:source 文件路径(不要有中文后面不加分号直接回车)
看版本:select version();
查看当前数据库:select database();
查看表结构:desc 表名;
查一个表里的其中一个字段的所有内容(查多个字段的所有内容用逗号隔开,查询所有字段里的所有内容 select * from 表名):select 字段名,字段名 from 表名
创建表:create table 表名(
id int primary key, // 字段id 数字类型 设为主键
name char(5), //字段name 字符串类型(定长5个,不够自动加空白)
vipname varchar not null unique, //字段vipname 字符串类型 不可为空 不能重复(同时存在not null和unique将自动设为主键)
cno int, //字段cno 数字类型
foreign key(cno) references xx(id) //设本表字段cno 为xx表的字段id的外键
)
删除表:drop table if existd xxx; //如果xxx表存在就将它删除(也可以不加 if existd )
插入记录(数据):insert into xx(id, name) values(1, 'zhangsan'); //往xx表中的id,name字段分别插入 1,'zhangsan' 记录( 如果直接写 xx() 的话默认插入全部字段;插入多条记录后面直接继续跟着写就好了)
删除记录(数据):delete from xx where id=2; //删除xx表中id为2的这条记录(没有条件就将整张表清空)
修改记录(数据):update xx set name='wangwu' where id=1; //修改xx表中id为1的name字段里的记录为wangwu
3.常见数据类型:
varchar:可变长度字符串,最长255
char:定长字符串(设置固定长度),最长255
int:整数
bigint:长整数
float:单精度浮点
double:双精度浮点
data:短日期
datatime:长日期
clob:字符大对象(超过255的字符)
blob:二进制大数据(图片,声音,视频)
4.示例:
字符意思:or = ||; and = &&; is null = 为空;is not null = 不为空
技巧:由于查询顺序为 from(连接表) --> where(条件查询) --> group by(分组查询) --> having(分组条件查询) --> select(字段名(最后会打印输出)) --> order by(打印输出结果按顺序排列) -->limit(取多少个);所以不熟悉的时候在使用分组查询时就不要使用条件查询了用自己的分组条件查询就好了
模糊查询like(下划线表示一个占位字符,%表示开头结尾): 查询名字中含有o的: select name from emp where name like '%o%'; 查询名字以k结尾的: select name from emp where name like '%k'; 查询名字以k开头的: select name from emp where name like 'k%'; 查询名字第二个字母是k的: select name from emp where name like '_k%';
查询结果排序(order by): 查询所有员工工资,按升序排(从小到大): select name,sal from emp order by sal; // 默认就是升序,所有写个工资字段就可以了,非要写的话升序是 asc 查询所有员工工资,按降序排(从大到小): select name,sal from emp order by sal desc;
查询所有员工工资和名字,按工资升序排,如果工资一样,按名字升序排:
select name,sal from emp order by sal asc, name asc; // sal在前启主导作用,只有sal相同的时候才会执行name asc
单行处理函数(一个输入对应一个输出, 就是对每一条数据都处理): lower(结果转小写): slect lower(name) from emp; upper(结果转大写): slect upper(name) from emp; substr(截取字符): slect substr(name,1,1) from emp; //第一个1是length且包括,第二个是需要截取的长度 concat(字符拼接): slect concat(name,empno) from emp; //将两个字段的字符无缝拼接最后打印出来 length(取长度): slect length(name) from emp; // 每个数据打印一个长度数字 trim(去空格): select * from emp where name = trim(' kinc') //这样基本这个kinc前面有空格也可以打印出来了
rand(随机数),round(取整):
select rand() from emp;
select round(rand()*100, 0) from emp; // 得100以内的随机整数
多行(分组)处理函数(不能写在where里;多输出得一个结果;自动忽略null): max(最大值): select max(sal) from emp; min(最小值): select min(sal) from emp; sum(求和): select sum(sal) from emp; avg(求平均值): select avg(sal) from emp; count(计数, 如计算员工数量): select count(name) from emp; //得一个结果如:18; 统计了该字段下所有不为null的数据的总数;count(*):统计表的总行数
分组查询(group by): 根据工作岗位分组,然后对工资求和: select name,job,sum(sal) from emp group by job; // 分组函数可用因为没有where 找出每个部门,不同工作岗位的最高工资(技巧:两字段联合成1个字段看): select deptno,job,max(sal) from emp group by deptno,job; 找出每个部门,显示最高工资大于3000的: select deptno,max(sal) from emp group by deptno having max(sal) > 3000; // 效果更高的办法先将大于3000的找出来然后再分组: select deptno,max(sal) from emp where sal > 3000 group by deptno; 所有能用where的就先用它,如果没办法了就用having,如下 找出每个部门的平均工资,要求显示平均工资高于2500的: select deptno,avg(sal) from emp group by deptno having avg(sal) > 2500
跨表查询: select ename,dname from emp,dept // 这样如果没有条件限制将产生笛卡尔积现象 select ename,dname from emp,dept where deptno = deptno // 增加条件emp表里的deptno字段等于dept表里的deptno字段,这样至少没有重复的数据,但匹配次数貌似还是那么多,所以要给表起别名,所有请往下看
内连接(join前的inner可以省略,无主次之分): 查询每个员工所在的部门,显示员工名和部门名: sql92语法: select e.ename, d.dname from emp e, dept d where e.deptno = d.deptno; sql99语法(表有自己的连接条件,不需要用where了,你要再加条件后面加where即可,92的话就要加and什么什么的这样99就分离了): select e.ename, d.dname from emp e join dept d on e.deptno = d.deptno; 自连接(一张表看出两张表): 查询员工的上级领导,要求显示员工名和对应的领导名: select a.ename, b.ename from emp a join emp b on a.mgr = b.empno // 员工的领导编号等于领导的员工编号 外连接(join前的outer可以省略,有主次之分,除了结果满足on条件里要求之外,第一个表或第二个表没有满足条件的也要查出来):
语法: select e.ename, d.dname from emp e right join dept d on e.deptno = d.deptno; // 除了将两表满足条件的查出来还要把dept表没有满足条件的(全部)也查出来,因为dept表在join右边所以join前加right,表示将join右边的表当成主表,主要将这个表的数据全部查出来,捎带着关联查询左边的表
查询每个员工的上级领导,要求显示所有员工的名字和领导名:
select
a.ename, b.ename
from
emp a left join emp b
on
a.mgr = b.empno;
多表查询(一条sql语句中内、外、自连接可以同时出现):
语法:
select
...
from
a
join
b
on
a和b的连接条件
join
c
on
a和c的连接条件
right join
d
on
a和d的连接条件
找出每个员工的部门名称以及工资等级,要求显示员工名、部门名、薪资、薪资等级:
select
e.ename, e.sal, d.dname, s.grade
from
emp e
join
dept d
on
e.deptno = d.deptno
join
salgrade s
on
e.sal between s.losal and s.hisal; // 在它们之间
---------------------------------------------------------------------------------------- 重要的函数:
查询效率更高使用union(要求结果列数一样,数据类型最好也一样,mysql不报错其它数据库报错):
select ename,job from emp where job in('aaa','bbb') // in包含
select ename,job from emp where job in('aaa')
union // 将查询的结果拼装
select ename,job from emp where job in('bbb')
limit使用:
按照工资降序排取前5个:
select
ename,sal
from
emp
order by
sal desc
limit 5;
取出工资排名在3-5名的员工:
select
ename,sal
from
emp
order by
sal desc
limit
2,3; // 2是索引(即第3条数据),3是个数
嵌套查询(可理解为合并语句使用): 可以出现的地方: select ...(select)... from ...(select)... where ...(select)... where里的嵌套演示: 找出比最低工资高的员工姓名和工资(注:where里不能用分组函数): 1.查最低工资是多少:select min(sal) from emp; 2.找出大于800的员工及其工资:select ename,sal from emp where sal > 800 3.合并:select ename,sal from emp where sal > (select min(sal) from emp); from里的嵌套演示(from后面的嵌套查询,可以将其查询结果当做一张临时表): 找出每个岗位的平均工资的工资等级: 1.找出每个岗位的平均工资:select job,avg(sal) from emp group by job; 2.把上一步的查询结果再当成一张表t,让它和另一张表进行连接: select t.*, s.grade from (select job,avg(sal) as avfsal from emp group by job) t join salgrade s on t.avg(sal) between s.losal and s.hisal; select里嵌套演示(这里面的嵌套查询只能一次返回一条结果不然就报错) select e.ename,e.deptno,(select d.dname from dept d where e.deptno = d.deptno) as dname from emp e
创建表: create table student(id int primary key auto_increment, name varchar(255),age int,score int); create table student(id int primary key, name varchar(255),age int, score int); 删除表: drop table student 插入数据: insert into student(id, name,age,score) values(2,'bb',22,90) 更新数据: updata student set score = 100 where id = 3; 查找数据: select * from student; select score from student where name = 'bb'; 删除数据 delete from student where name = 'bb'
5.问题处理:
数据库正常设置存不了中文:
5.1:对要存中文的表:设计表 -- 选项 -- 字符集选utf8
5.2:对表里的字段:字符集选utf8
本文来自博客园,作者:封兴旺,转载请注明原文链接:https://www.cnblogs.com/fxw1/p/14302424.html