SQL 语句分类
- Data Definition Language (DDL 数据定义语言) 如:建库,建表,用来定义数据库对象
关键字:create、drop、alter 等 - Data Manipulation Language(DML 数据操纵语言),如:对表中的记录操作增删改
关键字:insert、delete、update 等 - Data Query Language(DQL 数据查询语言),如:对表中的查询操作
关键字:select、where 等 - Data Control Language(DCL 数据控制语言),如:对用户权限的设置
关键字:GRANT、REVOKE等
MySQL 的语法
- 每条语句以分号结尾,如果在 SQLyog 中不是必须加的。
- SQL 中不区分大小写,关键字中认为大写和小写是一样的
- 3 种注释:
注释的语法
- --空格 单行注释
- /* */ 多行注释
- 这是 mysql 特有的注释方式
DDL:
操作数据库、表
一、操作数据库:CRUD
-
C:Create 创建
* 创建数据库
*create database 数据库名称;
* 创建db4数据库,判断是否存在
*create database if not exists 数据库名称;
* 创建db4数据库,并指定字符集GBK;
*create database 数据库名称 character set 字符集名;
* 综合一点的练习:创建db4数据库,判断是否存在,并指定字符集GBK;
*create database if not exists db4 character set gbk;
-
R:Retrieve 查询
* 查询所有数据库的名称
show databases;
*查看某个数据库库的字符集,查询某个数据库的创建语句
*SHOW creat databese 数据库的名称;
-
U:Update 修改
* 修改数据库的字符集
*alter database 数据库名称 character set 字符集名称;
-
D:Delete 删除
* 删除数据库;
*drop database 数据库名称;
* 判断数据库是否存在,存在再删除;
*drop database if not exists 数据库名称;
-
使用数据库
* 查询当前正在使用的数据库名称;
*selcet database();
* 使用数据库;
*use 数据库名称;
二、操作表
- C:Create 创建
语法:create table 表名(
列名1 数据类型1,
列名2 数据类型2,
列名3 数据类型3,
...
列名n 数据类型n
);
*最后一列,不需要加逗号“,”
- 数据类型:
- int : 整数类型,例如:age int,
- double :小数类型,例如:score double (5,2);表示最大值是999.99
- date :日期,只包含年月日的日期,yyyy -MM -dd
- datetime :日期,包含年月日时分秒 ,yyyy -MM -dd HH:mm:ss
- timestamp :时间戳类型 ,包含年月日时分秒 ,yyyy -MM -dd HH:mm:ss
*区别,如果是timestamp,如果将来不给这个字段赋值,或者赋值为null ,则默认使用当前的系统时间,来自动赋值。 - varchar :字符串 例如:name varchar(20);表示姓名最大20字符;zhangsan 八个字符,张三,2个字符
超出最大字符会报错*创建表 ;
*create table student(
id int,
name varchar(32),
age int,
scroe double(4,1),
birthday date,
intset_time timestamp
);
* 复制表;
*create table 表名 like 被复制的表名;
- R:Retrieve 查询
* 查询某个数据库中所有表的名称;
*show tables;
* 查询表结构;
*desc 表名;
- U:Update 修改
- 修改表名;
* alter table 表名 rename to 新的表名;
- 修改表的字符集;
* alter table 表名 character set 字符集名称;
- 添加一列:
* alter table 表名 add 列名 数据类型;
- 修改列名称 类型;
* alter table 表名 change 原列名 新列名 新数据类型;
* alter table 表名 modify 原列名 新列名 新数据类型;
- 删除列;
* alter table 表名 drop 列名;
- D:Delete 删除
* 删除表;
*drop table 表名;
*drop table if exists 表名;
客户端图形化工具:SQLYog
安装:
傻瓜式操作,安装完毕以后,注意连接数据库。
配置新连接报错:错误号码 2058,分析是 mysql 密码加密方法变了。
解决方法:windows 下cmd 登录 mysql -u root -p 登录你的 mysql 数据库,然后执行这条SQL:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';(注意分号)
password 是你自己设置的root密码;
然后在重新配置SQLyog的连接,则可连接成功了,就OK了。
DML:增删该表中的数据
- 添加数据:
语法:
* insert into 表名(列名1,列名2,....列名n) values(值1,值2,值3,...值n);
注意事项:
列名和值要一一对应,
如果表名后,不定义列名,则默认给所有列添加值、
* insert into 表名 values(值1,值2,值3,...值n);建议不偷懒
除了数字类型,其他类型需要使用引号(单双都可以)引起来。
问题自己在创建表的时候使用timestamp,不能匹配当前系统时间
2.删除数据:
- 语法:
- delete from 表名[ where 条件]
注意:
1、如果不加条件,则删除表中所有的记录
2、如果要删除所有记录,我们有两种做法,
* 1.delete from 表名 ----------- 不推荐使用,有多少条记录就会执行多少次删除操作,效率低
* 2.truncate table 表名 ------- 推荐使用,删除表,然后再创建一个一摸一样的空表,效率更高
3.修改数据:
语法: - update 表名 set 列名1=值1,列名2= 值2.... [where 条件];
注意:
如果不加任何条件,则会将表中全部记录修改
DQL : 查询
*select * from 表名
语法:
select
字段列表
from
表名列表
where
条件列表
group by
分组字段
having
分组之后的条件
order by
排序
limit
分页限定
2、基础查询
1.多个字段的查询
select 字段名1,字段名2....from 表名;
注意如果查询所有字段则可以使用select * from 表名,这是简化的形式,用* 代替
2.去除重复
select distinct 结果集 from 表名;
如果去除多个字段重复的,必须是结果集完全一致的情况下才行,
3.计算列
一般可以使用四则运算计算一些列的值(一般智慧进行数值的运算)
ifnull(表达式1,表达式2); 表达式1:哪个字段需要判断是否为null,表达式2:如果为null,替换为。。
select name,math,english,math+english from student;
select name,math,english,math+ifnull(english,0) from student;谁有可能为null,就ifnull谁。
如果有null参与计算,计算结果都为null,
4.起别名
as :as 也可以省略
select name,math,english,math+ifnull(english,0) AS 总分 from student;
select name,math,english,math+ifnull(english,0) 总分 from student;或者用空格
3、条件查询
1.where 子句后跟条件
2.运算符
* >、<、<=、>=、=、<> ----------<>在 SQL 中表示不等于,在 mysql 中也可以使用!=
没有==
* BETWEEN...AND ---------在一个范围之内,如:between 100 and 200相当于条件在 100 到 200 之间,包头又包尾
* IN(集合) ------------集合表示多个值,使用逗号分隔
* LIKE '张%' ---------------模糊查询
占位符:
_:单个任意字符
%:多个任意字符
* IS NULL-------------查询某一列为 NULL 的值,注:不能写=NULL
逻辑运算符
* and 或 && -----------------与,SQL 中建议使用前者,后者并不通用。
* or 或 || ------------或
* not 或 !------------------- 非
例如:
select * from student where age >20;--查询年龄大于20
select * from student where age >=20;--查询年龄大于等于20
select * from student where age =20;--查询年龄等于20
select * from student where age !=20;--查询年龄不等于20
select * from student where age <>20;--查询年龄不等于20
select * from student where age >=20 and age <=30;--查询年龄大于等于20,小于等于30
select * from student where age between 20 and 30;--查询年龄大于等于20,小于等于30
--查询年龄22岁,18岁,25岁的人,
select * from student where age =22 or age = 18 or age = 25;
select * from student where age in(22,18,25) ;
--查询英语成绩为null;
select * from student where English is null;
--查询英语成绩不为null
select * from student where English is not null;
-- 查询姓马的有哪些
select * from student where name like '马%';
--查询第二个字是化的人
select * from student where name like '_马%';
--查询姓名是三个字的人
select * from student where name like '___';--三个下划线_
--查询姓名中包含马的人
select * from student where name like '%马%';