一、SQL语句介绍
1.什么是SQL?
全称 structured query language,简称SQL,中文叫结构化查询语言。
关系型数据库语言的国际标准:SQL92、SQL99
不止是MySQL,其他数据库在SQL92或者SQL99这些国际SQL标准基础上,还扩展了自己的一些SQL语句,比如MySQL中的limit关键字。
2.SQL分类:
- 数据定义语言:简称DDL(Data Definition Language),用来定义数据库对象:数据库,表,列等。关键字:create,alter,drop等
- 数据操作语言:简称DML(Data Manipulation Language),用来对数据库中表的记录进行更新。关键字:insert,delete,update等
- 数据控制语言:简称DCL(Data Control Language),用来定义数据库的访问权限和安全级别,及创建用户;关键字:grant等
- 数据查询语言:简称DQL(Data Query Language),用来查询数据库中表的记录。关键字:select,from,where
二、SQL语句的使用
1.数据库操作:datebase
创建数据库:
create database 数据库名;
create database 数据库名 character set 字符集;
查看数据库:
查看数据库服务器中的所有的数据库:show databases;
查看某个数据库的定义的信息:show create database 数据库名;
删除数据库:
drop database 数据库名称;
其他命令:
切换数据库:use 数据库名;
查看正在使用的数据库:select database();
2.表操作:table
创建表:
create table 表名(
字段名 类型(长度) 约束,
字段名 类型(长度) 约束
);
单表约束:
主键约束:primary key
唯一约束:unique
非空约束:not null
注意:主键约束 = 唯一约束 + 非空约束
查看表:
查看数据库中的所有表:show tables;
查看表结构:desc 表名;
删除表:
drop table 表名;
修改表:
alter table 表名 add 列名 类型(长度) 约束; --修改表添加列.
alter table 表名 modify 列名 类型(长度) 约束; --修改表修改列的类型长度及约束.
alter table 表名 change 旧列名 新列名 类型(长度) 约束; --修改表修改列名.
alter table 表名 drop 列名; --修改表删除列.
rename table 表名 to 新表名; --修改表名
alter table 表名 character set 字符集; --修改表的字符集
3.插入记录:insert
insert into 表 (列名1,列名2,列名3..) values (值1,值2,值3..); -- 向表中插入某些列
insert into 表 values (值1,值2,值3..); --向表中插入所有列
insert into 表1 (列名1,列名2,列名3..) values select (列名1,列名2,列名3..) from 表2 --将表2中查出的数据插入表1
insert into 表1 values select * from 表2 --将表2中查出的数据插入表1
注意事项:
①列名数与values后面的值的个数相等
②列的顺序与插入的值需要顺序一致
③列名的类型与插入的值的类型需要一致.
④插入值的时候不能超过最大长度.
⑤值如果是字符串或者日期需要加引号’’ (一般是单引号)
4.更新记录:update
update 表名 set 字段名=值,字段名=值;
update 表名 set 字段名=值,字段名=值 where 条件;
注意事项:
①列名的类型与修改的值要一致.
②修改值得时候不能超过最大长度.
③值如果是字符串或者日期需要加单引号.
5.删除记录:delete
delete from 表名;
delete from 表名 where 条件;
注:delete与truncate的区别:
删除表中所有记录使用delete from 表名; 还是用truncate table 表名;
删除方式:delete 一条一条删除,不清空auto_increment记录数。
truncate 直接将表删除,重新建表,auto_increment将置为零,从新开始。
所以truncate的效率更高i,特别是对于数据量特别大的表
三、SQL查询
1.简单查询
查询关键字:select from
如果需去除重复值 在列名前使用distinct 即可 :select distinct username from user
2.条件查询
关键字:where
select * from user where age > 25;
select * from user where name = '狗蛋';
注:where后条件使用方法
比较运算符 | > < <= >= = <> | 大于、小于、大于(小于)等于、不等于 |
BETWEEN ...AND... | 显示在某一区间的值(含头含尾) | |
IN(.....) | 显示在in列表中的值,例:in(1,2,3,4,5,100) | |
LIKE '李_' | 模糊查询,Like语句中,% 代表零个或多个任意字符,_ 代表一个字符,例:name like ‘_a%’; | |
IS NULL | 判断是否为空 | |
逻辑运算符 | and | 多个条件同时成立 |
or | 多个条件任一成立 | |
not | 不成立 |
3.排序
关键字:order by asc(升序) desc(降序)
select * from user order by age desc;
4.聚合函数
特点:只对单列进行操作
常用的聚合函数:
sum():求某一列的和
avg():求某一列的平均值
max():求某一列的最大值
min():求某一列的最小值
count():求某一列的元素个数
5.分组
关键字:group by having
注意:
①select语句中的列(非聚合函数列),必须出现在group by子句中
②group by子句中的列,不一定要出现在select语句中
③聚合函数只能出现select语句中或者having语句中,一定不能出现在where语句中。
6.多表关联查询
①内连接:inner join
内连接也叫等值连接,内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行。
select * from A inner join B on A.id = B.id
②外连接
- 左外连接:left join
select * from A left join B on A.id = B.id
- 右外连接:right join
select * from A right join B on A.id = B.id
- 全外连接MySQL不支持
注意:
通过业务需求,分析主从表
如果使用LEFT JOIN,则主表在它左边
如果使用RIGHT JOIN,则主表在它右边
查询结果以主表为主,从表记录匹配不到,则补null
7.分页查询
关键字:limit
select * from table limit (start-1)*rows,rows; 其中start是页码,rows是每页显示的条数。
8.语法顺序和执行顺序
- MySQL查询语法顺序:
①SELECT
②FROM
③LEFT JOIN
④ON
⑤WHERE
⑥GROUP BY
⑦HAVING
⑧ORDER BY
⑨LIMIT
- MySQL的执行顺序:
①FROM(将最近的两张表,进行笛卡尔积)---VT1
②ON(将VT1按照它的条件进行过滤)---VT2
③LEFT JOIN(保留左表的记录)---VT3
④WHERE(过滤VT3中的记录)--VT4…VTn
⑤GROUP BY(对VT4的记录进行分组)---VT5
⑥HAVING(对VT5中的记录进行过滤)---VT6
⑦SELECT(对VT6中的记录,选取指定的列)--VT7
⑧ORDER BY(对VT7的记录进行排序)--游标
⑨LIMIT(对排序之后的值进行分页)
- where条件执行顺序:
1.MySQL:从左往右执行where条件
2.Oracle:从右往左执行where条件
结论:在写where条件时,优先级搞得部分要去编写过滤力度最大的条件语句