mysql

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<demo.sql #导入数据

#启动项目的时候指定数据库
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中进行切换的时候会出现如下问题,暂时没有搞明白,不过解决方式是把数据库配置文件的一句话给删除

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 #复合索引并且是唯一性索引
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,509评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,806评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,875评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,441评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,488评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,365评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,190评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,062评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,500评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,706评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,834评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,559评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,167评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,779评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,912评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,958评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,779评论 2 354

推荐阅读更多精彩内容