1、安裝和配置
#ubuntu安裝
sudo apt-get install -y mysql-server mysql-client libmysqlclient-dev
#mac采用官網(wǎng)安裝
在mac的系統(tǒng)偏好設(shè)置中,啟動mysql數(shù)據(jù)庫
#配置
#在這個文件中~/.bash_profile添加下面的語句
export PATH=$PATH:/usr/local/mysql/bin
#然后繼續(xù)輸入下面的語句
source ~/.bash_profile
2.解決mysql登錄過程中access denied for user問題宴偿,我出現(xiàn)這個問題的原因是設(shè)置了密碼為空含长,下面的解決的措施為對password進(jìn)行更新。下面的解決方法參考有兩個畔规,其中第一篇是針對mysql5.6版本及以前的版本局扶,第二篇是針對mysql5.7版本,這兩個版本的區(qū)別是5.7版本不存在password字段叁扫,而只有authentication_string字段三妈。因此在進(jìn)行設(shè)置的有區(qū)別,兩篇文章的鏈接如下所示:
Mac下新安裝的MySQL無法登陸root用戶解決方法
mysql 5.7.10 Access denied for user 'root'@'localhost'
設(shè)置的步驟如下所示:
1莫绣、先在系統(tǒng)偏好設(shè)置中關(guān)閉MySQL服務(wù)沈跨;
2、在終端中輸入
sudo su
mysqld_safe --skip-grant-tables --skip-networking &
這時便能越過權(quán)限表兔综,直接登陸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的作用應(yīng)該和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下出現(xiàn)權(quán)限問題硬鞍,數(shù)據(jù)庫不能啟動
#問題
Warning:The /usr/local/mysql/data directory is not owned by the 'mysql' or '_mysql'
#解決方式
sudo chown -R mysql /usr/local/mysql/data
4、使用另外設(shè)置的環(huán)境變量填充config/database.yml中的password
參考戴已,步驟如下所示:
#config/application.rb的module之前添加下列語句
ENV.update YAML.load_file('config/application.yml')[Rails.env] rescue {}
#config/application.yml中增加下面內(nèi)容
production:
<<: *defaults
username: root
password: root
#在config/database.yml中添加下面內(nèi)容
production:
username: <%= ENV['username']%>
password: <%= ENV['password'] %>
5固该、建立用戶
#進(jìn)入root用戶
#創(chuàng)建用戶
create user hug@localhost identified by '123456'
#賦予權(quán)限
grant all on mysql.* to hug@localhost;
#更新權(quán)限
flush privileges
#刪除用戶
use mysql;
show tables; #顯示user表格
delete from user where user="test"
6、mysql基本操作
#基本操作
mysql -u root -p #進(jìn)入數(shù)據(jù)庫
show databases; #顯示數(shù)據(jù)庫
create database demo; #創(chuàng)建數(shù)據(jù)庫
drop database demo; #刪除數(shù)據(jù)庫
use demo; #使用數(shù)據(jù)庫,如果要使用數(shù)據(jù)庫糖儡,必須使用這條語句
show tables; #顯示表格
drop table demo; #刪除數(shù)據(jù)表
#創(chuàng)建表單
#其中null null表示該字段必須為非空
create table MyClass(
#(4)規(guī)定整數(shù)位的最大位數(shù)
id int(4) not null primary key auto_increment,
name char(20) not null,
sex int(4) not null default '0',
#其中16表示數(shù)字的最大位數(shù)伐坏,2表示小數(shù)點的最大位數(shù)
degree double(16,2));
#修改數(shù)據(jù)表
rename MyClass to Demo; #改變表單名字
alter table MyClass add email varchar(20) #增加字段
alter table MyClass drop email #減少字段
#顯示表單信息
show columns from study
或者
describe study
#插入數(shù)據(jù)
insert into Demo(name, set, degree)values("jayzen", 1, 12.2),("jay", 2, 13.0);
或者
insert into Demo values("zen", 1, 1.2)
#修改數(shù)據(jù)
update Demo set name = 'zjj' where id=1
#刪除數(shù)據(jù)
delete from demo where id=1
#查詢數(shù)據(jù)
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過濾掉重復(fù)內(nèi)容
select distinct name from demo
#如果是字符,需要用引號應(yīng)用起來
select * from demo name="jayzen"
#如果是數(shù)值握联,可以不用添加引號
select * form demo id=1
#使用distinct選擇唯一值
select distinct name form demo;
#使用order by進(jìn)行排序
select * from demo order by id asc 升序
select * from demo order by id desc 降序
#使用and或者是or進(jìn)行選擇
select * from demo where name="jayzen" and id=1;
select * from demo where name="jayzen" or id=1;
7桦沉、mysql高級操作
#限定獲取數(shù)據(jù)的數(shù)量
select * from test limit 2; #獲取兩條數(shù)據(jù)
#使用like語句
select * from test where name like "n%"; #以n開頭
select * from test where name like "%n"; #以n結(jié)尾
select * from test where name like "%n%"; #包含n的值
#通配符使用
通配符 描述
% 替代一個或多個字符
_ 僅替代一個字符
[charlist] 字符列中的任何單一字符
[^charlist]或者[!charlist] 不在字符列中的任何單一字符
#使用in操作符獲取多個值
select * from test where name in ('demo1', 'demo2');
#使用between and 獲取出去兩個數(shù)值之間的值
select * from test where degree between 10 and 20;
#使用as方法來表示別名
#使用字段別名
select name as a from demo; #獲取的字段名稱叫做"a"
#使用表格別名,存在兩個表格中金闽,存在外鍵關(guān)聯(lián)
select a.name, b.name from demo as a, demo_test as b where a.id=b.demo_id;
#使用join方法對兩表進(jìn)行關(guān)聯(lián)
#常規(guī)方法
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) #右邊即使沒有匹配項,也返回左邊的數(shù)據(jù)項
right join(right outer join) #左邊即使沒有匹配代芜,也返回
full join(full outer join) #只要選擇的字段存在埠褪,不管是否匹配,都滿足
#使用union合并兩個選擇結(jié)果,union和union all作用相同
#限制條件是選擇的字段數(shù)量必須相同挤庇,字段類型必須相同
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 #使用對值進(jìn)行限定 check (id>0)
default #使用默認(rèn)值 varchar name default "jayzen"
#建立索引
create index index_name on table_name(column_name)
#使用drop 刪除
drop database test; #刪除數(shù)據(jù)庫
drop table test; #刪除表單
truncate table test; #清空數(shù)據(jù)
alter table table_name drop index index_name; #刪除索引
#使用alter改變數(shù)據(jù)表單內(nèi)容
alter table table_name add column_name varchar; #增加字段
alter table table_name drop column column_name; #刪除字段
#主鍵一般設(shè)置increment
id int not null auto_increment, primary key(id)
#使用group by對結(jié)果進(jìn)行分組
select customer, sum(orderprice) from orders group by customer;
#對結(jié)果按照customer分組钞速,customer的屬性值只出現(xiàn)一次,并對orderprice進(jìn)行求值
#使用having進(jìn)行判斷取舍
select customer, sum(orderprice) from orders group by customer having sun(orderprice) < 2000;
#使用date的時間函數(shù)
date(datetime) #獲取時間字段的日期部分
#導(dǎo)入和導(dǎo)出數(shù)據(jù)
返回到控制臺界面
mysqldump -uroot -proot demo>demo.sql #導(dǎo)出數(shù)據(jù)
mysql -uroot -proot demo<demo.sql #導(dǎo)入數(shù)據(jù)
#啟動項目的時候指定數(shù)據(jù)庫
rails new demo --database=mysql
rails new demo -d=mysql #兩者選其一
#更改root用戶的密碼為"root"
use mysql;
update user set password=password('root') where user='root';
flush privileges;
8罚随、不能連接問題
Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock'
在mac和ubuntu中進(jìn)行切換的時候會出現(xiàn)如下問題玉工,暫時沒有搞明白,不過解決方式是把數(shù)據(jù)庫配置文件的一句話給刪除
socket: /var/run/mysqld/mysqld.sock
9淘菩、數(shù)據(jù)庫的索引
為數(shù)據(jù)庫的字段添加索引是為了方便檢索遵班,如果不添加索引,數(shù)據(jù)庫查找的方式是遍歷整張表潮改,如果添加了索引狭郑,就可以通過索引的方式(比如二分法查找)節(jié)約查找的時間。
#使用benchmark進(jìn)行查找測試汇在,其中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中默認(rèn)建立一張表格的時候,id是默認(rèn)建立索引的糕殉,而且是唯一索引亩鬼,在mysql中查找索引的方式如下:
show index from articles; #以articles表單為例
顯示的結(jié)果如下:
其中non_unique的值為0,表示的為該表中的id的值為唯一性字段殖告。如果要生成一個表單字段,并且將其建立索引雳锋,并且設(shè)置為唯一性索引(添加了唯一性索引是指該字段的值在整個表單中是唯一的黄绩,不能重復(fù)),方式如下:
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經(jīng)常出現(xiàn)第三張表格爽丹,可以使用復(fù)合索引,并且建立唯一性索引辛蚊,方式如下:
add_index :readings, [:person_id, :article_id], unique: true #復(fù)合索引并且是唯一性索引