mysql入门(基础要打好啊~)

服务器安装不说了,我想大家都会,linux的比较繁琐一点,看我centos安装lamp的笔记,http://wenku.baidu.com/view/9ee64c9558fafab068dc02f6
对于mysql规范操作命令使用大写的情况,感觉很繁琐,本人还是喜欢用小写。

导入外部sql文件,使用控制台 执行命令 source 路径
source 文件路径+文件
mysql 数据库 -uroot -p < 文件路径+文件
mysql -V可以查看当前的mysql的版本号;
mysql> SELECT version();
启动和停止,最简单的
net start mysql 
net stop mysql

然后这些也是可以在计算机管理->服务里边执行的;
不过当初有一次mysql服务器没了,wtf?,百度。
解决方法:当MySQL服务突然消失的时候,可以在命令提示符下输入mysqld -install来安装服务,若出现server install denied,则进入system32文件夹里,用管理员身份来运行cmd.exe文件,然后再执行mysqld -install,此时绝对成功。注意:前提是在系统的PATH里有到MySQL安装目录下bin的路径!!!

登录 mysql -h localhost -u root -p 密码 -P参数是设置端口号;
cls命令清除cmd屏幕;
当退出sql后,再想登录sql时,只需要按方向上下键就可以遍历刚才输入的命令;
退出命令:mysql>\q; mysql>quit; mysql>exit;

**MySQL忘记密码处理方法解决办法:
1。停止mysql服务。//打开命令行窗口,停止mysql服务: Net stop mysql
2。启动mysql,一般到mysql的安装路径,找到 mysqld-nt.exe
执行:mysqld-nt –skip-grant-tables 当前窗口将会停止。
3。另外打开一个命令行窗口,进入MYSQL的安装位置下BIN目录,运行mysql
4。输入如下命令:

use mysql
update user set password=password(“new_password”) where user=”root”;
flush privileges;
exit
6。用Ctrl+Alt+Del,找到mysqld-nt的进程杀掉它,在重新启动mysql-nt服务,net start mysql**

后来遇到过一个比较尴尬的问题,localhost无法登录,只能
127.0.0.1登录,网上的解释都是直接修改密码,后来才知道是和wamp中的mysql冲突了;不过很好奇为什么不是127.0.0.1无法登录,有知道的朋友麻烦告诉一下,谢谢
localhost,127.0.0.1的详情:http://blog.csdn.net/xifeijian/article/details/12879395
对了,忘了说了,安装mysql时数据库的character_set_database 一定要设置utf8 ,否则,中文乱码,解决的问题也没有很好的办法,只能每执行一次设置一下编码。

show variables like 'character%';
查看当前字符设定
修改指定的数据库
set character_set_client=gbk;

这里写图片描述
还有CMD的编码方式是gbk的,使用CMD操作MYSQL的时候要先SET NAMES GBK;

show status like 'uptime';
显示广泛服务器状态,信息有点多,最好加like查询
show grants;
显示授权用户安全权限

服务器状态譬如当前MySQL启动后的运行时间,当前MySQL的客户端会话连接数,当前MySQL服务器执行的慢查询数,当前MySQL执行了多少SELECT语句、执行了多少UPDATE/DELETE/INSERT语句等统计信息

创建数据库
create database 数据库名;
选择数据库
use 数据库名;
查看服务器上当前存在的数据库
show databases; database()当前数据库
查看某个数据库信息
show create database 数据库名;
修改数据库(设置数据库的编码)
alter database 数据库名 character set 编码;
删除数据库
drop database 数据库名;

如果前缀不是mysql>,说明正在等待剩余部分的输入;输入\c取消该命令(具体情况,具体分析)
数据类型:

整数类型:tinyint,smallint,mediumint,int,bigint
小数类型:float(M,D),double(M,D),decimal(M,D)
日期与时间类型:YEAR(YYYY),DATE(YYYY-MM-DD),TIME(HH:MM:SS),DATETIME(YYYY-MM-DD HH:MM:SS),TIMESTAMP(YYYY-MM-DD),()中的是格式
字符串类型:char(),varchar()
大字符串类型:TINYTEXT,TEXT,MEDIUMTEXT,LONGTEXT
二进制类型:binary varbinary blob

具体请百度,不再赘述;

表结构的创建
create table 表名(
列名 数据类型 列的约束 null|not null,....);
查看数据库
show tables;
查看表结构
show create table 表名;
desc 表名;(复杂写法:show columns from 表名);

表结构的修改

增加一列
alter table 表名 add 列名 数据类型 after 前表名;
改变列名
alter table 表名 change 原列名 新列名 数据类型
修改类型
alter table 表名 modify 列名 数据类型 
删除列
alter table 表名 drop 列名
修改表名
alter table 表名 rename 新表名
表结构的删除
drop table 表名(注意外键)

关于\G格式化输出的使用,只能在mysql自带的控制台使用,不用加分隔号
约束:主键,唯一,外键,默认,检查(所有的存储引擎均对CHECK子句进行分析,但是忽略CHECK子句。也就是说现在mysql检查约束还没有实现)

第一种
create table 表名
(列名 数据类型 约束名字(如果没写,系统自动创建) 约束类型)
第二种
alter table 表名
add ***不是很相同,分开写
主键约束
创建表的时候
primary key(列名,列名),可以定义两行
添加
alter table 表名 add primary key(列名);
删除
alter table 表名 drop primary key;
唯一约束
添加
alter table 表名 add unique(列名);
删除
alter table 表名 drop INDEX 列名;
默认约束
alter table 表名 alter sex set default '男';
外键约束(INNODB引擎)
alter table 表名 add foreign key(主列) references 表名(从列);
先删除这个表的外键,然后再增加
alter table tb_name drop foreign key 外键名称
外键名称在建立外键时可以自定义名称,如果不自定义,会按照mysql自动生成一个名称
show create table tb_name;
自动增长列,必须是键
alter table 表名 add 列名 类型 auto_increment key 自增字段;
默认从10000开始
alter table 表名 AUTO_INCREMENT=10000;

详情http://blog.csdn.net/kqygww/article/details/8882990

向表中插入数据
insert 表名(列名,....) values(列数据,.....);
如果按规矩删除,可以直接
insert 表名 values(列数据,.....);
允许为空,可使用NULL插入空值,对于默认值可使用default;
通过查询另一个表来插入多条记录
insert 表名(列名1,列名2) SELECT 另列名1,另列名2 FROM 另一个表
修改数据
update 表名 set 要更新的表名=更新数据 where 更新条件;
列子
update student set sname='王淳龙' where sno='99103'
删除数据
delete from stuudent where 更新条件
完全清空一个表(速度比楼上的快,但是不记录日志)
truncate table 表名 

索引
关于索引这块,以后会做补充,大家可以百度看看dalao的文章,毕竟我只是‘小学生‘,这里只说操作过程,原理不讲
索引分类:普通索引,唯一索引(unique),主键索引(primary key),全文索引(fulltext,myisam引擎)

ALTER TABLE HeadOfState ADD INDEX (LastName, FirstName);
CREATE INDEX index_name HeadOfState (LastName, FirstName);

1、CREATE INDEX必须提供索引名,对于ALTER TABLE,将会自动创建,如果你不提供;
2、CREATE INDEX一个语句一次只能建立一个索引,ALTER TABLE可以在一个语句建立多个,如:
ALTER TABLE HeadOfState ADD PRIMARY KEY (ID), ADD INDEX (LastName,FirstName);
3、只有create TABLE 才能创建主键,ADD INDEX 不能;

create [unique|fulltext] index 索引名 on 表名(列名);
查看
show index from 表名;
添加
alter table 表名
add index 索引名(列名);
删除
drop index 索引名 on 表名;
alter table 表名 drop index 索引名; 

视图

创建视图
create [or repace] view 视图名[(唯一的列名1,唯一的列名2,唯一的列名3...)]
as select语句 [with [cascaded|local]check option]
查看视图
select * from 视图名;
查看视图结构
desc 视图名;
查看视图信息
show table status like '视图名';
查看视图时的定义语句,查看视图的字符编码
show create view 视图名
修改视图
alter view 视图名[(唯一的列名1,唯一的列名2,唯一的列名3...)]
as  select语句  [with [cascaded|local]check option]
删除视图
drop view 视图名;

补充一点,通过视图是可以修改数据的,with check option可以防止当向视图中插入不符合视图查询条件的记录时,则系统报错;通过视图增查改删就是把表名换成视图名;
mysql语言
常量:字符串常量(单引号括起来),数值常量(整数常量,浮点数常量),日期时间常量,布尔值常量
系统变量,一般以标记符@@开头,用户无法修改系统变量;
select @@version
用户变量(客户端退出,自动释放)

方法一
set @bianliang='wang  chunlong';set多个用户变量
select @bianliang;
方法二
select @bianliang:='wa  ngchun';

也可以使用查询给变量赋值

set @bianliang=(select 列名 from 表名 where 条件);
select @sdept:=select 列名 from 表名 where 条件;

运算符
算数运算符,比较运算符(‘<>’=’!=’),逻辑运算符(and,or,not),运算符优先级
这里写图片描述
函数
mysql自带好多函数的啦,大家可以去百度。
日期时间函数
NOW() /*当前时间 含日期时间
CURDATE() /* 当前日期 只有日期
CURTIME() /*当前时间 值有时间
DATE_ADD() /*时间增减或减少

SELECT DATE_ADD('2014-3-12',INTERVAL 365 DAY); ==>2015-3-12 /*在原有给定的时间上增加365天
INTERVAL增加可以增加负值 单位 year ,month,week,day
SELECT DATEDIFF('2014-1-1','2015-1-1') ==> -365 /*时间差值计算 单位为日 前面时间减去后面时间
SELECT DATE_FORMAT('2014-3-2','%m/%d/%y'); ==> 03/02/2014 /*日期格式转换

这里说下控制流程函数

if函数
if(expr1,expr2,expr3)
比如 if(score>60,'合格','不合格')这不就是三目运算符嘛!
ifnull函数,ifnull(expr1,expr2)expr1为空,返回expr1,否则返回expr2
mysql> select IFNULL(1,0);      
                     -> 1      
mysql> select IFNULL(0,10);      
                     -> 0      
mysql> select IFNULL(1/0,10);      
                     -> 10      
mysql> select IFNULL(1/0,yes);      
                     -> yes     

case when then函数
mysql> select sno,cno,case
-> when score>90 then ‘优秀’
-> when score>80 then ‘良好’
-> else’不合格’
-> end 成绩等级
-> from sc;
这里写图片描述
自定义函数

创建带参数的自定义函数
求两个数平均值
mysql> create function f2(num1 smallint unsigned,num2 smallint unsigned)
    -> RETURNS FLOAT(10,2) UNSIGNED
    -> RETURN (num1+num2)/2;
Query OK, 0 rows affected (0.06 sec)

mysql> select f2(10,20);
+-----------+
| f2(10,20) |
+-----------+
|     15.00 |
+-----------+
1 row in set (0.02 sec)
删除函数使用 drop function 函数名

存储过程创建
存储过程语法结构分析
CREATE
[DEFINER = {userCURRENT_USER}]//定义时的用户,若是不写就默认为当前用户
PROCEDURE sp_name ([proc_parameter[,…]]) //可以带0到多个参数
[characteristic …] routine_body
其中参数
proc_parameter:
[IN OUT INOUT] param_name type
IN, 表示该参数的值必须在调用存储过程时指定
OUT, 表示该参数的值可以被存储过程改变,并且可以返回
INOUT, 表示该参数的值调用时指定,并且可以被改变和返回

mysql > DELIMITER //  
mysql > CREATE PROCEDURE demo_in_parameter(IN p_in int)  
-> BEGIN   
-> SELECT p_in;   
-> SET p_in=2;   
-> SELECT p_in;   
-> END;   
-> //  
mysql > DELIMITER ; 

调用执行过程call 过程名;
存储过程体
局部变量,只能在BEGIN END生命
declare定义局部变量

declare v_int int default 10,var1,var2 int
set v_int=100,var1=10,var2=20;

通过select…into赋值

declare s_name,s_dept vharchar(20);
select sname,sdept into s_name,s_dept
from student
where sno='99108';

求1-100的和

delimiter &&
create procedure p_sum(in n int,out sum int)
begin
    declare i int default 1;
set sum=0;
    while i<=n do
        set sum=sum+1;
        set i=i+1;
    end&&
    delimiter ;
    执行存储过程
    call p_sum(100,@sum);
    select @sum;
delimiter &&
create procedure p_sum2(in n int,out sum int)
begin
    declare i int default 1;
set sum=0;
        label:loop
            set sum=sum+i;
        set i=i+1;
            if i>n then leave label;
            end if;
    end&&
    delimiter ;
    执行存储过程
    call p_sum(100,@sum);
    select @sum;

ok,说下修改存储结果,没啥意义,修改的是comment ‘string’备注,不能修改过程体;
建议还是删除重来吧

drop procedure 存储过程名称

触发器的创建

create trigger 触发器名称 after insert on 表名 for each row
begin 执行的语句 end&&

ok,下面是最最重要的select语句,据大佬统计,sql语句select语句的出现占80%以上

select *(列名1,列名2) as 显示的别名
from 表名
where 范围
group by 列名
having 对分组后结果进行筛选
order by 列名[ASC|DESC] ,默认ASC升序
limit 2(显示两条数据);

模糊查询

SELECT * FROM [user] WHERE u_name LIKE '%三%' 
包含三的
SELECT * FROM [user] WHERE u_name LIKE '_三_' 
摊三张,唐三藏
SELECT * FROM [user] WHERE u_name LIKE '[张李王]三' 将找出“张三”、“李三”、“王三”(而不是“张李王三”); 
SELECT * FROM [user] WHERE u_name LIKE '[^张李王]三' 将找出不姓“张”、“李”、“王”的“赵三”、“孙三”等; 

多表查询

多表的连接跟两张表的连接一样
表的连接实质就是外键的逆向约束
*/
Eg:
SELECT goods_id,goods_name,b.cate_name,c.brand_name,goods_price
FROM products AS a INNER JOIN products_cate AS b ON a.goods_cate = b.cate_id
INNER JOIN products_brand AS c ON a.brand_name = c.brand_id;

内连接(inner join)=cross join=inner join 等价;

select student.sno,sname,cno,score
from student inner join sc on student.sno=sc.sno
select s.sno,sname,cname,score from student s inner join sc on s.sno=sc.sno inner join course c on c.cno=sc.cno where score>=90;

外连接:
以左外连接为例:
A LEFT JOIN B join_condition
数据表B的结果集依赖于数据表A
数据表A的结果集根据左连接条件依赖所有数据表(B表除外)
左外连接条件决定如何检索数据表B(在没有指定WHERE条件的情况下)
如果数据表A的某条记录符合WHERE条件,但是在数据表B不存在符合连接条件的记录,将生成一个所有列为空的额外的B行
内连接:
使用内连接查找的记录在连接数据表中不存在,并且在WHERE子句中尝试一下操作:column_name IS NULL 。如果 column_name 被指定为 NOT NULL,MySQL将在找到符合连接着条件的记录后停止搜索更多的行(查找冲突)

合并数据集

select sno,sname from student union select empid,ename from emp;

数据库的备份和恢复
这里写图片描述
这里写图片描述
这里写图片描述
恢复
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值