一、编译安装配置及相关参数设定
确保安装了编译环境所需要的包组
安装“Development tools”和“Server Platform Development”包组
1、安装cmake
cmake-2.8.8.tar.gz
跨平台编译器
# tar xf cmake-2.8.8.tar.gz
# cd cmake-2.8.8
# ./bootstrap
# make
# make install
2、编译安装
逻辑卷挂载到/mydata目录下
#mkdir /mydata/data
# tar xf mysql-5.5.33.tar.gz
# cd mysql-5.5.33
# groupadd -r mysql
# useradd -g mysql -r -d /data/mydata mysql
# cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \ #cmake的安装路径
-DMYSQL_DATADIR=/mydata/data \ #数据目录
-DSYSCONFDIR=/etc \ #配置文件路径
-DWITH_INNOBASE_STORAGE_ENGINE=1 \ #编译INNOBASE存储引擎
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \ #编译ARCHIVE存储引擎,支持压缩的归档引擎
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \ #编译BLACKHOLE存储引擎
-DWITH_READLINE=1 \ #数据导入导出功能 批量数据导入
-DWITH_SSL=system \ #ssl路径
-DWITH_ZLIB=system \ #网络传输时,可以进行压缩
-DWITH_LIBWRAP=0 \ #是否接受tcprap通知
-DMYSQL_UNIX_ADDR=/tmp/mysql.sock \#UNIX进程间通信的地址
-DDEFAULT_CHARSET=utf8 \ #默认字符集
-DDEFAULT_COLLATION=utf8_general_ci #默认排序规则
# make
# make install
#chown -R root:mysql /usr/local/mysql/*
#cd /usr/local/mysql/
#cd mysql/support-files有样例,我们可以根据自己的需要选择
将选择的文件复制一份到/etc/目录下并修改文件名为my.cnf
#cp my-large.cnf /etc/my.cnf
3:修改配置文件
# vim /etc/my.cnf
找到相关设置进行修改操作
thread_concurrency = 4并发核心数, 如果物理核心为2,这里就可以填写4
添加 datadir=/mydata/data
innodb_file_per_table = 1 #每表一个表空间
初始化脚本
#cd /usr/local/mysql/
#scripts/mysql_install_db --user=mysql --datadir=/mydata/data/
服务脚本
#cp mysql.server /etc/rc.d/init.d/mysqld
添加mysql服务
#chkconfig --add mysqld
验证一下
#chkconfig --list mysqld
启动服务
#service mysqld start
这时候还不能连接客户端
# vim /etc/profile.d/mysql.sh
export PATH=/usr/local/mysql/bin:$PATH
执行脚本
# . /etc/profile.d/mysql.sh
#mysql就可以进入了
因为我们的安装不在标准路径下,所以还要进行下面的操作
导出帮助文件
#vim /etc/man.config
MANPATH /usr/local/mysql/man
导出头文件
#ln -sv /usr/local/mysql/include /usr/local/mysql
导出库文件
#vim /etc/ld.so.conf.d/mysql.conf
/usr/local/mysql/lib
至此我们的mysql配置完成。
mysql> show processlist; #显示当前mysql服务器所有的线程列表
mysql>use mysql; #切换到mysql库
mysql> show tables; #显示所有表
mysql> desc user; #显示user表的结构
mysql> show indexes from user; #主键
mysql> select user,host,password from user; #显示user表的 user,host,password 信息
删除没密码的用户
mysql> drop user ''@localhost;
mysql> drop user ''@localhost.localdomain;
再次查看有哪些用户
mysql> select user,host,password from user;
将没有用户名的都删除,将保留需要的root用户名的要添加密码以保证安全性
给所有的root用户设定的密码为mypass
mysql> update user set password=PASSWORD('mypass')where user='root';
生效后刷新授权表
mysql> flush privileges;
退出后重新登陆时就需要密码了
修改用户密码:
1、# mysqladmin -uUSERNAME -hHOST password 'new_pass';
2、mysql> SET PASSWORD FOR username@host=PASSWORD('new_pass');
3、mysql.user
mysql> UPDATE user SET password=PASSWORD('new_pass') WHERE user='root';
如果忘记root用户密码:
修改/etc/rc.d/init.d/mysqld
启动选项:--skip-grant --skip-networking
找到相关内容位置
添加后:
$bindir/mysqld_safe --datadir="$datadir" --pid-file="$mysqld_pid_file_path" $other_args --skip-grant --skip-networ >/dev/null 2>&1 &
注意:我们登入后重新设定密码后要将这一项再去掉
二、分组的相关用法
导入一个数据库
#mysql -uroot -p < hellodb
mysql>use hellodb #切换到hellodb库
显示students表中的所有内容
mysql> select * from students;
以classid分组,显示每个classid对应有多少人
mysql> select classid,count(name) from students group by classid;
显示classid对应的人数大于等于2的有哪些
mysql> select classid,count(name) from students group by classid having count(name)> =2;
可以使用别名对上面的进行修改,如下:
mysql> select classid,count(name) as c from students group by classid having c >=2;
对年龄进行排序(默认为升序)
mysql> select name,age from students order by age;
如果降序排列:
mysql> select name,age from students order by age desc;
对降序得到的只显示某些的
mysql> select name,age from students order by age desc limit 3 4; 空过3个后显示4个
DISTINCT 对显示的值只显示一次
以性别分组,显示各组年龄中的最大值;
mysql> select gender,max(age) from students group by gender;
以班级分组,显示各组年龄中的最小值;只显示最小年龄小于20的班级;
mysql> select classid,min(age) from students group by classid;
mysql> select classid,min(age) from students group by classid having min(age)< 20;
如果还需要排序在后面添加order by min(age)
以性别分组,显示各组年龄的年龄之和,要求将年龄之和逆序排列;
mysql> select gender,sum(age) from students group by gender order by sum(age)desc;
以年龄分组,显示各组中的人数;
mysql> select age,count(name) from students group by age;
内联结:自然联结
显示两张表classid相等的同学的信息
mysql> select * from students,classes where students.classid = classes.classid;
外联结:一张表与另外一张表对应的值,如果没有,就显示null
左外联结
mysql> select name,class from students left join classes on students.classid = classes.classid;
右外联结
RIGHT JOIN ... ON ...
自联结:sometable AS alias1 INNER JOIN sometable AS aliase2 ON alias1.FILED = alias2.FIELD;
mysql> select s.name as student,t.name as teacher from students as s inner join students as t where s.teacherid=t.stuid;
对同一张表设定两个别名来实现自联结
联合查询:将两张表的结果组合起来,形成一个新的表
SELECT clause UNION SELECT clause
显示teachers表中年龄大于50岁的和students表中年龄大于40岁的姓名和年龄的信息,并且在一张表显示
mysql> select name,age from teachers where age > 50 union select name,age from students where age > 40;
多表联合的查询 :将每两张表表示信息相同部分的查找字段作为联合查询的依据
mysql> select name,course from students,classes,coc,courses where students.classid=classes.classid and classes.classid=coc.classid and coc.courseid=courses.courseid and students.name='Ding Dian';
这个命令可以简单写:
mysql> select name,course from students,coc,courses where students.classid=coc.classid and coc.courseid=courses.courseid and students.name='Ding Dian';
练习、如何显示其年龄大于平均年龄的同学的名字?
mysql> select name,age from students where age > (select avg(age) from students);
子查询:
用于WHERE子句
SELECT clause FROM tb1 WHERE
1、用于比较表达式中的子查询;
2、用于EXISTS中的子查询;
3、用于IN中的子查询;
用于FROM中的子查询
SELECT col,... FROM (SELECT clause) WHERE condition
据说:MySQL对子查询的优化很有限;
MySQL查询:
简单查询
SELECT [DISTINCT] col, col,... FROM tb1 WHERE condition GROUP BY col HAVING condition ORDER BY col LIMIT [m,]n;
子查询:
WHERE:
用于比较条件:子查询只能返回单个值
用于IN
找出学了不存在课程的班级
mysql> select classid from coc where courseid not in (select courseid from courses);
用于EXISTS
FROM:
显示班级里面有大于平均年龄的同学所在的班级
mysql> select classid,count(name) from students where classid is not null and age > (select avg(age) from students) group by classid;
事务:ACID innodb支持事务
ACID:I: 隔离性
事务有隔离级别:
READ-UNCOMMITTED 读未提交 (别人修改的尚未提交的数据自己能看到)
READ-COMMITTED 读提交 (别人修改的提交的数据自己能看到)
REPEATABLE-READ重读级别 (不受别人影响)
SERIALIZABLE 可串行化 (同时查询的情况一方不能修改)
MVCC: Multi Version Concurrency Control
#sql_log_bin
# mysqlbinlog
三、Mysql基础命令用法
DDL:
数据库:
创建:
CREATE DATABASE|SCHEMA [IF NOT EXISTS] dbname;
CHARACTER SET= 定义字符集
COLLATE= 定义排序规则
SCHEMA 方案
删除:
DROP DATABASE|SCHEMA [IF EXISTS] dbname;
[IF EXISTS] 避免调用时报错
获取帮助:HELP SQL KEYWORD
修改:
ALTER DATABASE db_name default (属性) 修改属性
ALTER {DATABASE | SCHEMA} db_name
UPGRADE DATA DIRECTORY NAME 升级数据库字典
表:
创建:
CREATE TABLE tb_name (col1 defination, col2 defination, ...) [table_options];
table options:
ENGINE=engine 定义存储引擎
查看默认存储引擎:
#mysql> show session variables like '%engine%';
DELAY_KEY_WRITE={0|1} #是否延迟键写入
TABLESPACE tablespace_name #表空间文件
CREATE TABLE tbname [(defination)] SELECT clause;
CREATE TABLE tbname LIKE old_table_name;
mysql> create table tb2(id INT not null,name CHAR(24),INDEX(id)); I#创建tb2,
mysql> show indexes from tb2\G 显示tb2的索引
mysql> create table tb4 like tb3; #复制和tb3相同的表tb4的结构,但是不复制其内容
mysql> create table tb3 select user,host,password from mysql.user; 复制全部数据,但是表的结构不一定会完全复制
所以,将上述两个命令结合起来就能够使表的结构和数据一起被复制了。
存储引擎:也称作表类型
MyISAM表:
tbname.MYD 表的数据
tbname.MYI 表的索引
Tbname.frm 表的定义
表空间:ibdata1
每表一个表空间:
tbname.frm 表的定义
tbname.ibd: 数据和索引
开启方法:
SET GLOBAL innodb_file_per_table=1;实现每表一个表空间
建议:同一个库中的表最好使用相同的存储引擎;
删除:DROP TABLE [IF EXISTS] tbname;
改名:RENAME TABLE tb_name TO new_name;
修改:ALTER TABLE tbname
ADD col defination [{first|after col_name}] ;
DROP colname;
MODIFY col defination [{first|after col_name}] ; #修改小部分内容
CHANGE col new_col_name defination [{first|after col_name}] ; #修改大的内容
RENAME TO new_name;
练习题:
1、新增字段:
Class 字段定义自行选择;放置于Name字段后;
mysql> alter table tb1 add class INT not null after name;
mysql> alter table tb1 modify class INT not null first; 调整Class字段为第一
2、将ID字段名称修改为TID;
mysql> alter table tb1 change ID TID INT UNSIGNED not null;
3、将Age字段放置
例如:mysql> create table tb1(name CHAR(10) not null,age TINYINT UNSIGNED);
mysql> desc tb1; 描述表tb1的结构
mysql> show table status\G 查看默认存储引擎是什么
DML: insert, update, delete
INSERT INTO tb_name [(col1,col2,...)] {VALUE|VALUES} ();
INSERT INTO tb_name SET col1=value,...;
INSERT INTO tb_name(col1,...) SELECT clause;
从另外的表检索数据添加到新表中
mysql> insert into tb2 set name=‘ling chon’,age=34;
把执行过程分成两段:CREATE LIKE,INSERT INTO SELECT
mysql> create table tb2like tb1;
mysql> insert into tb2()select ID Name Age Gender Course from tb1;
REPLACE INTO:替换操作;源数据存在就修改,不存在就添加
mysql> select last_insert_id();
查看最后一次插入数据的id号
mysql> insert into tb1 values (1,'Ling Huchong',24,'Male','Huashan');
修改:UPDATE
WHERE clause
LIMIT n 限制前n个用户修改
mysql> update tb1 set age=34; 会将所用的全部修改为34
mysql> update tb1 set age=34 where name=‘lin shen’;
删除:mysql> DELETE FROM tb_name where id=‘4’;
如果id号设置为自动增长,删除第四个后,新添加一个新的id会空过4的,新的id号为5
清空并重置表:清空后,id号从1开始
mysql> TRUNCATE TABLE tb_name
本文转自 宋鹏超 51CTO博客,原文链接:http://blog.51cto.com/qidian510/1291933,如需转载请自行联系原作者