SQL语言基础
什么是SQL
SQL是Structured Quevy Language(结构化查询语言)的缩写。 SQL是专为数据库而建立的操作命令集,是一种功能齐全的数据库语言。 在使用它时,只需要发出“做什么”的命令,“怎么做”是不用使用者考虑的。
sql功能分类
DDL:数据定义语言(结构)Definition 用来定义数据库对象:创建库,表,列等。
DML:数据操作语言(Manipulation) 用来操作数据库表中的记录
DQL:数据查询语言(Querry) 用来查询数据
DCL:数据控制语言(control) 用来定义访问权限和安全级别
SQL数据类型
char 类型 char(10)"abc "
,七个是空格
int(11) 括号里面是补多少个零
MySQL中定义数据字段的类型对你数据库的优化是非常重要的。
MySQL支持所有标准SQL数值数据类型。
MySQL支持多种类型,大致可以分为三类 数值类型
image字符串类型
image日期和时间类型
image常用数据类型
double:浮点型,例如double(5,2)表示最多5位,其中必须有2位小数,即最大值为999.99;
char:固定长度字符串类型; char(10) 'abc '
varchar:可变长度字符串类型;varchar(10) 'abc'
text:字符串类型;
blob:二进制类型;
date:日期类型,格式为:yyyy-MM-dd;
time:时间类型,格式为:hh:mm:ss
datetime:日期时间类型 yyyy-MM-dd hh:mm:ss
在mysql中,字符串类型和日期类型都要用单引号括起来。'Myxq' '2020-01-01'
DDL
创建数据库
create database 数据库名 character set utf8;
修改数据库
alter database 数据库名 charactor set gbk;
创建学生表
image image
添加一列
ALTER TABLE 表名 ADD 列名 数据类型;
查看表的字段信息
DESC 表名;
修改一个表的字段类型
ALTER TABLE 表名 MODIFY 字段名 数据类型;
删除一列
ALTER TABLE 表名 DROP 字段名;
修改表名
RENAME TABLE 原始表名 TO 要修改的表名;
查看表的创建细节
SHOW CREATE TABLE 表名;
修改表的字符集为gbk
ALTER TABLE 表名 CHARACTER SET 字符集名称;
修改表的列名
ALTER TABLE 表名 CHANGE 原始列名 新列名 数据类型;
删除表
DROP TABLE 表名;
DML
查询表中的所有数据
SELECT * FROM 表名;
DML是对表中的数据进行增、删、改的操作
插入操作
INSERT INTO 表名(列名1,列名2 ...)VALUE (列值1,列值2...);
注意事项 列名与列值的类型、个数、顺序要一一对应。 值不要超出列定义的长度。 插入的日期和字符一样,都使用引号括起来。
批量插入 INSERT INTO 表名(列名1,列名2 ...)VALUES (列值1,列值2...),(列值1,列值2...);
更新操作
UPDATE 表名 SET 列名1=列值1,列名2=列值2 。。。 WHERE 列名=值
把所有学生的分数改为90 update students set score=90
把姓名为zs的学生分数改为60 update student set score=60 where name='zs';
把姓名为李四的年龄改为20和分数改为70 update student set age=20,score=70 where name='ls';
把wc的年龄在原来基础上加1岁 update students set age=age+1 where name='wc';
修改数据库密码 use mysql; update user set password=password('abc') WHERE User='root'; update mysql.user set authentication_string=password('123456') where user='root' and Host = 'localhost'; flush privileges;刷新MySQL的系统权限相关表重要
mysqladmin -u root -p password 123456
删除操作
DELETE FROM 表名 【WHERE 列名=值】 TRUNCATE TABLE 表名;
DELETED 与TRUNCATE的区别 DELETE 删除表中的数据,表结构还在;删除后的数据可以找回 TRUNCATE 删除是把表直接DROP掉,然后再创建一个同样的新表。 删除的数据不能找回。执行速度比DELETE快。
DQL
查询所有列
SELECT * FROM 表名;
结果集
数据库执行DQL语句不会对数据进行改变,而是让数据库发送结果集给客户端。
结果集 通过查询语句查询出来的数据以表的形式展示我们称这个表为虚拟结果集。存放在内存中。 查询返回的结果集是一张虚拟表。
查询指定列的数据
SELECT 列名1,列表2... FROM 表名;
条件查询
条件查询就是在查询时给出WHERE子句,在WHERE子句中可以使用一些运算符及关键字:
条件查询运行符及关键字 =(等于)、!=(不等于)、<>(不等于)、<(小于)、<=(小于等于)、>(大于)、>=(大于等于); BETWEEN…AND;值在什么范围 IN(set);固定的范围值 IS NULL;(为空) IS NOT NULL(不为空) AND;与 OR;或 NOT; 非
使用
查询性别为男,并且年龄为20的学生记录 SELECT * FROM students WHERE gender='男' AND age=20;
查询学号为1001 或者 名为zs的记录** SELECT * FROM students WHERE id ='1001' OR name='zs';
查询学号为1001,1002,1003的记录 SELECT * FROM students WHERE id='1001' OR id='1002' OR 1001='1003'; SELECT * FROM students WHERE id IN('1001','1002','1003'); SELECT * FROM students WHERE id NOT IN ('1001','1002','1003');
查询年龄为null的记录 SELECT * FROM students WHERE age IS NULL;
查询年龄在18到20之间的学生记录 SELECT * FROM students WHERE age>=18 AND age<=20; SELECT * FROM students WHERE age BETWEEN 18 AND 20;
查询性别非男的学生记录 SELECT * FROM students WHERE gender !='男';
查询姓名不为null的学生记录 SELECT * FROM students WHERE name IS NOT NULL;
模糊查询
根据指定的关键进行查询
使用LIKE关键字后跟通配符
通配符
_ :任意一个字符 %:任意0~n个字符
使用
查询姓名由5个字母构成的学生记录 SELECT * FROM students WHERE name LIKE '_';
模糊查询必须使用LIKE关键字。其中 “”匹配任意一个字母,5个“”表示5个任意字母。**
查询姓名由5个字母构成,并且第5个字母为“s”的学生记录 SELECT * FROM students WHERE name LIKE 's';
查询姓名以“m”开头的学生记录 SELECT * FROM students WHERE name LIKE 'm%';
其中“%”匹配0~n个任何字母。
查询姓名中第2个字母为“u”的学生记录 SELECT * FROM students WHERE name LIKE '_u%';
查询姓名中包含“s”字母的学生记录 SELECT * FROM stu WHERE name LIKE '%s%';
字段控制查询
去除重复记录
SELECT DISTINCT name FROM students;
把查询字段的结果进行运算,必须都要是数据型
SELECT *,字段1+字段2 FROM 表名; 列有很多记录的值为NULL, 因为任何东西与NULL相加结果还是NULL,所以结算结果可能会出现NULL。
下面使用了把NULL转换成数值0的函数IFNULL: SELECT *,age+IFNULL(score,0) FROM students;
对查询结果起别名 在上面查询中出现列名为sx+IFNULL(yw,0),这很不美观,现在我们给这一列给出一个别名,为total: SELECT *, yw+IFNULL(sx,0) AS total FROM score; 省略 AS SELECT *, yw+IFNULL(sx,0) total FROM score;
排序
创建表
CREATE TABLE employee
( id
int(11) NOT NULL, name
varchar(50) DEFAULT NULL, gender
varchar(1) DEFAULT NULL,hire_date
date DEFAULT NULL,salary
decimal(10,0) DEFAULT NULL,performance
double(255,0) DEFAULT NULL,manage
double(255,0) DEFAULT NULL, department
varchar(255) DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO employee
VALUES (1001, '张三', '男', '1991-7-25', 2000, 200, 500, '营销部'); INSERT INTO employee
VALUES (1002, '李四', '男', '2017-7-5', 4000, 500, NULL, '营销部'); INSERT INTO employee
VALUES (1003, '王五', '女', '2018-5-1', 6000, 100, 5000, '研发部'); INSERT INTO employee
VALUES (1004, '赵六', '男', '1991-6-1', 1000, 3000, 4000, '财务部'); INSERT INTO employee
VALUES (1005, '孙七', '女', '2018-3-23', 8000, 1000, NULL, '研发部'); INSERT INTO employee
VALUES (1006, '周八', '男', '2010-9-8', 5000, 500, 1000, '人事部'); INSERT INTO employee
VALUES (1007, '吴九', '女', '2017-7-5', 8000, 601, NULL, '研发部'); INSERT INTO employee
VALUES (1008, '郑十', '女', '2014-4-6', 4000, 1801, NULL, '人事部');
对查询的结果进行排序
使用关键字ORDER BY
排序类型
升序ASC 从小到大 默认
降序DESC 从大到小
使用
对所有员工的薪水进行排序 SELECT *FROM employee ORDER BY age ASC;
查询所有学生记录,按年龄降序排序 SELECT * FROM employee ORDER BY age DESC;
查询所有雇员,按月薪降序排序,如果月薪相同时,按编号升序排序 SELECT * FROM employee ORDER BY salary DESC, id ASC;
聚合函数
对查询的结果进行统计计算
常用聚合函数
COUNT():统计指定列不为NULL的记录行数; MAX():计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算; MIN():计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算; SUM():计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0; AVG():计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0;
使用
COUNT 查询employee表中记录数: SELECT COUNT() AS total_record FROM employee;
查询员工表中有绩效的人数 SELECT COUNT(performance) FROM employee;
查询员工表中月薪大于2500的人数: SELECT COUNT() FROM employee WHERE salary > 2500;
统计月薪与绩效之和大于5000元的人数: SELECT COUNT(*) FROM employee WHERE salary+IFNULL(performance,0) > 5000;
查询有绩效的人数,和有管理费的人数: SELECT COUNT(performance), COUNT(manage) FROM employee;
SUM和AVG 查询所有雇员月薪和: SELECT SUM(salary) FROM employee;
查询所有雇员月薪和,以及所有雇员绩效和 SELECT SUM(salary), SUM(performance) FROM employee;
查询所有雇员月薪+绩效和: SELECT SUM(salary+IFNULL(performance,0)) FROM employee;
统计所有员工平均工资: SELECT AVG(salary) FROM employee;
MAX和MIN 查询最高工资和最低工资: SELECT MAX(salary), MIN(salary) FROM employee;