课程参考
数据库及SQL/MySQL基础
1、常见数据库: Oracle:甲骨文; DB2:IBM; SQL Server:微软; Sybase:赛尔斯; MySQL:甲骨文
2、数据库全称:关系型数据库管理系统(RDBMS),即数据库服务器, Manager->databases->tables(管理员->仓库->表)
3、表结构:包含列数、列名称、列类型; 表记录:具体数据; 先给定表结构,再插入表记录
4、SQL:结构化查询语言。客户端使用其来操作服务器。
5、虽不区分大小写,但建议大写
6、数据库操作
- DDL:表结构操作,包括表创建、修改、删除;
- DML:表记录操作,包括表增,删,改;
- DQL:表记录查询(重点、难点);
- DCL:对用户的创建和授权
DDL 数据定义语言
1、查看所有数据库
mysql> SHOW DATABASES;
切换数据库(注意先选库才能再查表)
mysql> USE TEST;
创建数据库
mysql> CREATE DATABASE [IF NOT EXISTS] mydb [CHARSET=utf8];
删除数据库
mysql> DROP DATABASE mydb;
2、常用数据类型(列类型):
- Int 整型
- double 浮点型,double(5,2)表示,最多五位,并且包含两位小数
- decimal 浮点型,在表单钱方面使用该类型,因为不会出现精度缺失
- char 固定长度字符串类型,最大char(255),例如时间、身份证
- varchar 可变长度字符串类型,最大varchar(65535),例如姓名、备注
3、MySQL独有类型:
- text(clob) 字符串类型,分为很小 tinytext (2^8-1B)、小 text (2^16-1B)、中 mediumtext (2^24-1B)、大 longtext (2^32-1B)
- text(blob) 字节类型,分为tinyblob、blob、mediumblob、longblob
- date 日期类型,格式为:yyyy-MM-dd
- time 时间类型,格式为:hh:mm:ss
- timestamp 时间戳类型
4、创建表
mysql> CREATE TABLE tb_stu(
-> number char(11),
-> name varchar(50),
-> age int,
-> gender varchar(10)
-> );
查看表结构
mysql> DESC tb_stu;
| Field | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| number | char(11) | YES | NULL | ||
| name | varchar(50) | YES | NULL | ||
| age | int | YES | NULL | ||
| gender | varchar(10) | YES | NULL |
修改表
mysql> ALTER TABLE tb_stu
-> ADD(
-> education varchar(50)
-> );
mysql> DESC tb_stu;
| Field | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| number | char(11) | YES | NULL | ||
| name | varchar(50) | YES | NULL | ||
| age | int | YES | NULL | ||
| gender | varchar(10) | YES | NULL | ||
| education | varchar(50) | YES | NULL |
mysql> ALTER TABLE tb_stu
-> MODIFY education varchar(100);
mysql> DESC tb_stu;
| Field | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| number | char(11) | YES | NULL | ||
| name | varchar(50) | YES | NULL | ||
| age | int | YES | NULL | ||
| gender | varchar(10) | YES | NULL | ||
| education | varchar(100) | YES | NULL |
mysql> ALTER TABLE tb_stu
-> DROP education;
mysql> DESC tb_stu;
| Field | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| number | char(11) | YES | NULL | ||
| name | varchar(50) | YES | NULL | ||
| age | int | YES | NULL | ||
| gender | varchar(10) | YES | NULL |
mysql> ALTER TABLE tb_stu
-> RENAME TO t_stu;
mysql> SHOW TABLES;
| Tables_in_test |
|---|
| t_stu |
| websites |
DML 数据操作语言
1、查询表记录(属于DQL)
mysql> select * from t_stu;
2、在数据库中所有的字符串类型,必须使用单引号,不能用双引号
3、插入表记录
mysql> insert into stu(
-> number, name, age, gender
-> )values(
-> 'ITCAST_0001', 'zhangSan', 28, 'male'
-> );
mysql> insert into stu(
-> number, name
-> )values(
-> 'ITCAST_0002', 'liSi'
-> );
mysql> select * from stu;
| number | name | age | gender |
|---|---|---|---|
| ITCAST_0001 | zhangSan | 28 | male |
| ITCAST_0002 | liSi | NULL | NULL |
mysql> insert into stu values(
-> 'ITCAST_0003', 'wnagHu', 82, 'female'
-> );
mysql> select * from stu;
| number | name | age | gender |
|---|---|---|---|
| ITCAST_0001 | zhangSan | 28 | male |
| ITCAST_0002 | liSi | NULL | NULL |
| ITCAST_0003 | wnagHu | 82 | female |
4、修改表记录
mysql> update stu set name='wangHu'
-> where number='ITCAST_0003';
mysql> select * from stu;
| number | name | age | gender |
|---|---|---|---|
| ITCAST_0001 | zhangSan | 28 | male |
| ITCAST_0002 | liSi | NULL | NULL |
| ITCAST_0003 | wangHu | 82 | female |
mysql> update stu set age=18
-> where name='wangHu' or number='ITCAST_0003';
mysql> select * from stu;
| number | name | age | gender |
|---|---|---|---|
| ITCAST_0001 | zhangSan | 28 | male |
| ITCAST_0002 | liSi | NULL | NULL |
| ITCAST_0003 | wangHu | 18 | female |
mysql> update stu set age=age+1
-> where age between 20 and 40;
mysql> select * from stu;
| number | name | age | gender |
|---|---|---|---|
| ITCAST_0001 | zhangSan | 29 | male |
| ITCAST_0002 | liSi | 39 | NULL |
| ITCAST_0003 | wangHu | 18 | female |
mysql> update stu set age=36
-> where name in ('zhangSan', 'liSi');
mysql> select * from stu;
| number | name | age | gender |
|---|---|---|---|
| ITCAST_0001 | zhangSan | 36 | male |
| ITCAST_0002 | liSi | 36 | NULL |
| ITCAST_0003 | wangHu | 18 | female |
mysql> update stu set gender='male'
-> where gender=NULL;
Query OK, 0 rows affected (0.00 sec)
Rows matched: 0 Changed: 0 Warnings: 0
mysql> update stu set gender='male'
-> where gender is null;
mysql> select * from stu;
| number | name | age | gender |
|---|---|---|---|
| ITCAST_0001 | zhangSan | 36 | male |
| ITCAST_0002 | liSi | 36 | male |
| ITCAST_0003 | wangHu | 18 | female |
3、删除表记录
Delete from stu where 条件;
DCL 数据控制语言
1、创建用户,通常一个项目创建一个用户,且一个项目对应一个数据库
用户lym可在指定的localhost这一IP地址上登录
mysql> create user lym@localhost identified by '123';
MacBook-Pro-2:~ liuyiming$ mysql -u lym -p ‘123’
mysql> show databases;
| Database |
|---|
| information_schema |
注意,这样写该用户只能看见系统自带数据库,若想用户可在任意IP地址上登录,可写成
Create user 用户名@‘%’ identified by ‘密码’
2、用户授权
先切换到超级用户
mysql> grant all on test.* to lym@localhost;
mysql> show databases;
| Database |
|---|
| information_schema |
| test |
3、撤销权限
mysql> revoke delete on test.* from lym@localhost;
4、查看权限
mysql> show grants for lym@localhost;
5、删除用户
mysql> drop user lym@localhost;
DQL 数据查询语言
1、查询所有列
mysql> select * from stu;
2、制定列查询
mysql> select ename,sal from emp;
3、完全重复的记录显示一次
mysql> select distinct deptno from emp;
4、列运算
mysql> select *,sal*1.5 from emp;
| empno | ename | job | mgr | hiredate | sal | comm | deptno | sal*1.5 |
|---|---|---|---|---|---|---|---|---|
| 1002 | 黛绮丝 | 销售员 | 1006 | 2001-02-20 | 16000.00 | 3000.00 | 30 | 24000.00 |
| 1001 | 甘宁 | 文员 | 1013 | 2000-12-17 | 8000.00 | NULL | 20 | 12000.00 |
| 1003 | 殷天正 | 销售员 | 1006 | 2001-02-22 | 12500.00 | 5000.00 | 30 | 18750.00 |
| 1004 | 刘备 | 经理 | 1009 | 2001-04-02 | 29750.00 | NULL | 20 | 44625.00 |
| 1005 | 谢逊 | 销售员 | 1006 | 2001-09-28 | 12500.00 | 14000.00 | 30 | 18750.00 |
| 1006 | 关羽 | 经理 | 1009 | 2001-05-01 | 28500.00 | NULL | 30 | 42750.00 |
| 1007 | 张飞 | 经理 | 1009 | 2001-09-01 | 24500.00 | NULL | 10 | 36750.00 |
| 1008 | 诸葛亮 | 分析师 | 1004 | 2007-04-19 | 30000.00 | NULL | 20 | 45000.00 |
| 1009 | 曾阿牛 | 董事长 | NULL | 2001-11-17 | 50000.00 | NULL | 10 | 75000.00 |
| 1010 | 韦一笑 | 销售员 | 1006 | 2001-09-08 | 15000.00 | 0.00 | 30 | 22500.00 |
| 1011 | 周泰 | 文员 | 1008 | 2007-05-23 | 11000.00 | NULL | 20 | 16500.00 |
| 1012 | 程普 | 文员 | 1006 | 2001-12-03 | 9500.00 | NULL | 30 | 14250.00 |
| 1013 | 庞统 | 分析师 | 1004 | 2001-12-03 | 30000.00 | NULL | 20 | 45000.00 |
| 1014 | 黄盖 | 文员 | 1007 | 2002-01-23 | 13000.00 | NULL | 10 | 19500.00 |
| 1015 | 张三 | 保洁员 | 1001 | 2013-05-01 | 80000.00 | 50000.00 | 50 | 120000.00 |
任何东西和NULL相加等于NULL
把NULL转换成某东西
mysql> select *,sal+ifnull(comm,0) from emp;
不能用加号连接字符串
mysql> select concat(ename, job) from emp;
| concat(ename, job) |
|---|
| 黛绮丝销售员 |
| 甘宁文员 |
| 殷天正销售员 |
| 刘备经理 |
| 谢逊销售员 |
| 关羽经理 |
| 张飞经理 |
| 诸葛亮分析师 |
| 曾阿牛董事长 |
| 韦一笑销售员 |
| 周泰文员 |
| 程普文员 |
| 庞统分析师 |
| 黄盖文员 |
| 张三保洁员 |
给列起别名
mysql> select ename as 姓名, job as 工作 from emp;
mysql> select ename 姓名, job 工作 from emp;
SQL题:mysql> select empno, ename job, sal from emp;这条语句是正确的
5、条件控制
mysql> select * from emp where sal>20000;
mysql> select * from emp where comm is not null;
mysql> select * from emp where sal between 20000 and 30000;
mysql> select * from emp where job in ('经理', '分析师');
6、模糊查询
人名中有两个字,并且第一个字是’张’
mysql> select * from emp where ename like '张_';
人名中有三个字,并且第一个字是’张’
mysql> select * from emp where ename like '张__';
人名中有三个字
mysql> select * from emp where ename like '___';
人名以’刚’结尾,%指匹配0个或多个字符
mysql> select * from emp where ename like '%刚';
人名包含’小’
mysql> select * from emp where ename like ‘%小%';
7、排序
升序
mysql> select * from emp order by sal asc;
降序
mysql> select * from emp order by sal desc;
两条件排序
mysql> select * from emp order by sal asc, comm desc;
三条件排序
mysql> select * from emp order by sal asc, comm desc, empno asc;
8、聚合函数
总员工数,NULL不计数
mysql> select count(*) from emp;
SQL题:mysql> select count(1) from emp;这条语句与count(*)的查询结果相同,并不是错的。
总工资数,NULL记为0
mysql> select sum(sal) from emp;
mysql> select max(sal) from emp;
mysql> select min(sal) from emp;
mysql> select avg(sal) from emp;
mysql> select count(*) 人数, sum(sal) 总和, max(sal) 最高, min(sal) 最低, avg(sal) 平均 from emp;
| 人数 | 总和 | 最高 | 最低 | 平均 |
|---|---|---|---|---|
| 15 | 370250.00 | 80000.00 | 8000.00 | 24683.333333 |
9、分组查询
不同工种的人数
mysql> select job, count(*) from emp group by job;
以下是错误的,ename不是组信息或聚合函数
mysql> select job, count(*), ename from emp group by job;
不同工种的人数和最大工薪
mysql> select job, count(*), max(sal) from emp group by job;
每个部门中工薪大于15000的员工个数
mysql> select deptno, count(*) from emp where sal>15000 group by deptno;
每个部门中工薪大于15000的员工个数,并且个数大于等于2的部门
mysql> select deptno, count(*) from emp where sal>15000 group by deptno having count(*)>=2;
总结
以上查询语句的重要性排序:Select、 from、 where、 group by、 having、 order by
MySQL特有语句
limit(常用在分页查询)
查询第1-5行
mysql> select * from emp limit 0, 5;
查询第9-13行
mysql> select * from emp limit 8, 5;
查询第14-18行
mysql> select * from emp limit 13, 5;
一页记录10行,查询第3页
mysql> select * from emp limit 20, 10;
(当前页-1)*每页记录数