SQL语句
SQL分类
-
数据定义语言DDL:
定义数据库对象:database、table、column
操作结构:create、alter、drop
-
数据操作语言DML:对表中记录操作
操作数据:insert、delete、update(增删改)
-
数据查询语言DQL:查询表中记录
select、from、where
-
数据控制语言DCL:定义访问权限和安全级别、创建用户
Redis中,关键字grant
1.对数据库的操作 database
创建数据库
create database 库名
create database 库名 character set 编码
UTF-8对中文采用3个字节,对英文采用1个字节,GBK对中英文都采用2个字节。
主要处理中文用GBK,主要处理英文用UTF-8
查看数据库
show databases; 查看所有数据库
show create datebase; 查看某个数据库的定义
删除数据库
drop database 库名;
其他操作
use 库名; 切换数据库
select database(); 查看正在使用的数据库
2.对表操作 table
创建一张表
create table 表名(
字段名 类型(长度) [约束],
字段名 类型(长度) [约束],
字段名 类型(长度) [约束]
);
查看数据库表
show tables; 查看数据库中所有表名
desc 表名; 查看表的结构
删除一张表
drop table 表名;
修改表
修改表名
rename table 表名 to 新表名;
添加一列
alter table 表名 add 字段名 类型(长度) [约束];
删除表的列
alter table 表名 drop 列名;
修改列的类型(长度、约束)
alter table 表名 modify 要修改的字段名 类型(长度) [约束];
修改列的列名
alter table 表名 change 旧列名 新列名 类型(长度) [约束];
修改表的字符集
alter table 表名 character set 编码;
查看当前表的编码
show create table 表名;
3.对数据库表记录进行操作(修改)
3.1插入记录
insert into 表名(列名1,列名2,列名3……) values(值1,值2,值3……)
insert into 表名 values(值1,值2,值3……)
插入数据中文乱码问题解决办法
set names gbk;
3.2修改表记录
不带条件的
update 表名 set 字段名=值, 字段名=值, 字段名=值……
带条件的
update 表名 set 字段名=值, 字段名=值, 字段名=值…… where 条件
3.3删除表记录
带条件的
delete from 表名 where 条件
不带条件的
delete from 表名;
delete与truncate的区别?
delete删除的时候是一条一条的删除记录,它配合事务,可以将删除的数据找回(rollback)。(uid不会重置)
truncate删除,它是将整个表摧毁,然后再创建一张一模一样的表。它删除的数据无法找回。(uid会重置)truncate table 表名 where 条件
3.4查询操作
语法: select [distinct] *| 列名,列名 from 表名 [where条件]
简单查询
查询所有商品:select * from product;
查询商品名和商品价格:select pname,price from product;
查询所有商品信息使用表别名(as可省略):select * from product as p;
查询商品名,使用列别名(as可省略): select pname as p from product
去掉重复值(按照价格):select distinct(price) from product;
将所有的商品的价格+10进行显示:select pname,price+10 from product;
条件查询
查询商品名称为"aaa"的商品信息:select * from product where pname=‘aaa‘;
查询商品名称含有"a"字的商品信息:select * from product where pname like ‘%a%‘;
查询价格>60元的所有商品信息:select * from product where price>60;
查询商品id在(3,6,9)范围内的所有商品信息:select * from product where pid in??,6,9>;
查询id为2或者6的商品信息:select * from product where pid=2 or pid=6
查询商品名称含有"a"字并且id为6的商品信息:select * from product where pname like ‘%a%‘ and pid=6;
排序
查询所有的商品,按价格进行排序(升序、降序):select * from product order by price asc/desc
查询名称有"士"的商品信息并且按照价格降序排序:select * from product where pname like ‘%士%‘ order by price desc
聚合函数
获得所有商品的价格的总和:select sum(price) from product;
获得所有商品的平均价格:select avg(price) from product;
获得所有商品的个数:select count(*) from product;
分组操作
根据cid字段分组,分组后统计商品的个数:select cid, count(*) from product group by cid
根据cid分组,分组统计每组商品的平均价格,并且平均价格大于20000元:select cid,avg(price) from product group by cid having avg(price) > 20000;分组后带条件只能having
分页!
一共8条数据,分成每页三条,查第3页数据
select * from product limit 6,3 (6是起始位置,根据第三页3-1,乘每页三条3 =6)(3是每页几条)
表与表的关系语句
添加外键
alter table 从表名 add constraint 外键名以_fk结尾 foreign key (从表外键字段名) references
主表 (主表主键字段名);
alter table product add constraint product_fk foreign key (category_id) references
category (cid);
删除外键
alter table 从表名 drop foreign key 外键名
ALTER TABLE product DROP FOREIGN KEY product_fk;
特殊情况:添加外键时忘记添加外键名
解决办法:SHOW CREATE TABLE 从表名; 查看外键名
建表原则
一对多(外键指向的是主表)
在多的一方(从表)创建一个字段,作为外键指向一的一方(主表)的主键
一个分类对应多个商品:alter table product add constraint cno_fk foreign key(cno) references category(cid)
多对多
两张表(主表)的多对多,需要创建第三张表(从表),中间表至少有两个字段,两个字段分别作为外键指向两个表的主键
学生选课:
alter table stu_course constraint sid_fk foreign key(sid) references stu(sid);
alter table stu_course constraint cid_fk foreign key(cid) references course(cid);
一对一(了解)
唯一外键对应
主键对应
多表查询
交叉连接查询(基本不会使用-得到的是两个表的乘积)
select * from A,B;
内连接查询(使用的关键字 inner join -- inner 可以省略)
两个表的交集
隐式内连接: select * from A,B where 条件;
显示内连接: select * from A inner join B on 条件;
外连接查询(使用的关键字 outer join -- outer 可以省略)
左外连接: 左表全部及两个表的交集
select * from A left outer join B on 条件;
右外连接: 右表全部及两个表的交集
select * from A right outer join B on 条件;
子查询
一条 select 语句结果作为另一条 select 语法一部分( 查询条件, 查询结果, 表等)。
SELECT * FROM product WHERE category_id=(SELECT cid FROM category WHERE cname=‘化妆品‘);