*******************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> select user,password from mysql.user; 查看所有的用户和密码 mysql> delete * from mysql.user where password = ''; 删除用户密码为空的 mysql> grant all on *.* to 'eva'@'%'; # 创建账号并授权 mysql> grant all on *.* to 'eva'@'%' identified by '123' mysql>flush privileges # 执行起效 注意: 当你创建成功后, 西哟啊登录被创建的用户 需要把 skip-grant-tables 添加到本地存储mysql中的my.ini 文件中
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 旧字段名 新字段名 旧数据类型 [完整性约束条件…]; change比modify还多了个改名字的功能.把旧的字段与属性一起改变
删: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', #大部分是男的 不为空默认是femaleage int(3) unsigned not null default 28,#--------------->非符号 不为空 默认 28 hire_date date not null,#------------->年月日时分秒post varchar(50),#----------->字符串50post_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参考 女神博客 薪资:',salary,'> 名字:',emp_name,'> 薪资:',salary,'> 名字:',emp_name,'> 薪资:3000> 名字:egon>