无标题文章

入门SQL语句
数据的增删改查(CRUD)

C: create 增加

R: Retrieve 获取/查询

U:Update 更新

D:Delete 删除

注释方式:

注释语法说明

-- 空格单行注释

/* */多行注释

#单行注释


DDL语句(Data Definition Language 数据定义语言)

作用:创建数据库、创建表、修改表结构

DDL操作数据库:

*创建指定的数据库:

CREATE DATABASE 数据库名;

*指定数据库名或指定数据库字集一般都指定为utf8:

CREATE DATABASE db1_1 CHARACTER SET utf8;

*切换数据库:

USE 数据库名;

*查看当前正在使用的数据库:

SELECT DATABASE 数据库名;

*查看Mysql中都有哪些数据库:

SHOW DATABASES;

*查看一个数据库的定义信息:

SHOW CREATE DATABASE 数据库名;

*将数据库db1 的字符集 修改为 utf8:

ALTER DATABASE db1 CHARACTER SET unf8;

*从MySql中永久的删除某个数据库:

DROP DATABASE 数据库名;

DDL操作数据表:

INT整型、DOUBLE浮点型、VACHAR字符串型、DATA日期型

 

*创建表:

CREATETABLE

category(

cid INT,

caname VARCHA(20)

);

*创建一个表结构相同的表(复制表结构)

CREATE TABLE 新表名LIKE旧表名;

*查看表结构

DESC 表名;

*查看当前数据库中的所有表名:

SHOW TABLES;

*查看创建表的SQL语句:

SHOW CREATE TABLE CATEGORY;

*删除表:(从数据库中永久删除一张表)

DROP TABLE 表名;

*判断表是否存在, 存在的话就删除,不存在就不执行删除

DROP TABLE IF EXISTS 表名;

*修改表名:

RENAME TABLE 旧表名TO 新表名;

*向表中添加列(ADD):

ALTER TABLE 表名ADD 字段名称 字段类型;

*修改表中列的数据类型或长度(MODIFY)

ALTER TABLE 表名MODIFY 字段名称 字段类型;

*修改列名称(CHANGE):

ALTER TABLE 表名CHANGE 旧列名 新列名 类型(长度);

*删除列(DROP):

ALTER TABLE 表名DROP 列名;


DML语句(Data

Manipulation Language 数据操纵语言)

针对table数据表中数据的增删改,使用DML

*插入数据:

INSERT

INTO 表名(字段1,字段2)

VALUES(字段值1,字段值2);

例:表名student

表中字段:

学员ID, sid int

姓名,sname varchar(20)

年龄,age int

性别,sex char(1)

地址,address varchar(40)

-----第一步:创建表

CREATETABLE

student(

sid INT,

snameVARCHAR(20),

age INT,

sexCHAR(1),

address VARCHAR(40)

);

-----第二步插入数据方式一:插入全部字段,将所有字段名写出

INSERT

INTO student(sid,sname,age,sex,address)VALUES

(1,‘赵一’,20,‘女’,‘花果山’);

-----方式二:插入全部字段,不写字段名

INSERT

INTO student VALUES (2,‘张三’,21,‘男’,‘宇宙’);

-----方式三:插入指定字段的值

INSRET

INTO CATEGORY (sname) VALUES (‘王五’);

*修改数据

UPDATE

student set address‘成都’where sname‘王五’------把sname王五那行数据的address列改成成都;

UPDATE

student set address=‘成都’;------把student表中的地址全改成北京

也可以同时改两列:UPDATE

student set address=‘成都’,sex=‘女‘;

*删除数据:

Delete

from 表名(删除所有数据)

Delete

from 表名where sid=1;(删除指定数据)

Truncate table 表名(推荐. 先删除整张表, 然后再重新创建一张一模一样的表. 效率高,当一个表中条数非常多,又要做删除动作的时候,如果用delete会很慢,那我们可以使用truncate)



*Data Query Language 数据查询语言)

针对table数据表中数据的查询操作,使用DQL

简单查询:

*查询表中的所有数据

Select from 表名;

*查询部分字段

Select ename,salaryfrom emp;

*查询一共有几个部门(DISTINCT)

Select DISTINCTdept_name FROM emp;

*将所有员工的工资 +1000 元进行显示

Selectename,salary+1000 from emp;

条件查询:

* select 列名from 表名where 条件表达式

比较运算符


  运算符



  说明


> < <= >= = <> !=大于、小于、小于(大于)等于、等于、不等于


BETWEEN ...AND...

显示在某一区间的值

例如: 2000-10000之间: Between 2000 and 10000


IN(集合)

集合表示多个值,使用逗号分隔,例如: name in (悟空,八戒)


in中的每个数据都会作为一次条件,只要满足条件就会显示

LIKE '%张%'模糊查询

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

条件运算符


  运算符



  说明


And &&多个条件同时成立

Or ||多个条件任一成立

Not不成立,取反。


*查询员工姓名为黄蓉的员工信息

Select * from emp

where ename=‘黄蓉’;

*查询薪水价格为5000的员工信息

select * from empwhere salary=5000;

*查询薪水价格不是5000的所有员工信息

select * from empwhere salary!=5000;

*查询薪水价格大于6000元的所有员工信息

Select * from empwhere salary>6000;

*查询薪水价格在5000到10000之间所有员工信息

Select *from empwhere salary between 5000 and 6000;

*查询薪水价格是3600或7200或者20000的所有员工信息

Select * from empwhere salary=3600 or salary=7200 or salary=20000;

Select * from empwhere salary in(3600,7200,20000);


*查询含有'精'字的所有员工信息(模糊)

Select * from emp

where ename like '%精%';

*查询以'孙'开头的所有员工信息

Select * from emp

where ename like '%孙';

*查询第二个字为'兔'的所有员工信息(要表示第一个字符 用下划线)

Select * from emp

where ename like '_兔%';

*查询没有部门的员工信息

Select * from empwhere dept_name is NULL;

*查询有部门的员工信息

Select * from empwhere dept_name is not null;


第二部分MySQL核心查询

单列排序:通过 ORDER BY 子句,可以将查询出的结果进行排序(排序只是显示效果,不会影响真实数据)

语法结构:SELECT 字段名 FROM表名 [WHERE 字段 = 值]ORDER BY 字段名 [ASC / DESC]

*使用 salary 字段,对emp 表数据进行排序 (升序/降序)

Select * from emp order by salary;    (默认升序)

Select * from emp order by salary desc;

组合排序:同时对多个字段进行排序, 如果第一个字段相同 就按照第二个字段进行排序,以此类推

*在薪水排序的基础上,再使用id进行排序, 如果薪水相同就以id 做降序排序

SELECT * FROM emp ORDER BY salary DESC, eid DESC;

聚合函数:求员工最高工资/平均工资/工资总和,都是聚合函数来做的

语法结构: SELECT 聚合函数(字段名) FROM 表名;


  聚合函数



  作用


count(字段)统计指定列不为NULL的记录行数

sum(字段)计算指定列的数值和

max(字段)计算指定列的最大值

min(字段)计算指定列的最小值

avg(字段)计算指定列的平均值

*查询员工的总数

Select count(*)from emp;     (*也可以用1代替,也可以用字段)

注:count会忽略计算空值

*查看员工总薪水

Select sum(salary)

from emp; 可以单独求

Select sum(salary)‘薪水总和’,max(salary)’最高薪水’,min(salary)‘最低薪水’,avg(salary)‘平均薪水’from emp;   也可以整体一起求

*查询薪水大于4000员工的个数

Select count(*)from emp where salary>4000;

*查询部门为教学部的所有员工的个数

Select count(*)

from emp where dept_name=’教学部’;

*查询部门为市场部的所有员工的平均薪水

Select avg(salary)

from emp where dept_name=’市场部’;

 

分组:

分组往往和聚合函数一起时候,对数据进行分组,分完组之后在各个组内进行聚合统计分析

比如:求各个部门的员工数

指的是使用 GROUP

BY 语句,对查询的信息进行分组,相同数据作为一组,

语法格式:

Select 分组字段/聚合函数 from 表名group by 分组字段[having条件];

                                                   Having是针对条件的过滤

*通过性别字段进行分组,求各组的平均薪资

Select sex,avg(salary)from emp group by sex;

注:1)group by的字段必须出现在select的位置

2)前面select的位置除了出现group by的字段、聚合函数,不能出现其他字段

 *查询每个部门的平均薪资

 Select dept_name ,avg(salary) from emp groupby dept_name;

*查询每个部门的平均薪资,部门名称不能为null

 Select dept_name ,avg(salary)

from emp where dept_name is not null group by dept_name

 *查询平均薪资大于6000的部门

Select dept_name ,avg(salary) from emp where dept_name is not nullgroup by dept_name having avg(salary)>6000;



[endif]

Where 与having 的区别:


Where:进行分组前的条件过滤;where后面不能写聚合函数


Having:对分组后的数据进行过滤;having后面可以写聚合函数

[if !mso]

[endif]分析:

[if !supportLists]1) [endif]   


[endif]

having

[if !mso]

[endif]需要在分组后,对数据进行过滤,使用 关键字

[if !supportLists]2)  [endif]分组操作中的having子语句,是用于在分组后对数据进行过滤的,作用类似于where条件。

Limit关键字查询:

lmit是限制的意思,用于 限制返回的查询结果的行数 (可以通过limit指定查询多少行数据)

SELECT 字段1,字段2... FROM 表名LIMIT offset , length;

offset 起始行数, 从0开始记数, 如果省略 则默认为 0

length 返回的行数

SELECT * FROM emp LIMIT 1,3;

起始页测偏移量怎么计算:

(当前页-1)*每页条数


SQL约束

用SQL语句来创建数据库约束

1)约束的作用:

对表中的数据进行进一步的限制,从而保证数据的正确性、有效性、完整性.    违反约束的不正确数据,将无法插入到表中

注意:约束是针对字段的

2)常见约束


  约束名



  约束关键字


主键primary key

唯一unique

非空not null

外键foreign key

主键的作用:用来表示数据库中的每一条记录(用来唯一标识数据表中的一条记录)

语法格式:字段名 字段类型primary key

创建表时可以加在前面 也可以在后面添加

给已经存在的数据表添加主键约束

Alter table emp addprimary key(eid);

删除主键

Alter table emp dropprimary key(eid);

 

主键自增

*创建表时指定主键,同时指定主键自增

Create table 表名(

  eid intprimary key auto_increment,

DELETE和TRUNCATE对自增长的影响


  清空表数据的方式



  特点


DELETE只是删除表中所有数据,对自增没有影响

 

TRUNCATE

truncate 是将整个表删除掉,然后创建一个新的表自增的主键,重新从 1开始

非空约束

语法结构:字段名 字段类型 not null

*为 ename 字段添加非空约束

CREATE TABLE emp2(

eid INT PRIMARY

KEY AUTO_INCREMENT,

ename VARCHAR(20) NOTNULL,

sex CHAR(1)

);

但凡插入enamel为NULL的数据时会报错

唯一约束

唯一约束的特点: 表中的某一列的值不能重复( 对null不做唯一的判断 )

语法结构:字段名 字段类型 unique

*添加唯一约束

ename VARCHAR(20)unique,

插入相同数据时会提示不能重复

主键约束与唯一约束的区别:

1. 主键约束 唯一且不能够为空(主键约束=非空约束+唯一约束)

2. 唯一约束,唯一 但是可以为空

3. 一个表中只能有一个主键 , 但是可以有多个唯一约束

默认值约束

语法结构:字段名 字段类型 DEFAULT 默认值


*创建emp4表, 性别字段默认女

CREATE TABLE emp4(

eid INT PRIMARY

KEY AUTO_INCREMENT,

ename VARCHAR(20) DEFAULT ‘女', sex CHAR(1)

);


多表查询

外键约束

主键:数据表A中有一列,这一列可以唯一的标识一条记录

外键:数据表A中有一列,这一列指向了另外一张数据表B的主键

什么是外键:

是在从表中与主表的主键对应的那个字段,比如员工表的 dept_id,就是外键

外键约束可以让两张表之间产生一个对应关系,从而保证主从表的引用的完整性

多表关系中的主表和从表

主表: 主键id所在的表,约束别人的表从表: 外键所在的表多, 被约束的表

外键所在的表叫做从表,外键所指向的表叫做主表


创建外键约束

语法格式:

*新建表时添加外键

[CONSTRAINT] [外键约束名称] FOREIGN KEY(外键字段名) REFERENCES 主表名(主键字段名)


*已有表添加外键

ALTER TABLE 从表 ADD

[CONSTRAINT] [外键约束名称]

FOREIGN KEY (外键字段名)

REFERENCES 主表(主 键字段名);


*重新创建employee表, 添加外键约束


CREATETABLE employee(

eid INT PRIMARYKEY AUTO_INCREMENT, ename VARCHAR(20),

age INT,

dept_id INT,  -- 外键字段类型要和主表的主键字段类型保持一致

-- 添加外键约束

CONSTRAINT emp_dept_fkFOREIGN KEY(dept_id) REFERENCES department(id)

);

从表外键 对应主表主键 有值就能插入,主键无值就无法插入对应数据


删除外键约束:

语法格式

alter table 从表 drop foreign key 外键约束名称

*删除从表中的外键约束

Alter table employee dropforeign key emp_dep_fk;

Alter table employee

add foreign key (dept_id) reference department(id);

外键约束的注意事项:

[if !supportLists]1) [endif]从表外键类型必须与主表主键类型一致 否则创建失败.

[if !supportLists]2) [endif]添加数据时,应该先添加主表中的数据.

你可能感兴趣的:(无标题文章)