SQL 入门基础

SQL方案语句:用于创建数据库对象(表、索引、约束等)的语句

SQL数据语句:用于创键、操作、检索保存在数据库中的数据的语句

SQL事务语句:用于开始、结束、回滚事务

SQL专业术语
实体 数据库用户所关注的对象,如顾客、部门等
存储在表中的独立数据片段
完整的描述一个实体,也称为记录
行的结果,既可以保存在内存中,也可以保存在存储设备中
结果集 一般为SQL查询的结果
主键 用以唯一标识表中每个行的一个或多个列
外键 一个或多个用于识别其他表中某一行的列

 创建数据库

  • mysql客户端程序允许你通过用户账户和密码连到网络中任何地方的MySQL数据库服务器。默认情况下,如果你在命令行上输入mysql,且不加任何参数,它会试图用Linux登录用户名连接运行在同一Linux系统上的MySQL服务器。可以使用-u参数指定登录用户名。-p参数告诉mysql程序提示输入登录用户输入密码.用root用户登录MySQL:
 $ mysql -u root -p (database)
  • MySQL服务器将数据组织成数据库。数据库通常保存着单个应用程序的数据,与用这个数据库服务器的其他应用互不相关。应该为每个应用程序CREATE一个单独的数据库。创建示例数据库:
mysql> create database bank;
mysql> CREATE DATABASE IF NOT EXISTS bank default charset utf8 COLLATE utf8_general_ci;
  • 用root管理员账户连接到MySQL服务器。这个账户可以完全控制所有的MySQL服务器对象,但同样是是极其危险的。明智的做法是在MySQL上创建一个仅对应用中所涉及的数据库有权限的独立用户账户。可以用GRANT语句来完成分配权限操作创建用户user并赋予数据库权限:
#新版的的mysql版本已经将创建账户和赋予权限的方式分开了
mysql> create user 'user'@ 'localhost' identified by '123';
Query OK, 0 rows affected (0.46 sec)
mysql>grant all privileges on bank.* to 'user'@ 'localhost';
Query OK, 0 rows affected (0.22 sec)
mysql>GRANT SELECT,INSERT,DELETE,UPDATE    #赋予查询、插入、删除、更新权限
  -> ON mytest.*                            #权限作用的数据库和表 database.table
  -> TO 'user'@ 'localhost';                           
  • 用SQL命令SHOW来显示当前在MySQL服务器上配置过的数据库,然后用SQL命令USE来连接到单个数据库。mysql会话一次只能连一个数据库。连接bank数据库:
mysql> use bank;
Database changed
mysql> USE mysql;
Database changed
MySQL的数据类型

char

定长字符串值(使用空格向右填充)

为数据列指定非默认的字符集:varchar(20) character set utf8

改变整个数据集的默认字符集:create database foreign_sales character set utf8

varchar 变长字符串值
int 整数值    
float、double 浮点值  
boolean 布尔类型true/false    
date YYYY-MM-DD 1000-01-01 ~ 9999-12-31
time HHH:mm:ss -838:59:59 ~ 838:59:59
datetime YYYY-MM-DD HH:MI:SS 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59
 timestamp YYYY-MM-DD HH:MI:SS 1970-01-01 00:00:00 ~ 2037-12-31 23:59:59
text 长字符串值 更大存储空间的有mediumtext和longtext
BLOB 大的二进制值 比如图片或视频

导入数据库

将外部的数据库文件(*.sql)导入到本地mysql服务器中:

  1. 创建空的数据库:mysql > create database world; 
  2. 关联数据库: mysql > use world;
  3. 利用source命令读入文件:mysql > source D:\mysql-8.0.13-winx64\data\world.sql (切记此处不要加分号;)

创建表

  • 第一步:设计

我们从几个方面来描述个人的信息类型:姓名;性别;出生日期;地址;最喜爱的食物。

  • 其中性别只允许单个字母M或F。
  • 为了确保没有重复的列,我们将信息进一步精细划分划分
  • 可能存在名字相同,需要有个主键保证唯一性
  • 最喜爱的食物可能包含更多条目的列表,最好为此数据创建一个独立的表,其中包含一个指向person表的外键。以便为每一种食物指明所归属的人员
person表
类型 允许值
person_id int(unsigned)  
first_name varchar(20)  
last_name varchar(20)  
gender char(1) M,F
birth_date date  
street  varchar(30)  
city varchar(20)  
state varchar(20)  
country varchar(20)  
postal_code varchar(20)  

person表已经有了主键(person_id)来保证唯一性,下一步建立favorite_food表,其中包含一个指向person表的外键

favorite_food表
person_id int(unsigned)
food varchar(20)
  •  第二步:创建SQL方案语句

person表的创建语句如下:

mysql> create table person (
    -> person_id int not null,
    -> fname varchar(20),
    -> lname varchar(20),
    -> gender ENUM('M','F'),
    -> birth_date date,
    -> street varchar(20),
    -> city  varchar(20),
    -> state  varchar(20),
    -> country  varchar(20),
    -> postal_code varchar(20),
    -> constraint pk_person primary key (person_id)
    -> );

如果想确认person表是否被创建,那么可以使用describe命令(简写desc)检查表定义。在创建表时,可以允许

mysql> desc person;
+-------------+---------------+------+-----+---------+-------+
| Field       | Type          | Null | Key | Default | Extra |
+-------------+---------------+------+-----+---------+-------+
| person_id   | int(11)       | NO   | PRI | NULL    |       |
| fname       | varchar(20)   | YES  |     | NULL    |       |
| lname       | varchar(20)   | YES  |     | NULL    |       |
| gender      | enum('M','F') | YES  |     | NULL    |       |
| birth_date  | date          | YES  |     | NULL    |       |
| street      | varchar(20)   | YES  |     | NULL    |       |
| city        | varchar(20)   | YES  |     | NULL    |       |
| state       | varchar(20)   | YES  |     | NULL    |       |
| country     | varchar(20)   | YES  |     | NULL    |       |
| postal_code | varchar(20)   | YES  |     | NULL    |       |
+-------------+---------------+------+-----+---------+-------+
10 rows in set (0.04 sec)

创建favorite_food表:

  • 一个人有多种喜爱的食物,仅靠person_id不能保证唯一性,本表的主键包含两列:person_id 和food。
  • 本表包含另一个约束,外键约束,它限制了favorite表中的person_id列的值只能来自person表。
mysql> create table favorite_food(
    -> person_id int not null,
    -> food varchar(20),
    -> constraint pk_favorite_food primary key (person_id,food),
    -> constraint fk_fav_food_person_id foreign key (person_id) references person (person_id)
    -> );
Query OK, 0 rows affected (0.79 sec)
mysql> desc favorite_food;
+-----------+-------------+------+-----+---------+-------+
| Field     | Type        | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+-------+
| person_id | int(11)     | NO   | PRI | NULL    |       |
| food      | varchar(20) | NO   | PRI | NULL    |       |
+-----------+-------------+------+-----+---------+-------+

操作和修改表

  • 插入

使用SQL命令INSERT向表中插入新的记录。每条INSERT命令都必须指定数据字段值来供MySQL服务器接受该记录。每个数据字段的值都用逗号分开。

mysql> insert into person
    -> (person_id,fname,lname,gender,birth_date)
    -> values(1,'William','Turner','M','1972-05-27');        #字符串转为日期类型

mysql> select person_id,fname,lname,birth_dat
    -> from person;
mysql> select person_id,fname,lname,birth_dat
    -> from person
    -> where lname="Turner";
+-----------+---------+--------+------------+
| person_id | fname   | lname  | birth_date |
+-----------+---------+--------+------------+
|         1 | William | Turner | 1972-05-27 |
+-----------+---------+--------+------------+

如果你试图添加另外一条包含相同的empid数据字段值的记录,就会得到一条错误消息 。但如果你将empid的值改成唯一的值,那就没问题了

mysql> insert into employees values (1,'blum','barbara',25000.00);
ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'
mysql> insert into employees values (2,'blum','barbara',25000.00);
Query OK, 1 row affected (0.00 sec)

同时我们向William插入三种喜爱的食物偏好。利用order by语句对查询返回结果进行排序

mysql> insert into favorite_food (person_id,food) values(1,'pizza');
Query OK, 1 row affected (0.11 sec)

mysql> insert into favorite_food (person_id,food) values(1,'cookies');
Query OK, 1 row affected (0.12 sec)

mysql> insert into favorite_food (person_id,food) values(1,'nachos');
Query OK, 1 row affected (0.10 sec)

mysql> select food from favorite_food where person_id =1 order by food;
+---------+
| food    |
+---------+
| cookies |
| nachos  |
| pizza   |
+---------+
3 rows in set (0.00 sec)

mysql> select * from favorite_food;
+-----------+---------+
| person_id | food    |
+-----------+---------+
|         1 | cookies |
|         1 | nachos  |
|         1 | pizza   |
+-----------+---------+
3 rows in set (0.00 sec)
  •  删除

从表中删除数据,可以用DELETE,其中table指定了要从中删除记录的表。默认情况下它会删除该表中所有记录

mysql> DELETE FROM table;        #删除所有记录
mysql> delete from person where person_id=2

使用drop语句完全清理掉表。包括本地存储文件。

mysql > DROP TABLE favorite_food
mysql > DROP TABLE person
  • 更新数据

通过update语句补全William的缺失值

mysql> update person set street = '1225 tremont St.',city='Boston',state='MA',country='USA',postal_code='02138' 
    -> where person_id=1;
Query OK, 1 row affected (0.34 sec)
Rows matched: 1  Changed: 1  Warnings: 0    #匹配了一行数据;修改了一行数据
  • 表格属性修改

数字型主键生成机制

在MySQL中,有一种安全的产生数字型主键的方法,自增特性。一般情况下,在表格创建时就进行此项工作,但我们可以利用alter Table 来修改已经存在的表定义:

alter table person modify person_id int auto_increment

当向person表插入数据时,可以简单的将person_id设为null(设置为可以为null),mysql会向该列自动提供下一个可用的主键数字(从1开始自增)

猜你喜欢

转载自blog.csdn.net/linshuo1994/article/details/84373872