SQL的主要语法: (来源官方)
SQL DML 和 DDL
可以把 SQL 分为两个部分:数据操作语言 (DML) 和 数据定义语言 (DDL)。
SQL (结构化查询语言)是用于执行查询的语法。但是 SQL 语言也包含用于更新、插入和删除记录的语法。
查询和更新指令构成了 SQL 的 DML 部分:
SELECT - 从数据库表中获取数据
UPDATE - 更新数据库表中的数据
DELETE - 从数据库表中删除数据
INSERT INTO - 向数据库表中插入数据
SQL 的数据定义语言 (DDL) 部分使我们有能力创建或删除表格。我们也可以定义索引(键),规定表之间的链接,以及施加表间的约束。
SQL 中最重要的 DDL 语句:
CREATE DATABASE - 创建新数据库
ALTER DATABASE - 修改数据库
CREATE TABLE - 创建新表
ALTER TABLE - 变更(改变)数据库表
DROP TABLE - 删除表
CREATE INDEX - 创建索引(搜索键)
DROP INDEX - 删除索引
MYSQL中常用语法:
基本和SQL中语法一致,但是还是有一些区别
现在来详细介绍
表的各种约束(参考博客):
1.NOT NULL
2.UNIQUE
3.PRIMARY KEY
4.FOREIGN KEY
5.CHECK –MySQL不支持CHECK
6.AUTO_INCREMENT
7.ZEROFILL
8.DEFAULT
9.UNSIGNED
-------------------------------------------------------------------------------------
CREATE DATABASE user_database --创建一个数据库user_database
use user_database --进入user_database这个数据库
show tables --查看所有的表
show table_name --查看指定名字的表
DESC table_name --查看指定名字的表结构
CREATE table_name( --创建一个表table_name
id INT(20) AUTO_INCREMENT PRIMAR KEY, --创建一个INT主键自增列id
name VARCHAR(30) NOT NULL, --创建一个非空VARCHAR列name
age INT(5) default 18, --创建一个默认为18的列age
email VARCHAR(40) UNIQUE); --创建一个值唯一的VARCHAR列email
------------------------------------------------------------------------------
一、插入
1.插入一条完整的数据
INSERT INTO table_name(name,email,age) VALUES('hhh ','5278@qq.com ','17');
2.插入数据记录一部分
INSERT INTO table_name(name,email,age) VALUES('passer',NULL,'17')
INSERT INTO table_name(name,age) VALUES('son','17')
3.插入多条数据记录(MySQL特有)
INSERT INTO table_name(name,email,age) VALUES('Z','12@','19'),('c','12z3@','199'),('a','121@','190')
4.插入查询操作(测试)
INSERT INTO table_name(name) SELECT name FROM table_name
------------------------------------------------------------------------------
二、修改
1.需求:修改列元素的值 例如修改name
UPDATE table_name SET name='dad' WHERE name='son'
2.需求:修改id为3的学生,名字改为张三,年龄改为18,邮箱改为zhang@
UPDATE table_name SET name='张三',age=18,email='zhang@' WHERE ID=3
3.尽量不修改主键(会导致通过原来的主键再也找不到该条数据了)
如果没有WHERE则修改所有数据
------------------------------------------------------------------------------
三、删除
1.需求:删除id为5的数据
DELETE FROM t_student WHERE id=5
2.如果没有WHERE则表示清空该表
------------------------------------------------------------------------------
四、查询(基础语法)
SELECT column1,column2...
FROM 表名
1.如果是查询所有的列;可以写成SELECT * FROM 表名;
SELECT * FROM tb_demo
SELECT column1,column2... FROM table_name
2.去除查询结果重复的内容
SELECT DISTINCT StockCompany From table_name
------------------------------------------------------------------------------
五、需求:查询所有货品的id,名称和批发价(批发价=卖价*折扣)
SELECT id,name,Price*Discount From t_product
------------------------------------------------------------------------------
六、需求:查询所有货品的ID,名称,和各进五十个的成本价CostPrice
SELECT id,name,CostPrice*50
------------------------------------------------------------------------------
七、需求:查询所有货品的ID,名称,各进五十个,并且每个运费一元的价格
SELECT id,name,(CostPrice+1)*50
------------------------------------------------------------------------------
八、查询所有货品的ID,名称,各进五十个,并且每个运费一元的价格(使用别名)
1.SELECT id, AS 货品ID,name,(Price+1)*50 AS 成本价 FROM t_product
2.SELECT id 货品ID,name,(Price+1)*50 成本价 FROM t_product
------------------------------------------------------------------------------
九、为了方便用户浏览查询的结果数据,有时需要设置显示格式,可以使用CONCAT函数来连接字符串
需求:查询商品的名字和零售价
格式:xxx商品的零售价为:xxx
SELECT CONCAT(name,'商品的零售价为',Price) AS record FROM t_product
------------------------------------------------------------------------------
十、查询货品零售价为指定条件的货品信息(比较符>,<,<=,>=,!=,<>)
SELECT *FROM t_product WHERE Discount<0.5
SELECT *FROM t_product WHERE Discount!=0.5
SELECT *FROM t_product WHERE Discount<>0.5
SELECT *FROM t_product WHERE Price>=1000
SELECT *FROM t_product WHERE Price<=1000
SELECT name FROM t_product WHERE Price>=2000
SELECT name FROM t_product WHERE Price*Discount>=500
------------------------------------------------------------------------------
十一、SQL语句执行顺序
1.先执行FROM(确定从哪张表开始做查询)
2.接着执行WHERE(过滤掉不合法的数据)
3.在执行SELECT(选择最终需要显示那些列)
4.最后执行ORDER BY(对查询的结果排序)
------------------------------------------------------------------------------
十二、运算符(&&,||,!)
(AND,OR,NOT)
SELECT *FROM t_product WHERE Price>=500&&Price<=1000
SELECT *FROM t_product WHERE Price>=500 OR Price>=1000
优先级
NOT,AND,OR
-----------------------------------------------------
十三、SELECT 列名 FROM 表名 WHERE 列名 BETWEEN 最小值 AND 最大值
SELECT *FROM t_product WHERE Price>=500&&Price<=1000
SELECT *FROM t_product WHERE Price BETWEEN 500 AND 1000
SELECT *FROM t_product WHERE NOT (Price>=500&&Price<=1000)
SELECT *FROM t_product WHERE Price NOT BETWEEN 500 AND 1000
------------------------------------------------------------------------------
十四、需求:查询ID为2或者4的货品
SELECT *FROM t_product WHERE ID=2 OR ID=4
SELECT *FROM t_product WHERE ID IN(2,4)
------------------------------------------------------------------------------
十五、需求:查询ID为NULL的所有商品
SELECT *FROM tb_demo WHERE ID IS NULL
---------------------------------------------------------
十六、模糊查询
WHERE name LIKE '张_三'
WHERE name LIKE '张%'
WHERE name LIKE '%张%'
1.使用LIKE运算符执行通配查询,查询条件可包含文字字符和数字
2.%通配符:可表示零或者多个字符(必须占据一个位置)
3._通配符:可表示一个字符(可以占据0~N个位置,任意字符)
4.通配符:用来实现匹配部分值的特殊字符
---------------------------------------------------------
十七、使用ORDER BY子句将记录排序
ASC:升序,缺省
DESC:降序
ORDER BY子句必须出现在SELECT语句的最后
格式:
SELECT <selectList>
FROM table_name
WHERE 条件
单列排序
ORDER BY 列名1[ASC/DESC],列名2[ASC/DESC]...;
SELECT * FROM t_product ORDER BY Price DESC
多列排序
SELECT *FROM t_product ORDER BY Price DESC ,Date ASC
列的别名排序
需求:查询m系列并按照批发价排序(加上别名)
SELECT name,Price*Discount pfPrice
FROM t_product
WHERE name LIKE '%m%'
ORDER BY pfPrice
如果列的别名使用了引号,那么排序无效
--------------------------------------------------------------------------------
十八、MySQL的分页查询
SELECT *FROM t_product LIMIT ?,?
第一个?:表示从哪里开始截取,第一条数据的索引为0
第二个?:每页最多的条数,pageSize
SELECT *FROM t_product LIMIT (currentPage-1)*pageSize,pageSize
--------------------------------------------------------------------------------
十九、聚集函数,统计函数,分组函数
聚集函数作用于一组数据,并对一组数据返回一个值
COUNT :统计结果记录数
MAX:统计计算最大值
MIN:统计计算最小值
SUM: 统计计算求和
AVG:统计计算平均值
1.需求:查询所有的商品平均零售价
SELECT AVG(Price) FROM t_product
2.需求:查询商品总记录数(在Java中必须使用long接收)
SELECT COUNT(*) FROM t_product
SELECT COUNT(主键) FROM t_product
3.需求:查询分类为2的商品总数
SELECT COUNT(id)
FROM t_product
WHERE category = 2
4.需求:查询商品的最小零售价,最高零售价,以及所有商品零售价的总和
SELECT MIN(Price),MAX(Price),SUM(Price) FROM t_product
--------------------------------------------------------------------
思考:带有排序操作的分页查询
先排序再分页
SELECT id,price,name FROM t_product ORDER BY price LIMIT 0,5
-------------------------------------------------------------------
二十、多表查询
单表查询:从一张表中查询数据
多表查询:从多张表中联合查询出数据
为什么使用多表查询:
需要查询多张表中的数据,此时通过一张表是不能查询完整的
单表查询:
SELECT 列名1,列名2,列名3,...
FROM 表名
多表查询(最简单的):
SELECT <selectList>
FROM 表名A,表名B
笛卡尔积:没有连接条件的表关系返回的结果
多表查询会产生笛卡尔积:
实际运行环境避免使用全笛卡尔积,使用等值连接
解决方案:在WHERE中加入有效的连接条件--->等值连接
注意:
连接N张表,至少需要n-1个连接条件
需求:查询所有的货品信息,对应的货品分类信息
SELECT *FROM t_product,t_product_category
WHERE t_product.category = .category
---------------------------------------------------------
外键约束:在A表中的外键列的值必须来源于B表中的主键列
注意:在MySQL中,InnoDB支持事物和外键
修改表的存储引擎为InnoDB
ALTER TABLE 表名 ENGINE = 'InnoDB'
在开发中,外键列起名字:一般是所引用表名_引用列名
t_product_category
------------------------------------------------------------
二十一、
使用表名前缀在多个表中区分相同的列
在不同表中具有相同列名的列可以用表的别名加以区分
使用别名可以简化查询
使用表名前缀可以提高执行效率
如果使用了表的别名,则不能再使用表的真名
1.需求:查询货品ID,货品名称,货品所属分类名称
SELECT id,tp.name,tpc.name
FROM t_product tp,t_product_category tpc
WHERE tp.category = tpc.category
2.需求:查询零售价大于200的无线鼠标
SELECT id,price,tp.name,tpc.name
FROM t_product p,t_product_category c
WHERE tp.Category = tpc.Category AND tp.Price >= 500 AND tpc.name = '无线鼠标'
3.需求:查询零售价大于200的无线鼠标(使用别名)
4.需求:查询每个货品对应的分类以及对应的库存
SELECT tp.id,tp.name,tpc.name,tp.stocknum
FROM t_product tp,t_product_category tpc,t_stocknum ts
WHERE tp.category=tpc.category AND tp.id = ts.id
5.需求:如果库存货品都销售完成,按照利润从高到低查询货品名称,零售价,货品分类(三张表)
SELECT tp.id,tp.name,tpc.name,tp.price*ts.storeNum profit
FROM t_product p,t_product_category c,t_stocknum ts
WHERE tp.category = tpc.category AND tp.id = ts.id
ORDER BY profit DESC
6.需求:查询每个商品分类的名称和父分类名称
SELECT child.id,child.name,parent.name
FROM t_productdir child,t_productdir parent
WHERE child.parent_id = parent.ID
------------------------------------------------------------------------------
二十二、数据备份和恢复
在改企业数据库之前,请先备份
MySQL自身的数据库维护:
通过Cmd命令进入dos窗口
1.导出:mysqldump -u账户 -p密码 数据库名称>脚本文件存储地址
mysqldump -uroot -padmin user_database >C:/shop_bak.sql
2.导入:mysql -uroot -padmin user_database <c:/shop_bak.sql
Navicat工具的导入和导出:使用sql文件来存储,通用
Navicat工具的备份和还原:使用psc格式的文件,必须使用支持的工具才能运行还原