A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 森111 中级黑马   /  2018-12-10 17:26  /  543 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

什么是SQL:结构化查询语句 -- Structured Query Language

SQL 作用

1.是一种所有关系型数据库的查询规范,不同的数据库都支持

2.通用的数据库操作语言,可以用在不同的数据库中

3.不同数据的SQL语句会有一些不同

file:///E:/%25E6%259C%2589%25E9%2581%2593%25E4%25BA%2591/weixinobU7VjoPQFSuozOU3NpWcJIkvNQI/dcc4e8a593dd455abd868b6fbd20557c/clipboard.png

SQL 分类:

DDL:数据定义语言 如:建库,建表

用来定义数据库对象:数据库,表,列等。关键字:create, drop,alter

DML:数据操纵语言 如:对表中的记录操作增删改

用来对数据库中表的数据进行增删改。关键字:insert, delete, update

DQL:数据查询语言 如:对表中的查询操作

用来查询数据库中表的记录(数据)。关键字:select, where

DCL: 数据控制语言 如:对用户权限的设置

用来定义数据库的访问权限和安全级别,及创建用户。关键字:GRANT, REVOKE 等

MySQL的语法 :

1) 每条语句以分号结尾,如果在 SQLyog 中不是必须加的。

2) SQL 中不区分大小写,关键字中认为大写和小写是一样的  

3) 3 种注释:

注释的语法 说明

--空格 单行注释

/*  */ 多行注释

#   这是 mysql 特有的注释方式

DDL操作数据库

创建数据库

创建数据库的几种方式

*创建数据库 : CREATE DATABASE 数据库名;

*判断数据库是否已经存在,不存在则创建数据库 :

CREATE DATABASE IF NOT EXISTS 数据库名;  

*创建数据库并指定字符集 : CREATE DATABASE 数据库名 CHARACTER SET 字符集;

例:

-- 直接创建数据库db1

create database db1;

-- 判断是否存在,如果不存在则创建数据库db2

create database if not exists db2;

-- 创建数据库并指定字符集为gbk

create database db3 default character set gbk;

CREATE DATABASE IF NOT EXISTS db1 CHARACTER SET gbk;  

查看数据库

-- 查看所有的数据库  

show databases;

-- 查看某个数据库的定义信息

show create database db3;

show create database db1;

修改数据库

将 db3 数据库的字符集改成 utf8

alter database db3 character set utf8;

删除数据库

DROP DATABASE 数据库名;

删除 db2 数据库

drop database db2

使用数据库

查看正在使用的数据库  

SELECT DATABASE();  使用的一个 mysql 中的全局函数

使用/切换数据库

-- 查看正在使用的数据库

select database();

-- 改变要使用的数据库

use db4;  --切换至db4 数据库中   界面不会显示

DDL操作表结构

创建表

CREATE TABLE 表名 (

字段名 1 字段类型 1,  

字段名 2 字段类型 2

);

file:///E:/%25E6%259C%2589%25E9%2581%2593%25E4%25BA%2591/weixinobU7VjoPQFSuozOU3NpWcJIkvNQI/e6a7901b54ad470bb01dda3f0a01a2f0/clipboard.png

创建 student 表包含 id,name,birthday 字段

create table student (

                id int,  -- 整数  

  name varchar(20),  -- 字符串  

  birthday date -- 生日  最后没有逗号

);

查看表

查看某个数据库中的所有表 :

SHOW TABLES;

查看 day21 数据库中的所有表 :

use day21;

show tables;

查看表结构 :

查看 student 表的结构 :

desc student;

file:///E:/%25E6%259C%2589%25E9%2581%2593%25E4%25BA%2591/weixinobU7VjoPQFSuozOU3NpWcJIkvNQI/d874704eac4449d686c88238d9e224ca/clipboard.png

DESC 表名;

查看创建表的SQL语句  

file:///E:/%25E6%259C%2589%25E9%2581%2593%25E4%25BA%2591/weixinobU7VjoPQFSuozOU3NpWcJIkvNQI/453d9d10fbac4f37a081dde7c36744e6/clipboard.png

SHOW CREATE TABLE 表名;

查看 student 的创建表 SQL 语句 :

show create table student;

file:///E:/%25E6%259C%2589%25E9%2581%2593%25E4%25BA%2591/weixinobU7VjoPQFSuozOU3NpWcJIkvNQI/0e2546fafe5a44c2baa1d32fa46fe4d9/clipboard.png

快速创建一个表结构相同的表

CREATE TABLE 新表名 LIKE 旧表名;

例: 创建 s1 表,s1 表结构和 student 表结构相同 :

-- 创建一个s1的表与student结构相同

create table s1 like student;

desc s1;

删除表

直接删除表  

DROP TABLE 表名;

-- 直接删除表s1表

drop table s1;

判断表是否存在,如果存在则删除表  

DROP TABLE IF EXISTS 表名;

-- 判断表是否存在并删除s1表

drop table if exists s1;

判断删除与直接删除的区别 如果表不存在,不删除,存在则删除

修改表结构

添加表列(ADD)

ALTER TABLE 表名 ADD 列名 类型;

为学生表添加一个新的字段 remark,类型为 varchar(20)

alter table student add remark varchar(20);

修改列类型(MODIFY)

ALTER TABLE 表名 MODIFY 列名 新的类型;

将 student 表中的 remark 字段的改成 varchar(100)

alter table student modify remark varchar(100);

修改列名 (CHANGE)

ALTER TABLE 表名 CHANGE 旧列名 新列名 类型;

将 student 表中的 remark 字段名改成 intro,类型 varchar(30)

alter table student change remark intro varchar(30);

删除列 (DROP)

ALTER TABLE 表名 DROP 列名;

删除 student 表中的字段 intro

alter table student change remark intro varchar(30);  

修改表名

RENAME TABLE 表名 TO 新表名;

将学生表 student 改名成 student2

rename table student to student2;

修改字符集character set

ALTER TABLE 表名 character set 字符集;

将 student2 表的编码修改成 gbk

alter table student2 character set gbk;

DML操作表中的数据

插入记录

INSERT [INTO] 表名 [字段名] VALUES (字段值)

INSERT INTO 表名:表示往哪张表中添加数据

(字段名 1, 字段名 2, …):要给哪些字段设置值

VALUES (值 1, 值 2, …):设置具体的值

插入全部字段

所有的字段名都写出来  

INSERT INTO 表名 (字段名 1, 字段名 2, 字段名 3…) VALUES (值 1, 值 2, 值 3);

不写字段名  

INSERT INTO 表名 VALUES (值 1, 值 2, 值 3…);

插入部分数据

INSERT INTO 表名 (字段名 1, 字段名 2, ...) VALUES (值 1, 值 2, ...);

更新表记录 (修改表内数据)

UPDATE 表名 SET 列名=值 [WHERE 条件表达式]  

-- 不带条件修改数据,将所有的性别改成女

update student set sex = '女';

-- 带条件修改数据,将id号为2的学生性别改成男

update student set sex='男' where id=2;

-- 一次修改多个列,把id为3的学生,年龄改成26岁,address改成北京

update student set age=26, address='北京' where id=3;

UPDATE: 需要更新的表名

SET: 修改的列值

WHERE: 符合条件的记录才更新

你可以同时更新一个或多个字段。 你可以在 WHERE 子句中指定任何条件。

删除表记录

DELETE FROM 表名 [WHERE 条件表达式]

如果没有指定 WHERE 子句,MySQL 表中的所有记录将被删除。 你可以在 WHERE 子句中指定任何条件

不带条件删除数据  

DELETE FROM 表名;

-- 不带条件删除数据,删除表中的所有数据

delete from student;

带条件删除数据  

DELETE FROM 表名 WHERE 字段名=值;

-- 带条件删除数据,删除id为1的记录

delete from student where id=1;

使用truncate删除表中所有记录  

TRUNCATE TABLE 表名;

truncate和delete的区别: truncate 相当于删除表的结构,再创建一张表;delete在表内删除 会留有记录


DQL查询表中的数据

SELECT 列名 FROM 表名 [WHERE 条件表达式]   order by 列名 asc 自动升序 / desc 降序

1) SELECT 命令可以读取一行或者多行记录。

2) 你可以使用星号(*)来代替其他字段,SELECT 语句会返回表的所有字段数据

3) 你可以使用 WHERE 语句来包含任何条件。


简单查询

SELECT * FROM 表名;

查询所有的学生:

select * from student;

查询指定列

SELECT 字段名 1, 字段名 2, 字段名 3, ... FROM 表名;

查询 student 表中的 name 和 age 列

select name,age from student;

指定列的别名进行查询 :使用别名的好处: 显示的时候使用新的名字,并不修改表的结构。

对列指定别名

SELECT 字段名 1 AS 别名, 字段名 2 AS 别名... FROM 表名;

-- 使用别名

select name as 姓名,age as 年龄 from student;

对列和表同时指定别名

SELECT 字段名 1 AS 别名, 字段名 2 AS 别名... FROM 表名 AS 表别名;

-- 表使用别名

select st.name as 姓名,age as 年龄 from student as st

清除重复值 (查询只显示指定不重复的列)

SELECT DISTINCT 字段名 FROM 表名;

查询学生来至于哪些地方

-- 查询学生来至于哪些地方

select address from student;

-- 去掉重复的记录

select distinct address from student;

查询结果参与运算 (参与运算的必须是数值类型 )

某列数据和固定值运算  

SELECT 列名 1 + 固定值 FROM 表名;


某列数据和其他列数据参与运算  

SELECT 列名 1 + 列名 2 FROM 表名;


例:

准备数据:添加数学,英语成绩列,给每条记录添加对应的数学和英语成绩,查询的时候将数学和英语的成绩相 加

select * from student;

-- 给所有的数学加 5 分 :  select math+5 from student;


-- 查询 math + english 的和 :  select * from student;


select *,(math+english) as 总成绩 from student;

-- as 可以省略 select *,(math+english) 总成绩 from student;

条件查询

SELECT 字段名 FROM 表名 WHERE 条件;

流程:取出表中的每条数据,满足条件的记录就返回,不满足条件的记录不返回


运算符

        > :大于   <:小于   >=:大于等于   <=:小于等于   <> :不等于

BETWEEN...AND :在一个范围之内,如:between 100 and 200 相当于条件在 100 到 200 之间,包头又包尾

BETWEEN 值 1 AND 值 2    (值1 是小值, 值2 是大值)

-- t1.`salary` BETWEEN t4.`hisalary` AND t4.`losalary`         // 只显示表属性

-- t1.`salary` BETWEEN t4.`losalary` AND t4.`hisalary`  // 显示全部数据

-- t1.`salary` >= t4.`losalary` AND t1.`salary` <= t4.`hisalary` //显示全部数据

--查询 english 成绩大于等于 75,且小于等于 90 的学生

select * from student3 where english between 75 and 90;

IN(集合) :集合表示多个值,使用逗号分隔

SELECT 字段名 FROM 表名 WHERE 字段 in (数据 1, 数据 2...);

-- 查询id是1或3或5的学生: select * from student3 where id in(1,3,5);

-- 查询id不是1或3或5的学生: select * from student3 where id not in(1,3,5);

LIKE '张%' :模糊查询    _表示单个任意字符  %表示多个任意字符  

SELECT * FROM 表名 WHERE 字段名 LIKE '通配符字符串';

-- 查询姓马的学生

select * from student3 where name like "马%";

-- 查询姓名中包含'德'字的学生

select * from student3 where name like '%德%';

-- 查询姓马,且姓名有两个字的学生

select * from student3 where name like '马_';

IS NULL:查询某一列为 NULL 的值,注:不能写=NULL

逻辑运算符

and 或 && 与 : SQL 中建议使用前者,后者并不通用

or 或 || 或

not 或 ! 非

-- 查询 age 大于 35 且性别为男的学生(两个条件同时满足)

select * from student3 where age>35 and sex='男';


-- 查询 age 大于 35 或性别为男的学生(两个条件其中一个满足)

select * from student3 where age>35 or sex='男';


-- 查询 id 是 1 或 3 或 5 的学生

select * from student3 where id=1 or id=3 or id=5;

排序查询

SELECT 列名1,列名2,...,列名N FROM 表名 WHERE 条件 ORDER BY 列名1 [DESC/ASC]   ORDER BY 列名2 [DESC/ASC];

a)升序排序(默认)

                --按照耳机的价格升序排列

                SELECT * FROM headset ORDER BY money;

                SELECT * FROM headset ORDER BY money ASC;

b)降序排序

                --按照耳机的价格降序排列

                SELECT * FROM headset ORDER BY money DESC;

分组查询(配合聚合函数),注意分组每次只会显示该组得第一条数据

SELECT 列名1,列名2,...,列名N FROM 表名 GROUP BY 列名;

例:

SELECT name,SUM(money) AS 'price' FROM headset WHERE name LIKE '%海赛%' GROUP BY name ORDER BY price DESC;


--对筛选结果进行再次过滤时要使用HAVING(HACING是对分组后的数据进行筛选)

SELECT 列名1,列名2,...,列名N FROM 表名 GROUP BY 列名 HAVING 条件;

例:

SELECT name,SUM(money) AS 'price' FROM headset WHERE name LIKE '%海赛%' GROUP BY name HAVING price>2000 ORDER BY price DESC;


注意:

                分组查询中WHERE和HAVING两个关键字的区别


                "WHERE" 是一个约束声明,使用WHERE来约束来之数据库的数据,WHERE是在结果返回之前起作用的,且WHERE中不能使用聚合函数。

                "HAVING"是一个过滤声明,是在查询返回结果集以后对查询结果进行的过滤操作,在HAVING中可以使用聚合函数。

聚合函数:将一列数据作为一个整体,进行纵向的计算。

                1. count:计算个数

                        1. 一般选择非空的列:主键

                        2. count(*)

                2. max:计算最大值

                3. min:计算最小值

                4. sum:计算和

                5. avg:计算平均值


                * 注意:聚合函数的计算,排除null值。

                        解决方案:

                                1. 选择不包含非空的列进行计算

                                2. IFNULL函数               



select  字段列表  from  表名列表  where  条件列表  group by  分组字段  having  分组之后的条件  order by  排序  limit  分页限定



0 个回复

您需要登录后才可以回帖 登录 | 加入黑马