mysql

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ù)合索引并且是唯一性索引
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末粤蝎,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子袋马,更是在濱河造成了極大的恐慌初澎,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件飞蛹,死亡現(xiàn)場離奇詭異谤狡,居然都是意外死亡灸眼,警方通過查閱死者的電腦和手機(jī)卧檐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來焰宣,“玉大人霉囚,你說我怎么就攤上這事∝盎” “怎么了盈罐?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長闪唆。 經(jīng)常有香客問我盅粪,道長,這世上最難降的妖魔是什么悄蕾? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任票顾,我火速辦了婚禮,結(jié)果婚禮上帆调,老公的妹妹穿的比我還像新娘奠骄。我一直安慰自己,他們只是感情好番刊,可當(dāng)我...
    茶點故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布含鳞。 她就那樣靜靜地躺著,像睡著了一般芹务。 火紅的嫁衣襯著肌膚如雪蝉绷。 梳的紋絲不亂的頭發(fā)上鸭廷,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天,我揣著相機(jī)與錄音熔吗,去河邊找鬼靴姿。 笑死,一個胖子當(dāng)著我的面吹牛磁滚,可吹牛的內(nèi)容都是我干的佛吓。 我是一名探鬼主播,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼垂攘,長吁一口氣:“原來是場噩夢啊……” “哼维雇!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起晒他,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤吱型,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后陨仅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體津滞,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年灼伤,在試婚紗的時候發(fā)現(xiàn)自己被綠了触徐。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡狐赡,死狀恐怖撞鹉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情颖侄,我是刑警寧澤鸟雏,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站览祖,受9級特大地震影響孝鹊,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜展蒂,卻給世界環(huán)境...
    茶點故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一又活、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧玄货,春花似錦皇钞、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春可柿,著一層夾襖步出監(jiān)牢的瞬間鸠踪,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工复斥, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留营密,地道東北人。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓目锭,卻偏偏與公主長得像评汰,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子痢虹,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,629評論 2 354

推薦閱讀更多精彩內(nèi)容