1.关闭和启动mysql
在命令行窗口输入:net start mysql(启动mysql)
net stop mysql(关闭mysql)
2.登录mysql
在命令行窗口输入:mysql -u root(用户名) -p(注意不要带分号;)
再输入密码
3.SQL语句
是什么:结构化查询语句。关系数据库语言的国际标准
分类:
数据定义语言DDL:用来定义数据库对象:数据库database,表table,列colum等。关键字:创建create,修改alter,删除drop等(结构)
数据操作语言DML:用来对数据库中表的记录进行更新。关键字:插入insert,删除delete,更新update等(数据)
数据查询语言DQL:用来查询数据库中表的记录。关键字:select,from,where等
数据控制语言DCL:用来定义数据库的访问权限和安全级别及创建用户,关键字:grant等
4.数据库的操作
(1)创建数据库
create database 库名;
create database 库名 character set 编码(中文utf8);
(2)删除数据库
drop database 库名;
(3)查看所有数据库
show databases;
(4)查看一个数据库结构(可以看到表的字符集)
show create database 库名;
(5)使用数据库
use 库名;
(6)查看当前正在操作的数据库
select database();
5.表的操作
(1)创建表
create table 表名(
字段名 类型(长度) [约束],
字段名 类型(长度) [约束],
字段名 类型(长度) [约束]
);
单表约束:
主键约束:primary key,要求被修饰的字段:唯一和非空
唯一约束:unique,要求被修饰的字段:唯一
非空约束:not null,要求被约束的字段:非空
(2)查看表
查看数据库中的所有的表:show tables;
(3)查看表的结构
查看表的结构:desc 表名;
(4)删除表
drop table 表名;
(5)修改表
添加一列(也就是添加一个字段):
alter table 表名 add 字段名 类型(长度) [约束]
例:alter table user add usex varchar(2);
修改字段的类型(长度 约束)
alter table 表名 modify 要修改的字段名 类型(长度) [约束]
例: alter table user modify usex varchar(4);
修改字段名
alter table 表名 change 旧字段名 新字段名 类型(长度) [约束]
例: alter table user change usex uage int(5) not null;
删除字段
alter table 表名 drop 字段名;
例:alter table user drop uage;
修改表名
rename table 表名 to 新表名;
例:rename table user1 to user;
修改表的字符集
alter table 表名 character set 字符集;
6.对数据库表记录进行操作(修改):
插入记录:insert
语法:
(1)向表中某些字段插入值
insert into 表名(字段名1,字段名2,字段名3...)values(值1,值2,值3...);
例:insert into user(uname,upassword,uid)values('王五','1234',null); //uid为自增长,所以写null也可以
(2)向表中所有字段插入值
insert into 表名 values(值1,值2,值3...); //必须为每个字段设置值
查看表中所有的数据:
select * from 表名;
插入数据中文乱码问题的解决:
如果创建数据库时没有指定编码为utf8,那么向表格插入数据为中文时,会出现中文乱码问题,
解决办法:
在cmd中输入net stop mysql 关闭mysql
找到mysql安装目录下的my.ini文件(有的版本没有这个文件,只有my-default.ini文件,那么就将这个文件重命名为my.ini文件)在文件中在[mysqld]前加,
[mysql]
port=3306
default-character-set=gbk
后加
character-set-server=gbk
其他的不要动
重启mysql就可以了(在cmd中输入 net start mysql)
到Mysql安装目录下的My.ini文件,将里面的所有utf8编码改成gbk,保存,重启mysql,再插入中文数据,不会出现乱码了,OK了。
就可以解决中文乱码的问题了
更新(修改)记录:update
语法:
不带条件的:update 表名 set 字段名=值,字段名=值......; //将该记录的所有的值都改变
带条件的:update 表名 set 字段名=值,字段名=值.....where 条件;
注意:值如果是字符串或者日期需要加‘’;
例: update user set uname='wang'where uname='王五';
删除记录:delete
语法:
带条件:delete from 表名 where 条件;
例:delete from user where uid=4;
注意:删除后uid不会重置,也就是说如果被删除了,主键uid如果是自增长的不会从1开始,会接着以前的记录增长
不带条件:delete from 表名;//将删除表中的所有记录
删除方式delete和truncate的区别:
delete删除是一条一条的删除记录,配合事物,可以将删除的数据找回。
例:
truncate删除是将表摧毁,然后新建一个一模一样的表,删除的数据无法找回。
用法:truncate table 表名;
用truncate删除表时,添加数据时,是从1开始的,但delete不是
数据库表查询操作
简单查询:
语法:
查具体的字段:select 字段名,字段名...from 表名 [where 条件];、
例:SELECT pid,pname from product WHERE pid=5;
查询所有的字段:select * from 表名 [where 条件];
使用别名:as可不写
SELECT * FROM product as p;(表别名)
SELECT pid,pname name from product;(字段(列)别名)
去掉重复值:
SELECT DISTINCT(price) FROM product;
将所有商品价格加10:
SELECT pid,pname,price+10 FROM product;
条件查询:where
SELECT * from product WHERE pid=11;
SELECT * from product WHERE pid<>1; //<>代表的是不等于
SELECT * from product WHERE price>500;
SELECT * from product WHERE pname LIKE '%强%';
like使用占位符_和%(_代表一个字符,%代表任一个字符)
SELECT * from product WHERE pid IN(1,3,5);
in代表在某一个范围内获取值
就相当于SELECT * from product WHERE pid=1 OR pid=3 OR pid=5; //or代表的是多个条件任意一个成立,and代表多个条件同时成立,not代表不成立
排序查询:order by
SELECT * FROM product ORDER BY price DESC; //ORDER BY排序,asc -升序,desc-降序
例:SELECT * FROM product WHERE pname LIKE '%士%' ORDER BY price DESC;
聚合查询:
常用的聚合函数:求和sum() 平均avg() 最大值max() 最小值min() 计数count()
例:SELECT COUNT(*)FROM product; //统计所有的个数
SELECT avg(price) FROM product; //统计价格的平均数
注:聚合函数不统计null值
分组查询:group by
SELECT cid,COUNT(*) FROM product GROUP BY cid;
SELECT cid,AVG(price) FROM product GROUP BY cid HAVING AVG(price)>2000; //分组后,需要条件查询用having,不能使用where
查询操作的顺序:
select //一般跟在这个后面的都是要查询的字段
from //要查询的表
where
group by
having //分组后带有条件只能使用having
order by //必须放在最后面
Limit子句可以被用于强制 SELECT 语句返回指定的记录数。Limit接受一个或两个数字参数。参数必须是一个整数常量。如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。
//初始记录行的偏移量是 0(而不是 1):
mysql> SELECT * FROM table LIMIT 5,10; //检索记录行6-15
//为了检索从某一个偏移量到记录集的结束所有的记录行,可以指定第二个参数为 -1:
mysql> SELECT * FROM table LIMIT 95,-1; // 检索记录行 96-last
//如果只给定一个参数,它表示返回最大的记录行数目。换句话说,LIMIT n 等价于 LIMIT 0,n:
mysql> SELECT * FROM table LIMIT 5; //检索前 5 个记录行
外键
语法:alter table 从表 add foreign key(从表外键字段名) references 主表名(主表的主键);
alter table product add foreign key(category_id)references category(cid);
表关系:
一对多
多对多
两张表都是主表,第三张表为从表,提供两个字段,都是外键
多表查询
交叉连接查询(得到的是两个表的乘积 -----一般不会用)
select * from category,product;
内连接查询(使用的是关键字inner join ----inner可以省略)
隐式内连接 select * from category,product where category_id=cid;
显式内连接 select * from category inner join product on cid=category_id;
外链接查询(使用的是关键字outer join ------outer可以省略)
左外连接 select * from category left join product on cid=category_id;
右外连接 select * from category right join product on cid=category_id;
内连接和外连接的区别
子查询
一条select语句作为另一条select语法一部分
select * from product where category_id=(select cid from category where cname='化妆品');