1.结构化查询语句分类
名称 解释 命令
DDL(数据定义语言) 定义和管理数据对象,如数据库, CREATE、DROP、ALTER 数据表等。
DML(数据操作语言) 用于操作数据库对象中所包含的数据 INSERT、UPDATE、DELETE
DQL(数据查询语言) 用于查询数据库数据 SELECT
DCL(数据控制语言) 用来管理数据库的语言,包括管理 GRANT、COMMIT、ROLLBACK
权限及数据更改。
2.命令行操作数据库
创建数据库
CREATE DATABASE [IF NOT EXISTS] 数据库名;
删除数据库
DORP DATABASE [IF EXISTS] 数据库名;
查看数据库
SHOW DATABASES;
使用数据库
USE 数据库名;
3.操作数据表
DDL
显示表结构
desc 表名
显示表创建语句
show create table 表名
创建数据表
CREATE TABLE [ IF NOT EXISTS ] `表名` (
`字段名1` 列类型 [ 属性 ] [ 索引 ] [注释] ,
`字段名2` 列类型 [ 属性 ] [ 索引 ] [注释] ,
… …
`字段名n` 列类型 [ 属性 ] [ 索引 ] [注释]
) [ 表类型 ] [ 表字符集 ] [注释] ;
修改数据表
修改表名
ALTER TABLE 旧表名 RENAME AS 新表名
添加字段
ALTER TABLE 表名 ADD 字段名 列类型 [属性 修改字段]
修改字段
ALTER TABLE 表名 MODIFY 字段名 列类型 [属性]
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 列类型 [属性]
删除字段
ALTER TABLE 表名 DROP 字段名
删除表
DROP删除
DROP TABLE [ IF EXISTS ] 表名
IF EXISTS 为可选,判断是否存在该数据表
如删除不存在的数据表会抛出错误
DROP为整个删除,是将表中数据与表结构完全删除的一种方式
TRUNCATE删除
TRUNCATE只对表中数据进行删除,不会对表定义进行删除 TRUNCATE 速度更快
DELETE删除
根据条件逐行删除
DML
添加数据
INSERT INTO 表名 [(字段名1,字段名2,……..)] values (值1,值2,值3,………);
修改数据
UPDATE 表名 SET column_name = value [ , column_name2 = value2, …. ] [ WHERE condition ];
删除数据
DELETE FROM 表名 [ WHERE condition ];
WHERE条件子句
4.DQL-Data Query Language 数据查询语
(1)根据字段名查询语句
select 字段名1,字段名2,......字段名n from 表名
查询表中所有信息
select * from 表名 (不推荐,效率低下)
一般通过列出所有查询的字段方式来查询内容
通过as子句可将表名数据列名取一个新的别名
select 字段名 as "别名" from 表名
select 别名.字段名 from 表名 as 别名
通过distinct去掉表中相同内容字段
select distinct(字段名) from 表名
在返回列中使用表达式
select 字段名*10 from 表名
(2) where条件语句的使用
逻辑操作符
操作符名称 语法 描述
AND或&& a AND b 或 a && b 逻辑与,同时为真结果才为真
OR或|| a OR b 或 a||b 逻辑或,只要一个为真,则结果为真
XOR或^ a XOR b 逻辑异或,不同为真,相同为假
NOT或! NOT a 或 !a 逻辑非,若操作数为假,结果则为真
比较操作符
操作符名称 语法 描述
IS NULL a IS NULL 若操作符为NULL,则结果为真
IS NOT NULL a IS NOT NULL 若操作符不为NULL,则结果为真
BETWEEN a BETWEEN b AND c 若a范围在b与c之间则结果为真
LIKE a LIKE b SQL模式匹配,若a匹配b,则结果为真
IN a IN (a1,a2,a3,….) 若a等于a1,a2…中的某一个,则结果为真
BETWEEN
SELECT * FROM SUBJECT WHERE ClassHour BETWEEN 110 AND 120;
SELECT * FROM SUBJECT WHERE ClassHour>=110 AND ClassHour<=120;
IN
SELECT * FROM subject where ClassHour=100 OR ClassHour=110 OR ClassHour=120;
SELECT * FROM SUBJECT WHERE ClassHour IN (100,110,120);
LIKE
SELECT * FROM SUBJECT WHERE SubjectName LIKE "%数学%";
SELECT StudentNo,StudentName FROM student WHERE StudentName LIKE "李__";
_匹配一个任意字
%匹配多个任意字符
(3) 子查询
select 列名1,列名2…..,列名n from (select 列名1,列名2…..,列名n from 表名 ) as 别名
结果集为一条记录时
select 列名1,列名2…..,列名n from 表名 where 列名=(select 列名 from 表名 where 条件)
结果集为多条时
select 列名1,列名2…..,列名n from 表名 where 列名 in (select 列名 from 表名 where 条件)
IF EXISTS
DROP TABLE IF EXISTS 表名
如果该表存在则删除
(4) Group by分组函数
SELECT studentno,SUM(studentresult) AS `sum` FROM result GROUP BY studentno;
(5) 通过having对分组后数据进行筛选
select studentno,avg(studentresult) as `sum` froby studentno having AVG(studentresult)>90;
(6) Order by排序
select * from result order by StudentResult;
默认升序,使用desc进行降序排列
(7) Limit
限制SELECT返回结果的行数
m 制定第一个返回记录行的偏移量
n 制定返回记录行的最大数目
注意
m不指定则偏移量为0,从第一条开始返回前n条记录
LIMIT 常用于分页显示
例子:
SELECT * FROM `result` LIMIT 3 #返回前3条记录
SELECT * FROM `result` LIMIT 2,3 #返回2-3条记录
(8) 常用统计函数
函数名称 描述
COUNT( ) 返回满足SELECT条件的记录总和数,如 SELECT COUNT(1)..
SUM( ) 返回数字字段或表达式列作统计,返回一列的总和
AVG( ) 通常为数值字段或表达列作统计,返回一列的平均值
MAX( ) 可以为数值字段、字符字段或表达式列作统计,返回最大的值
MIN( ) 可以为数值字段、字符字段或表达式列作统计,返回最小的值
(9)连接查询
INNER JOIN内连接
SELECT SubjectName,GradeName FROM subject INNER JOIN grade ON subject.GradeID=grade.GradeID;
select subject.SubjectName,grade.GradeName from subject,grade where subject.GradeID=grade.GradeID;
AS 关键字
SELECT sub.SubjectName,gra.GradeName FROM SUBJECT AS sub,grade AS gra WHERE sub.GradeID=gra.GradeID;
SELECT sub.SubjectName AS '课程名称',gra.GradeName AS '年级' FROM SUBJECT AS sub,grade AS gra WHERE
sub.GradeID=gra.GradeID
外连接
左外联结(LEFT JOIN)
以左表作为主表进行查询
SELECT studentname,StudentResult FROM student LEFT JOIN result ON student.studentno=student.studentno;
右外联结(RIGHT JOIN)
以右表作为主表进行查询
SELECT studentname,StudentResult FROM student RIGHT JOIN result ON student.studentno=student.studentno;
自连接
CREATE TABLE IF NOT EXISTS category(
categoryId INT(10) AUTO_INCREMENT PRIMARY KEY,
categoryName VARCHAR(32) NOT NULL ,
pid INT(10)
);
select c1.`categoryName`,c2.`categoryName` from category as
c1,category as c2 where c1.`categoryId`=c2.`pid`;