*******************mysql 初级语句
mysql> select user(); #查看当前用户
mysql> exit # 也可以用\q quit退出
mysql> set password = password(‘root‘); # 给当前数据库设置密码
mysql> create user ‘eva‘@‘192.168.10.%‘ IDENTIFIED BY ‘123‘;# 指示网段
mysql> create user ‘eva‘@‘192.168.10.5‘ # 指示某机器可以连接
mysql> create user ‘eva‘@‘%‘ #指示所有机器都可以连接
mysql> show grants for ‘eva‘@‘192.168.10.5‘;查看某个用户的权限
mysql> grant all on *.* to ‘eva‘@‘%‘;
# 创建账号并授权
mysql> grant all on *.* to ‘eva‘@‘%‘ identified by ‘123‘
mysql> create database staff;创建库
mysql> use staff;到当前库下
创建表
mysql> create table staff_info (id int,name varchar(50),age int(3),sex enum(‘male‘,‘female‘),phone bigint(11),job varchar(11));
查看表结构
show tables; 当前所有表
desc 表名字; 查看表的基础信息
describe 表名字; 查看表的基础信息
show create table 表名 \G; 查看表的详细信息(编码 和 存储引擎)
celect * from 表名:
创建表
# create table 表名 (字段名 数据类型 约束条件)
查看表结构
# desc 表名;
# show create table 表名 \G;
1. 操作文件夹(库)
增:create database db1 charset utf8;
查:show databases;
改:alter database db1 charset latin1;
删除: drop database db1;
2. 操作文件(表)
先切换到文件夹下:use db1
增:create table t1(id int,name char);
查:show tables;
改:alter table t1 modify name char(3);
alter table t1 change name name1 char(2);
删:drop table t1;
3. 操作文件中的内容(记录)
增:insert into t1 values(1,‘egon1‘),(2,‘egon2‘),(3,‘egon3‘);
查:select * from t1;
改:update t1 set name=‘sb‘ where id=2;
删:delete from t1 where id=1;
清空表:
delete from t1; #如果有自增id,新增的数据,仍然是以删除前的最后一样作为起始。
truncate table t1;数据量大,删除速度比上一条快,且直接从零开始,
*auto_increment 表示:自增
*primary key 表示:约束(不能重复且不能为空);加速查找
********** 存储引擎********************************
一
# Innodb 支持事务,行级锁,外键 并发的事务 频繁的修改数据
# myisam 只支持表锁 对事务完整性要求不高 大量的查 插入 少量的修改和删除
# memory
# blackhole 主从多级复制的时候
二
# Innodb : 支持事务(什么是事务)\行级锁(特点)\外键(定义)
# myisam : 表级锁(特点)
# memory : 内存 快\不能完成数据的持久化存储,mysql server端重启失效 (缓存的作用)
# blackhole : 黑洞 所有的数据都可以写入 但是都不会真的记录在表当中
# (多级主从复制中的一台机器上的数据库常用的存储引擎)
# 事务 : n句sql是一个完整的事件,这n句sql要么一起成功,要么一起失败
# 两个典型的例子
# 招商银行的卡
# 王伟哲的钱 -200
# 我的钱 +200
# 刘亚军的钱 -200
# 我的钱 +200
# 锁
# 在一个人进行修改数据的时候,如果有人来读取数据了
# 在一个人进行修改数据的时候,如果有人来修改数据了
# 行级锁 :能够支持更多的修改数据的并发操作 当要修改的行数非常多的时候 效率也会受到影响
# 表级锁 :不能支持并发的修改同一张表中的数据 不需要加很多细粒度的锁来浪费时间
# 外键
# 在本表中有一个字段 关联 外表中的另一个字段
# memory 内存级别的存储引擎 : 缓存的作用 cache
# 断电消失的数据
# 存储一些对效率要求比较快的 但是丢失又不要紧的数据
# 把所有的视频都已 Innodb存储引擎的存储方式存在一张表里
# 存在硬盘上
# 把经常被点击的热数据 放到memory存储引擎中再存一次
# 存在内存中
*********************数据类型
# 数值 :整数(int)和小数float(n,m)
# n 表示一共有多少位,m表示小数点后面有多少位
# 字符串
# char 浪费空间 存取速度快
# 数据的长度相对固定 :手机号码 身份证号 ip地址 姓名 用户名
# varchar 节省空间 存取速度慢
# 数据的长度不固定 甚至值比较分散(len=1,256,3000)
# 时间
# year 年
# date 年月日
# time 时分秒
# datetime 年月日时分秒
# timestamp 默认插入now()混合日期和时间值,时间戳
# 字符串格式
# char 定长,存储相对浪费空间,存取速度快,不管你存储什么样的数据,他都会帮你把数据的空格在显示的时候去掉
# varchar 变长,相对节省空间,存取效率相对慢
# char(5) varchar(5)
# ‘a ‘,‘1a‘ 5个位置,2个位置 # 1个字符指的是 8bit 1个字节最多255
# ‘aaaaa‘,‘5aaaaa‘ 5个位置,6个位置 # 1个字符指的是 8bit 1个字节最多255
# char
# 手机号码 11位
# 身份证号 18/15
# 有限的 name(12)
# varchar
# 评论 不得低于10个字,不得超过255个字
# 备注
# concat(ch,‘+‘)
# enum和set
# enum 枚举 单选+不能选不在枚举范围里的
# set 集合 多选+去重+不能选不在集合里的
# create table t9 (name char(20),gender enum(‘female‘,‘male‘))
# 多选框--程序中 勾选
# create table t10 (name char(20),hobby set(‘抽烟‘,‘喝酒‘,‘烫头‘,‘翻车‘))
*************************************约束
# not null 非空
# default 默认值
# unique 唯一
# unique(字段1,字段2) 表示这两个字段联合唯一
# auto_increment 自增(int,unique) 只有唯一的在可以中增一般都是数字型 的
# primary key 主键(一张表只能有一个或一组) 非空+唯一
# foreign key 外键 关联的那个字段必须是唯一的
# on update cascade (级连更新)
# on delete cascade (级联删除)
# 表与表之间的关系
# 一对多 : foreign key
# 多对多 : 两张表变三张表 第三张表中存两个foreign key
# 一对一 : 外键字段unique
*******************************表的增删改操作;
# 表结构
# id name age sex
# create table t1 (id int primary key auto_increment,name char(12) not null,age int,sex enum(‘male‘,‘female‘));
# 增加数据
# insert into 表名 value (1,‘alex‘,83,‘不详‘); 一次插入一条数据
# insert into 表名 values (1,‘alex‘,83,‘不详‘),(2,‘wusir‘,74,‘male‘); 支持一次写入多条数据
# insert into 表名 (name,age,sex) values (‘alex‘,83,‘不详‘);
# 修改数据
# update 表名 set 字段名=值 where 条件
# update 表名 set 字段名1=值1,字段名2=值2 where 条件
# 删除数据
# delete from 表 where 条件;
# delete from 表; 清空表
# auto_increment
*****************************键表查:*************************
简单查询
mysql 语句的顺序
from, # 先找到表 from
where, # where约束条件,在文件中找记录,不能与聚合函数一起用
group by, # 将记录进行分组group by,如果没有,就整体为一组,可以与group conncat搭一起使用
select, # 执行select
distinct, # 如果没有group by,就用distinct进行去重,在select之后
having, # 进行having过滤, 只有group by使用时 才用
order by, # 按条件排序 order by
limit, # 限制结果显示的条数
复制代码
company.employee
员工id id int
姓名 emp_name varchar
性别 sex enum
年龄 age int
入职日期 hire_date date
岗位 post varchar
职位描述 post_comment varchar
薪水 salary double
办公室 office int
部门编号 depart_id int
#创建表
create table employee(
id int not null unique auto_increment, #------->把id设置为不为空,唯一,且是增的
emp_name varchar(20) not null,
sex enum(‘male‘,‘female‘) not null default ‘male‘, #大部分是男的 不为空默认是female
age int(3) unsigned not null default 28,#--------------->非符号 不为空 默认 28
hire_date date not null,#------------->年月日时分秒
post varchar(50),#----------->字符串50
post_comment varchar(100),
salary double(15,2),#---------------->浮点数
office int, #一个部门一个屋子
depart_id int
);
#
#
# insert into employee(emp_name,sex,age,hire_date,post,salary,office,depart_id) values
# (‘egon‘,‘male‘,18,‘20170301‘,‘老男孩驻沙河办事处外交大使‘,7300.33,401,1), #以下是教学部
# (‘alex‘,‘male‘,78,‘20150302‘,‘teacher‘,1000000.31,401,1),
# (‘wupeiqi‘,‘male‘,81,‘20130305‘,‘teacher‘,8300,401,1),
# (‘yuanhao‘,‘male‘,73,‘20140701‘,‘teacher‘,3500,401,1),
# (‘liwenzhou‘,‘male‘,28,‘20121101‘,‘teacher‘,2100,401,1),
# (‘jingliyang‘,‘female‘,18,‘20110211‘,‘teacher‘,9000,401,1),
# (‘jinxin‘,‘male‘,18,‘19000301‘,‘teacher‘,30000,401,1),
# (‘成龙‘,‘male‘,48,‘20101111‘,‘teacher‘,10000,401,1),
#
# (‘歪歪‘,‘female‘,48,‘20150311‘,‘sale‘,3000.13,402,2),#以下是销售部门
# (‘丫丫‘,‘female‘,38,‘20101101‘,‘sale‘,2000.35,402,2),
# (‘丁丁‘,‘female‘,18,‘20110312‘,‘sale‘,1000.37,402,2),
# (‘星星‘,‘female‘,18,‘20160513‘,‘sale‘,3000.29,402,2),
# (‘格格‘,‘female‘,28,‘20170127‘,‘sale‘,4000.33,402,2),
#
# (‘张野‘,‘male‘,28,‘20160311‘,‘operation‘,10000.13,403,3), #以下是运营部门
# (‘程咬金‘,‘male‘,18,‘19970312‘,‘operation‘,20000,403,3),
# (‘程咬银‘,‘female‘,18,‘20130311‘,‘operation‘,19000,403,3),
# (‘程咬铜‘,‘male‘,18,‘20150411‘,‘operation‘,18000,403,3),
# (‘程咬铁‘,‘female‘,18,‘20140512‘,‘operation‘,17000,403,3)
# ;
# select
# select * from 表名; * 表示所有的内容
# select 字段1,字段2 from 表; 表示查指定的列的内容
# select distinct 字段名 from 表; distinct关键字表示去重
# 在select字段可以使用四则(加减乘除)运算
# select 字段*12 from 表
# 可以给字段进行重命名
# select 字段 as 新字段名 from 表
# 两个格式化函数 concat() concat_ws()
# concat(‘自己想拼的内容‘,字段,‘你想拼的内容‘);
# concat_ws(‘:‘,字段1,字段2)
# 条件判断
# case
# when 条件1 then 字段的操作
# when 条件2 then 字段的操作
# else 字段的操作
# end
# 查出所有员工的名字,薪资,格式为
# <名字:egon> <薪资:3000>
# select emp_name,salary from employee;
# select concat(‘<名字:‘,emp_name,‘>‘),concat(‘<薪资:‘,salary,‘>‘) from employee;
# select concat(‘<名字:‘,emp_name,‘> <薪资:‘,salary,‘>‘) from employee;
*******************where条件
# 对表当中的数据进行一个条件的筛选
# 对一个值的判断
# = > < != <> >= <=
# 对一个范围的判断
# between 小的值 and 大的值 [小的值,大的值]
# in (值1,值2,值3,值4)
# 模糊匹配 like ‘%a_‘
# ‘a‘的名字
# ‘%a‘以a结尾,‘a%‘表示以a开头,‘%a%‘表示匹配中间带个a的字符串
# ‘%‘通配符 匹配任意长度的任意内容
# ‘_a‘ 表示任意的一个字符a,‘a__‘以a开头后面是任意的两个字符
# ‘_‘ 匹配一个长度的任意内容
# 多个条件的拼接
# 逻辑运算符
# and 两个条件必须都成立 才算成立
# or 只要有一个条件成立就成立
# not 非
# 查看岗位是teacher且薪资是10000或9000或30000的员工姓名、年龄、薪资
# select emp_name,age,salary from employee where salary in (30000,10000,9000) and post = ‘teacher‘;
# group by
# select 数据 from 表 where 条件 group by 分组
# select post from employee where depart_id > 1;
# select emp_name from employee where depart_id > 1 group by post;
# 结果 是 有多少个部门 就有多少条数据
# 聚合函数
# count(字段) 统计有多少条记录是符合条件的 只统计字段不为空的那一行数据
# count(*) 统计有多少条记录是符合条件的
# count(1) 统计有多少条记录是符合条件的
# min
# max
# avg
# sum
# 分组 + 聚合函数
# 求 各部门 的 平均工资
# select avg(salary) from employee group by post;
# having 过滤 关键字
# 都是根据分组的结果进行过滤的
# 推荐你 如果用了 分组 那么分组之后的条件 having来完成
# 求部门的平均薪资 在10000以上的部门名称?
# select post from employee group by post having avg(salary)>10000;
# where 再 group by 再 having
# 统一对一个组的数据进行进一步的筛选的时候,都是用having关键字
# 以后对于条件的使用,我们应该尽量使用where进行单条数据的筛选
# 只有在对分组之后的数据进行筛选的时候,才用having
# 聚合函数 算出来的结果 只是 代表一列的结果 我们并不能直接将这一列相关的一行数据直接取到
# select 性别,avg(age) from 表 group by 性别
# select 部门,avg(age) from 表 group by 部门
# order by 排序
# 先根据我们的条件找到所有符合条件的行
# 根据这些行中的某一个字段对这些信息进行排序
# 默认是升序 从小到大排 acs
# 降序 从大到小排 desc
# select name,age from employee where post = ‘teacher‘ order by age
# 求入职时间最短的人
# select emp_name,hire_date from employee order by hire_date desc;
# limit
# limit n 取n个
# limit m,n 从m +1 开始 取n条
# limit n offset m
参考
女神博客
原文:https://www.cnblogs.com/LMTlmt/p/10492234.html