MySQL安装:
①安装之前的检查
sudo service mysql start
②ubuntu Linux安装配置MySQL
#安装MySQL服务端核心程序
sudo apt-get install mysql-server
#安装MySQL客户端
sudo apt-get install mysql-client
#安装结束后,用命令验证是否安装并启动成功
sudo netstat -tap | grep mysql
sudo gedit /etc/mysql/my.cnf # 修改MySQl的配置文件
③打开MySQL
#启动MySQL服务
sudo service mysql start
#使用root用户登录
mysql -u root
一、初识MySQL
1、认识MySQL
MySQL是一个真正的多用户线程SQL数据库服务器。
2、创建数据库
create database test;
3、创建数据库表:所有的数据操作都是针对表的
create table test01_01(name varchar(40), age int(5));
4、添加数据
insert into test01_01 values('wangwu', 21);
5、查询数据
select * from test01_01;
6、修改数据
update test01_01 set name='zhangsan',age=10 where name='wangwu';
7、删除数据
delete from test01_01 where name='zhangsan';
8、加载文件中的数据
source /home/shiyanlou/Desktop/SQL4/MySQl-04-01.sql
二、数据库操作
1、创建数据库
create database [if not exists] db_name;
2、显示数据库
show databases [like wild];
①有时知道数据库的部分名字
show databases like 'te%'; //关键字like配合通配符一起使用
show databases like '%st';
SQL通配符_和%:_代表一个未指定的字符,%代表不定个未指定字符
②显示全部数据库
show database;
3、选用数据库
use database;
4删除数据库
drop database [if exists] db_name;
查出当前选择了那个database:select database();
三、数据表操作
1、创建数据表
create table tb1_name(create_definition,...) [type=table_type]
create_definition:col_name type[not null|null] [default_value] [auto_increment] [primary_key]
内容可选:是否为空,是否有默认值,是否为主键,是否自增长等
增加自增:(初始忘添加)
alter table course change id id int not null auto_increment;
例如:
create table test01_02(id varchar(50) not null auto_increment primary key, name varchar(40) null default "002",
age int(5) null default 44);
create table animals(id int(5) not null Auto_increment,name char(20) not null, primary key(id));
2、select创建数据库表
create table tb_new_name select * from tb_old_name;
上述语句表示,从后者的表中复制一份添加新的数据库表中,前面的表是新的,之前是不存在的。
eg:create table test01_03 select * from test01_01;
3、显示数据库信息
show tables [from db_name] [like wild]
show columns from tbl_name [from db_name] [like wild]
show index from tbl_name [from db_name]
{describe|desc} tbl_name {col_name | wild}
4、修改表结构
①增加列
alter table tbl_name add col_name type constraint(约束)
eg:alter table test01_01 add weight int; //增加一个weight列
②修改列
alter table test01_01 modify weight varchar(50); //修改type
③删除列
alter table test01_01 drop weight;
④给列更名
alter table test01_01 change weight wei int; //类型不能省略,否则更名失败
⑤给表更名
alter table test01_01 rename (to) test01_04;
或 rename table test01_01 to test01_04;
5、删除数据库表
drop table [if exists] tbl_name [,tbl_name, ...]
eg: drop table if exists test01_04;
三、插入数据
1、添加数据
insert [into] tbl_name [(col_name,...)] values(pression,...)
insert [into] tbl_name set col_name=expression
①可指定所有列的值
insert test01_01 values(null, 'jack', '23', 'beijing');
②使用多个值表,可以一次提供多行数据
insert test01_01 values('jack', '23', 'beijing'),('grep','34','ah');
③可以给出要赋值的那个列,然后再列出值
insert test01_01(name) values('grep');
insert test01_01(name) values('grep'),('rose');
insert test01_01 set name='sara'; //不能插入多行
2、insert ... select添加数据
基本语法:
insert into tbl_name select * from tbl_name1;
insert into tbl_name(col) select col from tbl_name1;
eg:
insert into test01_03 select * from test01_01;
insert into test01_03(name) select name from test01_01;
SQL约束:
约束类型 | 主键 | 默认值 | 唯一 | 外键 | 非空 |
关键字 | PRIMARY KEY | DEFAULT | UNIQUE | FOREIGN KEY | NOTNULL |
四、查询记录
1、认识select:帮助取出数据
基本语法:
select selection_list //选择那些列
from table_list //从何处现在行
where primary_constraint //行必须满足什么条件
group by grouping_columns //怎样对结果分组
having secondary_constraint //行必须满足的第二条件
order by sorting_columns //怎样对结果排序(ASC升序,DESC降序)
limit count //结果限定 count=2显示前两条数据
一个having句子必须跟在group by之后和order by之前
select * from employee limit 1(起始位置),2(数目) ; // 显示第二条,第三条记录
2、普通查询
select columns from tbl_name;
eg: select * from test01_01;
select name,age,sex from test01_01;
3、条件查询
select columns from tb_name where expression,...;
eg: select * from test01_01 where name="tom"; //删选出当前表中name为tom的所有数据
4、查询排序
order by column_name [asc|desc] [,...]
eg:select * from test01_01 order by age asc; //按年龄升序输出
5、查询分组与行计数
group by 从句根据所给的列名返回分组的查询结果
语法:
group by col_name,...
eg:单独使用group by没有任何意义
select name,count(*) from test01_01 group by name; //按name分组,并统计数量
6、多表查询
select t1.name,t2.name from tbl_name as t1, tb_name2 as t2 where t1.name=t2.name;
上述代码表示,从t1和t2中取出两张表name相同的值。as表示为这个表取别名。
或使用join on:
select t1.name,t2.name from tbl_name as t1 join tb_name2 as t2 on t1.name=t2.name;
五、修改& 删除数据
1、update更新数据
update tbl_name set 要更改的列 where 要更新的记录
eg:update test01_03 set name='tom' where age='20'; //将名字为tom的年龄改为20
2、delete删除数据
delete from tbl_name where 要删除的记录(一行记录)
where子句指定哪些记录应该删除。如果不选where,将删除所有记录。
eg:delete from test01_01 where age=10; //删除年龄为10的数据
六、数据类型
1、数据类型
数据类型大致分为两类:一个整数,一个是浮点数或小数。整数类型常用int类型,浮点类型float,double类型。
2、字符串类型
常用的字符串类型有:char,varchar,text和blob类型。
3、日期时间类型
date和year类型描述简单的日期值,使用time类型描述时间值。
4、数据类型选择
MySQL选取数据类型需要牢记的几个标准:
①允许值
②存储效率
③格式和显示要求
④数据处理要求
⑤排序,索引和比较要求
七、运算符
1、算数运算符(+,-,*,%,/)
2、比较运算符(<>,=,<=>安全等号,in, not in, between ... and ...,not between ... and ...),结果总是1(真),0(假)或null(不确定)
3、逻辑运算符(not,and,or,xor)
4、位运算符(|,&,<<,>>,~, ^) ^执行xor操作
八、函数
1、数学函数
select ABS(-123); //123
select GREATEST(100,88,33,256); //获取数组中的最大值256
2、聚合函数
MySQL有一组函数是特意为求和或者对表中的数据进行集中概括而设计的,这些函数经常用在包含group by从句的select查询中。
AVG(col); //返回指定的平均值
COUNT(col); //返回指定列表中非null值的个数
SUM(col); //返回指定列的所有值的标准差
select count(*) from menbers;
select min(quantity) from inventory; //返回最小值
select max(return) from inventory; //返回最大值
3、字符串函数
①通过length()函数可以获得一个字符串的长度
②通过trim()函数可以在我们剪切时指定去除格式
③concat()函数将提供的参数连接成一个字符串
select concat('red','hot'); //返回redhot
4、日期时间函数
①使用now()函数获得当前的日期和时间将以YYYY-MM-DD HH:MM:SS的格式返回当前的日期和时间
select now(); //返回当前的日期和时间
②单独获取日期和时间,可以使用curdate()和curtime()函数。
select curtime(); //当前时间
select curdate(); //当前日期
③week()函数返回指定的日期是一年的第几个星期,而yearweek()函数返回指定的日期是那一年的哪一个星期
select week('2004-03-01'); //返回9
select yearweek(20040301); //返回200409
④函数TIMESTAMPDATE()计算当前时间与出生日期的差
TIMESTAMPDATE(YEAR,birth,curdate()) as age
5、加密函数
AES_ENCPYPT(str,key); //返回密钥key对字符串str加密后的字符串
AES_DECPYPT(str,key); //解密后的字符串
6、控制流函数
IFNULL(expr1,expr2)
如果 expr1 为非 NULL 的,IFNULL() 返回 expr1,否则返回 expr2。IFNULL() 返回一个数字或字符串值
mysql> SELECT IFNULL(1,0);
-> 1
mysql> SELECT IFNULL(NULL,10);
-> 10
如果 expr1 = expr2 为真,返回 NULL,否则返回 expr1。 它等同于 CASE WHEN x = y THEN NULL ELSE x END:
mysql> SELECT NULLIF(1,1);
-> NULL
mysql> SELECT NULLIF(1,2);
-> 1
--------------------------------------------------------------------------------
NULLIF(expr1,expr2)
如果 expr1 = expr2 为真,返回 NULL,否则返回 expr1。 它等同于 CASE WHEN x = y THEN NULL ELSE x END:
mysql> SELECT NULLIF(1,1);
-> NULL
mysql> SELECT NULLIF(1,2);
-> 1
--------------------------------------------------------------------------------
IF(expr1,expr2,expr3)
如果expr1为真,那么将返回expr2的值,否则返回expr3的值
mysql> SELECT IF(1>2,2,3);
-> 3
mysql> SELECT IF(1<2,'yes','no');
-> 'yes'
mysql> SELECT IF(STRCMP('test','test1'),'no','yes');
-> 'no'
如果expr2和expr3明确的指为null,那么将返回非NULL的类型..
--------------------------------------------------------------------------------
CASE value WHEN [compare-value] THEN result [WHEN [compare-value] THEN result ...] [ELSE result] END
CASE WHEN [condition] THEN result [WHEN [condition] THEN result ...] [ELSE result] END
mysql> SELECT CASE 1 WHEN 1 THEN "one"
WHEN 2 THEN "two" ELSE "more" END;
-> "one"
mysql> SELECT CASE WHEN 1>0 THEN "true" ELSE "false" END;
-> "true"
mysql> SELECT CASE BINARY "B" WHEN "a" THEN 1 WHEN "b" THEN 2 END;
-> NULL
7、格式化函数
DATE_FORMAT(date,fmt) 依照字符串fmt格式化日期date值
FORMAT(x,y) 把x格式化为以逗号隔开的数字序列,y是结果的小数位数
INET_ATON(ip) 返回IP地址的数字表示
INET_NTOA(num) 返回数字所代表的IP地址
TIME_FORMAT(time,fmt) 依照字符串fmt格式化时间time值
8、数据转换函数
MySQL提供了CAST()函数,它可以把一个值转化为指定的数据类型。类型有:BINARY,CHAR,DATE,TIME,DATETIME,SIGNED,UNSIGNED
示例:
SELECT CAST(NOW() AS SIGNED INTEGER),CURDATE()+0;
SELECT 'f'=BINARY 'F','f'=CAST('F' AS BINARY);
9、系统信息函数
DATABASE() 返回当前数据库名
CONNECTION_ID() 返回当前客户的连接ID
USER()或SYSTEM_USER() 返回当前登陆用户名
VERSION() 返回MySQL服务器的版本
示例:
SELECT DATABASE(),VERSION(),USER();
九、连接
1、交叉连接
select * from color,attribute; //返回两张表的结合体
2、内连接/外连接
3、自连接与联合
十、子查询
1、where/having查询
MySQL可以在where子句或having子句中包含子查询。包含在圆括号内的子查询,优先级高于比较和逻辑操作符in操作符或者exists操作符。
2、in/exists/from查询
十一、事务处理
1、什么是事务
一个事务由作为一个单独单元的一个或多个sql语句组成。
事务的四个特性:原子性、一致性、孤立性、持久性
2、生命周期
3、控制事务行为
MySQL提供了两个变量来控制事务行为:autocommit变量和transaction isolation level变量。
4、事务和性能
使用小事务两个普通的策略:
①保证所有要求的用户输入在发出start transaction命令之前都是可行的。
②尝试把大的事务分成小的事务然后分别执行。
十二、性能优化
1、索引
索引指向数据库中具体数据所在的一个位置,同时在列上创建一个索引可以排列该列上的信息。当服务器需要访问该信息进行查询时,就会知晓在什么地方进行查询,因为索引指向有关位置。
如果一个列设计查询,分组,排序,索引将可以达到提高性能的效果。
2、查询高速缓存
在运行select查询时,MySQL4.x会记录下查询和返回结果。这是通过select每次进行查询时,在一个特殊的高速缓存中保存结果集实现的。
3、查询分析
在select查询开始出加上一个explain关键字,将告诉MySQL返回一个图标,说明这个查询如果进行处理,在这个图表里涉及了查询将访问哪个表的信息以及查询希望返回行数的信息。
4、优化多表查询
子查询是潜逃在另一个select语句中的select语句。子查询经常用来把一个复杂的查询拆分为一些列的逻辑步骤,或者使用其他查询结果回答一个查询。
5、使用临时表
MySQL还允许使用create temporary table命令创建临时表。
6、优化表设计
7、调整服务器设置
导入操作:
load DATA infile '文件路径和文件名' into table 表名字;
导出操作:
select 列1,列2 into outfile '文件路径和文件名' from 表名字;
eg:select * intp outfile '/tmp/out.txt' from employee;
视图:
create view 视图名(列a,列b,列c) as select 列1,列2,列3 from表名字
备份:
$mysqldump -u root dbname > 备份文件名 //备份整个数据库
$mysqldump -u root dbname 表名字>备份文件名 //备份整个表
恢复:
$mysql -u root test < bak.sql //把备份的bak.sql恢复到test