一、SQL的分类
- DDL(Data Definition Language):数据定义语言,用来操作数据库对象:库、表、列等;
- DML(Data Manipulation Language):数据操作语言,用来增删改数据库中的数据;
- DCL(Data Control Language):数据控制语言,用来设置访问权限和安全级别;
- DQL(Data Query Language):数据查询语言,用来查询数据库中的数据。
二、MySQL中DDL常用命令
1、操作数据库
操作数据库动作 | sql语句 |
创建数据库 | create database test1; |
按照指定字符编码(gbk)创建数据库: | Create database test1 character set gbk; |
查看数据库 | show databases; |
查看数据的定义信息: | show create database test1; |
修改数据库:将study2数据库的编码修改为utf-8; | alter database test1 character set utf8; |
删除数据库 | drop database test1; |
查看当前使用的数据库 | select database(); |
切换数据库 | use test1; |
2、操作数据库表
操作数据库表动作 | sql语句 |
创建表语法:(注意最后一个字段后面不能加逗号,否则报错) | create table test1( 字段1 字段类型, 字段2 字段类型, 字段3 字段类型 ); |
查看数据库中所有的表 | show tables; |
查看表的字段信息 | desc test1; |
在上面员工表的基本上增加一个address列。 | alter table test1 add address varchar(100); |
修改job列,使其长度为30。 | alter table test1 modify job varchar(30); |
删除address列,一次只能删一列。 | alter table test1 drop address; |
表名改为user。 | rename table test1 to user; |
查看表格的创建细节 | show create table user; |
修改表的字符集为gbk | alter table user character set gbk; |
列名name修改为username | alter table user change name username varchar(20); |
删除表 | drop table user ; |
3、常用的字段数据类型:
常用的字段数据类型: |
int:整型 |
double:浮点型,例如double(5,2)表示最多5位,其中必须有2位小数,即最大值为999.99; |
char:固定长度字符串类型; char(10) 如果不足10位则会自动补足10位:'abc ' |
varchar:可变长度字符串类型;varchar(10) 如果不足10位不会补足:'abc',性能不如char高 |
text:字符串类型;适用于大文本内容。 |
blob:字节类型; |
date:日期类型,格式为:yyyy-MM-dd; |
time:时间类型,格式为:hh:mm:ss |
timestamp:时间戳类型 yyyy-MM-dd hh:mm:ss 会自动赋值 |
datetime:日期时间类型 yyyy-MM-dd hh:mm:ss |
4、补充SQL中char、varchar、nchar、nvarchar的区别
- 字符中,英文字符只需要一个字节存储,汉字需要两个字节存储。英文与汉字同时存在时容易造成混乱,
- Unicode字符集就是为了解决字符集这种不兼容的问题而产生的,它所有的字符都用两个字节表示,即英文字符也是用两个字节表示。
- nchar、nvarchar它存储Unicode字符,即所有的字符都用两个字节表示并存储。所以nchar、nvarchar长度是在1到4000之间,最多存储4000个字符。
- char、varchar它存储非Unicode字符,即英文字符只需要一个字节存储,汉字需要两个字节存储。所以最多存储8000个英文,4000个汉字。
- 可以看出使用nchar、nvarchar数据类型时不用担心输入的字符是英文还是汉字,较为方便,但在存储英文时数量上有些损失。
5、补充SQL中char(n)、varchar(n)的区别
- char(n):固定长度字符串类型,n 必须是一个介于 1 和 8,000 之间的数值
- 例如char (10),它是定长的,当你输入的字符长度小于10时,它会再后面补空值,保证存储字符串长度为10。当你输入的字符大于10时,会报错。取数据的时候,char类型的要用trim()去掉多余的空格,而varchar是不需要的。
- varchar(n):可变长度字符串类型,n 必须是一个介于 1 和 8,000 之间的数值。
- 例如varchar(10);表示最多存储10个字符,英文或汉字都行。特别说明是10个字符或者10个汉字。有人认为汉字占2位,只能存储5个汉字,但是实际测试证明这里的10是指字符数量,如果是10个汉字,则是存储了20位字节,命令不会报错,因为varchar是可变长度。
- 可变的意思表示当你输入的字符小于10时,它不会在后面补空值。假如输入3个字符,则他存储长度为3,超过10个字符则报错。
三、MySQL之DML常用命令
DML是对数据库表中的数据进行增、删、改的操作,即添加表中的数据,删除表中的数据,修改表中的数据。MySQL的DML命令主要下面三个关键字:INSERT、DELETE、UPDATE组成。(下图由于表格太大放上去格式变乱,所以改成截图)
补充DELETE和TRUNCATE的区别:
- DELETE只是删除表中的数据,不删除表,删除后的数据可以恢复。
- TRUNCATE删除是把表直接删掉(drop),然后再创建一个同样的新表。删除的数据不能找回。执行速度比DELETE快。
- 开发中通常使用DELETE。
四、MySQL之DQL常用命令--简单查询
DQL中主要是用来查询数据库中的数据,不会对数据库中的数据进行改变,查询关键字:SELECT
语法:SELECT 字段名 FROM 表名 [WHERE –> GROUP BY –>HAVING–> ORDER BY];其中[]中的内容是查询条件。
简单查询动作 | sql语句 |
查询单个字段: | select ename from test1; |
查询test1表中的全部字段: | select * from test1; 说明:开发中不建议使用*,因为会先将其编译成字段,然后再去查询,稍微影响一些性能,而且也不明确,在开发中建议将要查询的字段都写上。 |
查看数据库 | show databases; |
查询字段使用数学表达式 | 查询员工编号,姓名和年薪: select test1no,ename,sal*12 from test1; |
将查询出的字段名称进行重命名 | select test1no,ename,sal * 12 as yearsal from test1; 其中as可以省略: select test1no,ename,sal * 12 yearsal from test1; 可以用中文,中文需要使用”引上: select test1no,ename,sal * 12 as '年薪' from test1; |
包含where关键字的条件查询
条件查询动作(where) | sql语句 |
单个条件查询 | select name from test1 where sal = 5000; 在test1表下,查询满足sal=5000条件的名字name |
查询条件是varchar类型,使用""引上 | select empno,ename,job from emp where job = 'manager'; |
查询某个字段不等于某个值 | select empno,ename,sal from emp where sal <> 5000; mysql中<>表示不等于,!=也表示不等于,两者的含义和使用方式是一样的 |
查询条件为某个区间,用between … and … | select empno,ename,sal from emp where sal between 1600 and 3000; 等效于 select empno,ename,sal from emp where sal >= 1600 and sal <= 3000; |
查询某个字段为空或者非空,is null 和 is not null | select empno,ename,comm from emp where comm is null; select empno,ename,comm from emp where comm is not null; |
查询同时满足多个条件 | select empno,ename,job,sal from emp where job ='MANAGER' and sal > 2500; 用and:表示且,可以在where后面可以添加多个限制条件。 |
查询满足多个条件的一个即可 | select ename,job from emp where job = 'SALESMAN' or job = 'MANAGER'; or:表示或,只要满足一项条件即可。 |
and和or表达式的优先级:and优先级高于or。 | select * from emp where sal>1800 and (deptno=20 or deptno=30); |
查询字段属于某几个值的其中一个,用in 、not in | select ename,job from emp where job in ('SALESMAN','MANAGER'); select ename,sal from emp where sal not in (1600,3000); 只要满足一项条件即可,完全可以采用or来表示,采用in会更简洁一些 |
模糊查询:like 在数据量较大的情况下,使用like会影响性能。 | 查询姓名以M开头的所有员工: select ename from emp where ename like 'M%'; 查询姓名以N结尾的所有员工: select ename from emp where ename like '%N'; 查询姓名中包含O的所有员工: select ename from emp where ename like '%O%'; 查询姓名中第二个字母是A的所有员工: select ename from emp where ename like '_A%'; 说明:‘_’是占位符,说明占了第几位,而%这是任意几位。 |
附:MySQL语句大小写问题
- 注意:mysql在windows下是不区分大小写的,在linux中区分大小写,规则如下:
- 数据库名与表名是严格区分大小写的;
- 表的别名是严格区分大小写的;
- 字段名和字段的别名在所有的情况下均是忽略大小写的;
- 变量名也是严格区分大小写的;
- 可以在linux中修改mysql配置使其忽略大小写。