1、安装和配置
#ubuntu安装
sudo apt-get install -y mysql-server mysql-client libmysqlclient-dev
#mac采用官网安装
在mac的系统偏好设置中,启动mysql数据库
#配置
#在这个文件中~/.bash_profile添加下面的语句
export PATH=$PATH:/usr/local/mysql/bin
#然后继续输入下面的语句
source ~/.bash_profile
2.解决mysql登录过程中access denied for user问题,我出现这个问题的原因是设置了密码为空,下面的解决的措施为对password进行更新。下面的解决方法参考有两个,其中第一篇是针对mysql5.6版本及以前的版本,第二篇是针对mysql5.7版本,这两个版本的区别是5.7版本不存在password字段,而只有authentication_string字段。因此在进行设置的有区别,两篇文章的链接如下所示:
Mac下新安装的MySQL无法登陆root用户解决方法
mysql 5.7.10 Access denied for user 'root'@'localhost'
设置的步骤如下所示:
1、先在系统偏好设置中关闭MySQL服务;
2、在终端中输入
sudo su
mysqld_safe --skip-grant-tables --skip-networking &
这时便能越过权限表,直接登陆MySQL了
3、新建一个终端,输入
mysql>mysql -u root
4、 在MySQL中修改root用户密码即可:
mysql>UPDATE mysql.user SET authentication_string=PASSWORD('root') WHERE User='root';
上一条语句是针对mysql5.7版本,下面是针对mysql5.6及以前的版本
mysql>UPDATE mysql.user SET password=PASSWORD('root') WHERE User='root';
mysql>FLUSH PRIVILEGES;
备注:这里的PASSWORD的作用应该和rails中has_secure_password类似。
5、在此使用的手显示如下提示
You must reset your password using ALTER USER statement before executing this statement.
输入如下的更新代码:
mysql>SET PASSWORD = PASSWORD('root');
3、mac下出现权限问题,数据库不能启动
#问题
Warning:The /usr/local/mysql/data directory is not owned by the 'mysql' or '_mysql'
#解决方式
sudo chown -R mysql /usr/local/mysql/data
4、使用另外设置的环境变量填充config/database.yml中的password
参考,步骤如下所示:
#config/application.rb的module之前添加下列语句
ENV.update YAML.load_file('config/application.yml')[Rails.env] rescue {}
#config/application.yml中增加下面内容
production:
<<: *defaults
username: root
password: root
#在config/database.yml中添加下面内容
production:
username: <%= ENV['username']%>
password: <%= ENV['password'] %>
5、建立用户
#进入root用户
#创建用户
create user hug@localhost identified by '123456'
#赋予权限
grant all on mysql.* to hug@localhost;
#更新权限
flush privileges
#删除用户
use mysql;
show tables; #显示user表格
delete from user where user="test"
6、mysql基本操作
#基本操作
mysql -u root -p #进入数据库
show databases; #显示数据库
create database demo; #创建数据库
drop database demo; #删除数据库
use demo; #使用数据库,如果要使用数据库,必须使用这条语句
show tables; #显示表格
drop table demo; #删除数据表
#创建表单
#其中null null表示该字段必须为非空
create table MyClass(
#(4)规定整数位的最大位数
id int(4) not null primary key auto_increment,
name char(20) not null,
sex int(4) not null default '0',
#其中16表示数字的最大位数,2表示小数点的最大位数
degree double(16,2));
#修改数据表
rename MyClass to Demo; #改变表单名字
alter table MyClass add email varchar(20) #增加字段
alter table MyClass drop email #减少字段
#显示表单信息
show columns from study
或者
describe study
#插入数据
insert into Demo(name, set, degree)values("jayzen", 1, 12.2),("jay", 2, 13.0);
或者
insert into Demo values("zen", 1, 1.2)
#修改数据
update Demo set name = 'zjj' where id=1
#删除数据
delete from demo where id=1
#查询数据
select * from demo;
#查看名字以h或者H打头的用户信息
select * form demo where name like 'h%'
#取n条从m+1条开始的记录
select * from demo limit m, n
#取介于两个id值之间的记录
select * from demo where id between 20 and 30
#使用distinct过滤掉重复内容
select distinct name from demo
#如果是字符,需要用引号应用起来
select * from demo name="jayzen"
#如果是数值,可以不用添加引号
select * form demo id=1
#使用distinct选择唯一值
select distinct name form demo;
#使用order by进行排序
select * from demo order by id asc 升序
select * from demo order by id desc 降序
#使用and或者是or进行选择
select * from demo where name="jayzen" and id=1;
select * from demo where name="jayzen" or id=1;
7、mysql高级操作
#限定获取数据的数量
select * from test limit 2; #获取两条数据
#使用like语句
select * from test where name like "n%"; #以n开头
select * from test where name like "%n"; #以n结尾
select * from test where name like "%n%"; #包含n的值
#通配符使用
通配符 描述
% 替代一个或多个字符
_ 仅替代一个字符
[charlist] 字符列中的任何单一字符
[^charlist]或者[!charlist] 不在字符列中的任何单一字符
#使用in操作符获取多个值
select * from test where name in ('demo1', 'demo2');
#使用between and 获取出去两个数值之间的值
select * from test where degree between 10 and 20;
#使用as方法来表示别名
#使用字段别名
select name as a from demo; #获取的字段名称叫做"a"
#使用表格别名,存在两个表格中,存在外键关联
select a.name, b.name from demo as a, demo_test as b where a.id=b.demo_id;
#使用join方法对两表进行关联
#常规方法
select demo.name, demo_test.name from demo, demo_test where demo.id=demo_test.demo.id;
#使用join方法,注意没有where字段
select demo.name, demo_test.name from demo inner join demo_test on demo.id=demo_test.demo.id;
join(inner join) #两边都匹配,满足返回
left join(left outer join) #右边即使没有匹配项,也返回左边的数据项
right join(right outer join) #左边即使没有匹配,也返回
full join(full outer join) #只要选择的字段存在,不管是否匹配,都满足
#使用union合并两个选择结果,union和union all作用相同
#限制条件是选择的字段数量必须相同,字段类型必须相同
select name from demo union select name from demo_test;
#使用约束字段
not null #使得字段非空
unique #使得字段唯一 mysql中使用这种方式 unique(id)
primary key #主键 mysql中使用这种方式 primary key(id)
foreign key #外键 mysql使用foreign key(demo_id) references demo(id)
check #使用对值进行限定 check (id>0)
default #使用默认值 varchar name default "jayzen"
#建立索引
create index index_name on table_name(column_name)
#使用drop 删除
drop database test; #删除数据库
drop table test; #删除表单
truncate table test; #清空数据
alter table table_name drop index index_name; #删除索引
#使用alter改变数据表单内容
alter table table_name add column_name varchar; #增加字段
alter table table_name drop column column_name; #删除字段
#主键一般设置increment
id int not null auto_increment, primary key(id)
#使用group by对结果进行分组
select customer, sum(orderprice) from orders group by customer;
#对结果按照customer分组,customer的属性值只出现一次,并对orderprice进行求值
#使用having进行判断取舍
select customer, sum(orderprice) from orders group by customer having sun(orderprice) < 2000;
#使用date的时间函数
date(datetime) #获取时间字段的日期部分
#导入和导出数据
返回到控制台界面
mysqldump -uroot -proot demo>demo.sql #导出数据
mysql -uroot -proot demo
8、不能连接问题
Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock'
在mac和ubuntu中进行切换的时候会出现如下问题,暂时没有搞明白,不过解决方式是把数据库配置文件的一句话给删除
socket: /var/run/mysqld/mysqld.sock
9、数据库的索引
为数据库的字段添加索引是为了方便检索,如果不添加索引,数据库查找的方式是遍历整张表,如果添加了索引,就可以通过索引的方式(比如二分法查找)节约查找的时间。
#使用benchmark进行查找测试,其中name添加了唯一性索引,content没有添加索引
require 'benchmark'
n = 50000
Benchmark.bm do |x|
x.report { n.times do
Article.find_by(name: "name1")
end}
x.report { n.times do
Article.find_by(content: "content1")
end}
end
在rails中默认建立一张表格的时候,id是默认建立索引的,而且是唯一索引,在mysql中查找索引的方式如下:
show index from articles; #以articles表单为例
显示的结果如下:
其中non_unique的值为0,表示的为该表中的id的值为唯一性字段。如果要生成一个表单字段,并且将其建立索引,并且设置为唯一性索引(添加了唯一性索引是指该字段的值在整个表单中是唯一的,不能重复),方式如下:
class AddTagToArticles < ActiveRecord::Migration[5.0]
def change
add_column :articles, :tag, :integer #添加tag字段
add_index :articles, :tag, unique: true #增加tag索引,并且添加唯一性索引
end
end
在rails中的has_many through经常出现第三张表格,可以使用复合索引,并且建立唯一性索引,方式如下:
add_index :readings, [:person_id, :article_id], unique: true #复合索引并且是唯一性索引