工具推荐:个人推荐使用 Navicat,非常好用,虽然是要付费的,但是破解版很多
1.创建数据库
如果是使用 Navicat 并且使用图形界面创建的话就不必多说了,说说用SQL语句创建的数据库吧
注意,数据库的编码类型很重要,最好在创建时就指定 UTF-8
如下创建名为 my_db 的数据库并且设置默认编码字符集为 UTF-8
CREATE DATABASE IF NOT EXISTS my_db default character set utf8 COLLATE utf8_general_ci;
删除数据库则是很简单的 DROP DATABASE 数据库名;
2.创建数据表
注意,在日后使用中会了解到引擎的重要性,这里我推荐使用 InnoDB,但是如果不指定的话,创建出来的默认是 MyISAM
举例创建数据库
如下创建名为 t_user 的数据表,并且设置引擎为 InnoDB
create table t_user(
id int(10) not null auto_increment, // 设定 id 为 int 类型并且为自增
name varchar(10) character set utf8, // 设定name 为 字符类型,字符集为 utf-8
age int(10), // 设定 age 为 int 类型
primary key(id) // 设定 id 为 主键
)engine=InnoDB; // 设定 引擎为 InnoDB
删除数据表则是很简单的 DROP TABLE IF EXISTS 表名;
数据表添加列:alter table 表名 add column 新列名 varchar(20) not null;
3.插入数据
在一张表中插入数据的 SQL 语法:
insert into 表名 (属性名1,属性名2,属性名3,...) values(值1,值2,值3,...)
举例 : 在刚刚创建的 t_user 表里插入 一条数据
insert into t_user (name,age) value('Lin',20)
由于 id 设置了为自增的键,于是我们不给 id 的值它会自动填充 (从1开始)
4.更新数据
在一张表中更新某条数据的 SQL 语法:
update 表名 set
属性名1 = 值1,
属性名2 = 值2,
属性名3 = 值3,
...
属性名n = 值n
where 主键名 = 主键值;
举例:将刚刚表中的 id 为 1 的 name 值改为 tao
update t_user set
name = 'tao'
where id = 1;
最后的 where 语句决定了那条记录被修改,只要能确定出是哪些数据就可以,不一定是要用 id,也可以是查找 age = 20 的记录进行修改
4.删除数据
从一张表中删除某些记录的 SQL 语句:
DELETE FROM 表名 WHERE 主键名 = 主键值
举例:删除 age = 20 的记录
DELETE FROM t_user WHERE age = 20
如果有多条 age = 20 的记录,则全部 age = 20 的记录都会被删除 (删除后不可恢复)
5.查询数据
一、单表查询
SQL 语句:
select * from 表名 (查询出一张表里的所有数据对象)
select * from t_user where id = 1 (查询表里 id = 1 的对象)
select name,age from t_user where id = 1 (查询表里 id = 1 的对象的 name 和 age 属性)
select name as nnnn from t_user where age = 20
(查询表里 age = 20 的对象的name,并且将结果列定义为 nnnn) 结果如下
二、连表查询
SQL 语句:
假设我们有 另一张 t_course 表 有属性 courseId ,courseName, 此时为 t_user 添加一列 courseId
那么要通过 user 的 id 去查询他的 courseId 对应的 courseName 的时候就需要连表查询了
t_user 表 t_course 表
select * from t_user natural join t_course where t_user.courseId = t_course.courseId
结果:
上面的语句中 用到了连表关键字 join,但是这里还用了 natural,自然连接,也就是连接之后把相同的列去掉,上面查询中两个表的相同列是 courseId,如果不用 natural join 的话查询结果是:
还有指定结果列的写法
select a.name, a.age, b.courseName from t_user as a, t_course as b where a.courseId = b.courseId
from t_user as a 把 t_user 用 a 来代替,简化 SQL 语句
Group By 的使用(分组)
假设有如下表,表名为 t_staff
- id name dept salary edlevel hiredate
- 1 张三 开发部 2000 3 2009-10-11
- 2 李四 开发部 2500 3 2009-10-01
- 3 王五 设计部 2600 5 2010-10-02
- 4 王六 设计部 2300 4 2010-10-03
- 5 马七 设计部 2100 4 2010-10-06
- 6 赵八 销售部 3000 5 2010-10-05
- 7 钱九 销售部 3100 7 2010-10-07
- 8 孙十 销售部 3500 7 2010-10-06
那么我要查每个部门的最高薪水是多少
SQL:
SELECT dept, MAX(salary) AS MAXIMUM FROM t_staff GROUP BY dept
解释一下上面的SQL语句:
查询的结构包含 dept ,并且此时我将 t_staff 根据 dept 分组,分出的每个组 用 MAX() 函数找出每个组salary 最大值,然后将结果 命名为 MAXIMUM 且作为查询结果
Group By 的用法一般都是,先分组,后计算,最后赋值
函数的运用参照这篇博客 MySQL 函数 传送门
6.存储过程
在 MySQL 数据库中存储过程很重要,非常影响查询速度
SQL语句:
##无参数存储过程
delimiter //
create procedure myFist_proc() ## 创建存储过程,函数名为 myFist_proc
begin
select name from t_user where age = 20 ;
end;//
调用已写好的存储过程:
注意:上面的 delimiter// 与 end 后面 的 // 是不可少的,它制定了存储过程的语句块,目的是为了防止 MySQL 的默认结束符号 ';' 对存储过程语句造成干扰
##带参数存储过程
delimiter //
create procedure myThr_proc(IN userId int,OUT userName varchar(20))
(IN 为传入参数,类型为 int,OUT为传出参数,类型为varchar)
BEGIN#Routine body goes here...
select name INTO userName FROM t_user where id=userId;
END;//
调用已写好的存储过程:
call myThr_proc(1,@userName);
select @userName